
- •I.Общие теоретические положения Средства компиляции программ на ассемблере и примеры их использования
- •Исполнительный файл типа com
- •Исполнительный файл типа exe
- •Использование транслятора Turbo Assember
- •Использование компоновщика Turbo Linker
- •II. Лабораторный практикум
- •Пример простейшей программы на ассемблере
- •Задание на лабораторную работу
- •Варианты заданий на лабораторную работу
- •Контрольные вопросы
Пример простейшей программы на ассемблере
Ниже приведен исходный текст полностью законченной программы на ассемблере, выполняющей некоторые арифметические операции.
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. При этом каждый раз при изменении значений переменных в программе необходимо выполнять трансляцию и компоновку программы.