Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №1.doc
Скачиваний:
18
Добавлен:
22.03.2015
Размер:
156.67 Кб
Скачать

Пример простейшей программы на ассемблере

Ниже приведен исходный текст полностью законченной программы на ассемблере, выполняющей некоторые арифметические операции.

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. При этом каждый раз при изменении значений переменных в программе необходимо выполнять трансляцию и компоновку программы.