Тема 11. Връзка на асемблер с езиците от високо ниво



Дата25.07.2016
Размер41.31 Kb.

Тема 11. Връзка на асемблер с езиците от високо ниво


Пакетът MASM има вградени средства, визуално приближаващи написаната програма до програмите на езиците от високо ниво. Тези директиви за формиране на конструкции са аналогични на условните и циклическите оператори на езиците от високо ниво: .IF, .ELSE, .ELSEIF, .ENDIF, .REPEAT, .UNTIL, .WHILE, .ENDW, .BREAK, .CONTINUE. Всички директиви са предшествани от символа точка. Използването на дадените конструкции може да се препоръчва с цел повишаване надежността на кода. Програмистът на асемблер така повишава логическото ниво на контролируемите синтактични конструкции, намалява вероятността от логически грешки, като ускорява процеса на разработката.

Писането на асемблер на обемни програми е слабата страна на езика. Разбира се, това не винаги е необходимо. Ако програмата не е предназначена за решаване на някакви системни задачи, изискващи максимално ефективно използване ресурсите на компютъра, ако към нея няма специални изисквания за размера и времето за изпълнение, тогава е уместно да се избере един от езиците на високо ниво. Съществува и трети вариант: да се комбинират програмите на високо ниво с код на асемблер. Последното обикновено се използва в случай, че във вашата програма има фрагменти, които или не е възможно да бъдат реализирани без асемблер или асемблер може значително да подобри ефективността на програмата.

Повечето компилатори отчитат възможността за комбиниране на кода с асемблер. Механизмите им за връзка с асемблер обикновено са идентични. Единствено условие за изпълнение е уточняването в документацията на езика необходимите параметри за връзка и особеностите, свързани с организацията на връзката с кода на асемблер. Не съществуват универсални препоръки по този въпрос.

Съществуват два варианта за комбиниране на програми на езици от високо ниво и асемблер:



              • Използване на оператори от тип inline и модул на асемблер за вграждане. Този вариант в значителна степен зависи от синтаксиса на езика от високо ниво и от конкретния компилатор. Тук се предполага, че асемблерните кодове са във вид на команди на асемблер или директно машинни команди и се вграждат в текста на програмата, написана на език от високо ниво. Компилаторът на езика разпознава командите (машинния код), като такива на асемблер и без изменения ги включва във формирания от него обектен код. Този вариант е удобен, когато се налага вмъкване на неголям фрагмент.

              • Използване на външни процедури и функции. Този вариант е по-универсален за комбиниране. Той притежава следните предимства:

                • Писането и дебъгването на програмите може да става независимо;

                • Написаните подпрограми могат да се използват в други проекти;

                • Облекчава се модифицирането и съпровождането на програмите в течение на жизнения цикъл на проекта.



Тема 12. Преобразуване на числата


Компютърът възприема само тези типове данни, които се поддържат от неговата система от команди. На практика често възниква необходимост от преобразуване на данните от едно представяне в друго.

Данните, въвеждани от конзолата и извеждани към нея, се кодират от операционната система в съответствие с текущата таблица за кодиране. В ASCII таблицата всеки символ се кодира с един байт. Команди за аритметична обработка на числа в символен вид няма. Вижда се, че е необходимо преобразуване на символната информация във формат, поддържан от машинните команди. След такова преобразование се изпълняват необходимите изчисления и пак се преобразува резултата обратно в символен вид, за да може да се изобрази информацията на монитора.

По-рано разгледахме задача за преобразуване на шестнайсетично число (двуцифрено), въведено от конзолата в двоичен вид (в AL). След изпълнението на тази процедура полученото число може да се използва като операнд в двоични аритметични операции.

При въвеждане на десетично цяло число от клавиатурата, например: ___1207 с помощта на функцията на MS DOS 09 в буфера за въвеждане от програмата ще бъде записан ред от символи:

1207’, CR

или последователност от байтове (ASCII кодове):



. . . 20h, 20h, 20h, 31h, 32h, 30h, 37h, 0Dh. . .

За запис на това число в регистър или в паметта за по-следващи изчисления е необходимо то да се преобразува от ASCII формат в двоичен код (ASCII to BIN). За целта е необходимо да се изпълнят следните операции:



                Да се намери първата значеща цифра, т. к. пред цифрите може да има интервали (Space, 20H) и знаци ‘+’ или ‘–’;

                Да се преобразуват всички ASCII кодове в неопакован десетичен формат:



. . . 20h, 20h, 20h, 01h, 02h, 00h, 07h, 0Dh. . .

За целта е необходимо от всеки код в диапазона 30h – 39h да се извади кода на цифрата ‘0’ (30h);



AX=0000
1-ви байт 01 AX=AX*10= 0000

AX=AX+0001= 0001
2-ри байт 02 AX=AX*10= 0010

AX=AX+0002= 0012
3-ти байт 00 AX=AX*10= 0120

AX=AX+0000= 0120
4-ти байт 07 AX=AX*10= 1200

AX=AX+0007= 1207
5-ти байт 0D не е цифра край

При обратното преобразование на двоичното число във ред от ASCII символи, очевидно, следва да се приложат всички операции в обратен ред:



                Да се смени знака на числото, ако то е отрицателно.

                Да се раздели числото на 10



AX = 1207

AX = AX / 10 AL  120 = 78h

AH 7 = 07h

Командата за деление на дума на байт е DIV R8.

Делимото в AX, в резултатът от делението: частното в AL, остатъка в AH.

Командата за деление на двойна дума на дума: DIV R16.

Делимото е в DX:AX, в резултат от делението частното е в AX, остатъка в DX.


                Остатъкът (в AH или в AX) да се преобразува в ASCII код.

AH =07h AH = AH+30h = 37h

                ASCII кодът да се запише в паметта (буфер за извеждане), придвижването трябва да бъде отдясно наляво.

                Ако частното в AX не е равно на нула, преход към т. 2. Иначе да се допише ‘–’ ако числото е било отрицателно.



Както при взаимното преобразуване между различните формати на вътрешното представяне на числата, така и при обмен с конзолата се реализира преобразуване на целочислените числа съобразно вътрешното им представяне в компютъра. Това важи и за числата с плаваща запетая.




База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница