Пример простейшей программы на ассемблере Ниже приведен исходный текст полностью законченной программы на ассемблере, выполняющей некоторые арифметические операции. CODE SEGMENT ; (1) определение программного сегмента ASSUME DS:CODE ; (2) Start: ; (4) точка входа в программу MOV AX, a ; (3) запись в AX значения переменной a MOV BX, b ; (4) запись в BX значения переменной b IMUL BX ; (5) умножение AX на BX ADD AX, c ; (6) добавление к переменной c значения ; (7) из AX MOV d, AX ; (8) запись значения AX в переменную d MOV AX, 4C00h ; (9) запись в AH номера функции DOS INT 21h ; (10) вызов функции DOS завершения ; (11) программы a DW 5 ; (12) определение переменной a b DW -7 ; (13) определение переменной b c DW 120 ; (14) определение переменной c d DW ? ; (15) определение переменной d CODE ENDS ; (16) конец программного сегмента END Start ; (17) определение точки входа в программу Программа выполняет вычисление значения выражения a * b + c и записывает результат в переменную d. После этого происходит завершение программы и передача управления операционной системе. В строке 1 определяется программный сегмент с именем “CODE”, в котором находятся команды программы и данные (переменные a, b, c, d). В строке 2 с помощью директивы ASSUME определяется, что при обращении к переменным программы будет использоваться сегментный регистр DS. В строке 3 в регистр AX записывается значение из переменной a, т. е. в регистр AX записывается число 5. В строке 4 в регистр BX записывается значение из переменной b, т. е. в регистр BX записывается число -7. В строке 5 значение регистра AX умножается на значение регистра BX и результат записывается в так называемую регистровую пару DX:AX, т. е. в регистр DX записывается старшая часть произведения двух 16-битных регистров (биты 16 – 31), а в регистр AX записывается младшая часть произведения (биты 0 – 15). При умножении операнды рассматриваются как числа со знаком. В строке 6 к младшей части произведения добавляется значение переменной c, т. е. значение регистра AX увеличивается на 120. В строке 8 значение регистра AX записывается в переменную d, т. е. в переменную d записывается значение выражения 5 * (-7) + 120. В строке 9 в регистр AH записывается номер функции DOS завершения программы 4Ch, а в регистр AL записывается код возврата 00h. В строке 10 вызывается функция DOS, номер которой был записан в регистре AH – это функция завершения программы и передачи управления операционной системе. После выполнения этой команды работа программы завершается. В строках 12 – 15 определяются переменные a, b, c, d и их начальные значения. Переменная d не инициализируется, так как в нее записывается результат. В строке 16 директивой ENDS закрывается программный сегмент с именем “CODE”. В строке 17 директивой END транслятору указывается точка входа в программу, на чем текст программы завершается. В правой части программы к каждой строке подписаны комментарии. Комментарий в языке ассемблера начинается с символа ‘;’ и продолжается до конца текущей строки. Для выполнения лабораторной работы необходимо: · открыть любой текстовый редактор (например, встроенный в программу-оболочку Norton Commander) и набрать текст программы на ассемблере. При наборе текста программы можно использовать следующий шаблон: CODE SEGMENT ASSUME CS:CODE ORG 100H Start: <команда1> <команда2> . . . CODE ENDS END Start После метки Start и до конца сегмента команд размещаются арифметические команды, необходимые для вычисления значения выражения. · Значения четырех переменных (a, b,c и d), участвующих в выражении, необходимо занести в четыре регистра общего назначения, например, AX, BX, CX и DX с использованием команды MOV. Значения переменных могут быть любыми, но среди них должны быть как положительные, так и отрицательные числа. · Оттранслировать программу с использованием транслятора Turbo Assembler. Для этого необходимо ввести в командной строке DOS следующую команду: TASM.EXE <имя_программы>, где имя_программы – имя файла программы с расширением .ASM, например «MyProg.asm». · Если в процессе трансляции транслятором были выданы ошибки, необходимо исправить текст программы и провести повторную трансляцию. В случае успешной трансляции в текущей директории должен появиться объектный файл с именем программы и расширением .OBJ, например «MyProg.obj». · Скомпоновать программу как COM, используя компоновщик Turbo Linker. Для этого необходимо ввести в командной строке DOS следующую команду: TLINK.EXE /t <имя_объектного_файла>, где имя_ объектного_файла – имя объектного файла программы с расширением .OBJ, например «MyProg.obj». · Если в процессе компоновки компоновщиком были выданы ошибки, необходимо исправить текст программы и провести повторную трансляцию и компоновку. В случае успешной компоновки в текущей директории должен появиться исполнительный файл с именем программы и расширением .COM, например «MyProg.com». · Загрузить программу в отладчик. Для этого необходимо ввести в командной строке DOS следующую команду: TD.EXE <имя_исполнительного_файла>, где имя_исполнительного_файла – имя исполнительного файла программы с расширением .COM, например «MyProg.com». · Проверить работу программы в пошаговом режиме. Для выполнения программы в пошаговом режиме используется клавиша F7. При этом при каждом нажатии клавиши F7 выполняется очередная команда программы. Для возвращения программы в исходное состояние нужно нажать комбинацию клавиш Ctrl+F12. · При контроле правильности работы программы после выполнения каждой команды требуется сверять результаты выполнения арифметических операций с тем, что должно получиться в результате выполнения конкретной арифметической операции. Правильность работы программы необходимо проверить для нескольких значений переменных a, b, c и d. При этом каждый раз при изменении значений переменных в программе необходимо выполнять трансляцию и компоновку программы. |