Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Программир на ассемблере.doc
Скачиваний:
8
Добавлен:
17.09.2019
Размер:
605.7 Кб
Скачать

7.6. Команды управления микропроцессором

Они делятся на две группы.

7.6.1. Команды управления состояниями отдельных флагов.

Команды CLC, CMC, STC выполняют соответственно сброс, инвертирование и установку в 1 флага CF. Их удобно применять с командами сдвига через перенос RCR и RCL.

Команды CLD и STD осуществляют сброс и установку флага направления DF. Состояние этого флага определяет авто декремент или авто инкремент индексных регистров SI и DI в цепочечных командах.

Команда CLI сбрасывает флаг прерываний IF и микропроцессор не распознает аппаратные прерывания на входе INT (маскируемые прерывания запрещены). Не маскируемые прерывания на входе NMI и программные прерывания микропроцессор распознает и соответственно реагирует на них.

Команда STI устанавливает флаг IF в 1, разрешая восприятие прерываний на входе INT.

7.6.2. Команды синхронизации микропроцессора с внешними событиями.

Команда HLT - останова заставляет микропроцессор перейти в состояние останова.

Команда WAIT - ожидания переводит микропроцессор в состояние ожидания, в котором он периодически через 5 тактов синхронизации проверяет сигнал на входе TEST. При появлении на входе активного уровня микропроцессор переходит к выполнению следующей за WAIT команды.

Команда LOCK - блокировка шины доступа к данным - запрещает другим процессорам одновременно изменять данные. LOCK представляет собой однобайтовый префикс, который можно кодировать непосредственно перед любой командой. Данная операция посылает сигнал в другой процессор, запрещая использование данных, пока не будет завершена следующая команда.

Команда ESC - переключение на сопроцессор - обеспечивает использование сопроцессора для выполнения специальных операций с плавающей точкой.

Команда NOP - нет операции - не производит никаких действий.

8. Примеры выполнения лабораторных работ

Пример 1. Вывести на экран свою фамилию, имя, отчество, номер группы с использованием отладчика DEBUG и прерываний МS DOS.

Программа на ассемблере:

MOV DX, 200h ; загрузка адреса данных в регистр DX

MOV AH, 09h ; запрос на вывод строки символов, заканчивающейся $, на дисплей

INT 21h ; прерывание MS DOS

INT 20h ; прерывание MS DOS - закончить программу

Данные:

Иванова Наталья Владимировна, студентка гр. 1-16-1

Чтобы начать работу необходимо:

1. Набрать DEBUG.

2. Нажать на клавишу <Enter>.

После запуска отладчика слева на экране появляется черта “-”, которая указывает на то, что отладчик ждет команду.

3. Ввести программу.

Программа располагается с адреса 100, а данные (символы в кодах ASCII) - с адреса 200.

Адрес Машинные Программа на

кода ассемблере

100 / ВА0002 MOV DX, 200 ; загрузка адреса данных

103 / B409 MOV AH, 09 ; запрос на вывод строки

105 / CD21 INT 21 ; прерывание 21 MS-DOS

107 / CD20 INT 20 ; прерывание 20 MS-DOS

Для ввода программы и данных необходимо использовать команду Е. Эта команда позволяет просматривать и изменять содержимое памяти вперед и назад.

Ввод команды редактирования:

Е <адрес> <Enter>

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

Затем необходимо набрать один из трех управляющих символов:

“пробел”, что означает переход к редактированию следующего байта;

<Enter>, что приведет к выходу из режима редактирования;

“-“. Нажатие этого знака приведет к переходу на редактирование предыдущего байта.

Для ввода программы необходимо набрать:

Е100 <Enter>,

а затем коды программы:

BA 00 02 B4 09 CD 21 CD 20 <Enter>

4. Проверить набранную программу.

Проверка правильности ввода программ осуществляется с помощью команды дизассемблирования U.

5. Ввести данные.

Данные (коды символов в 16-ой системе счисления):

Символ И в а н о в а Н а т а л ь я

Коды в 16-ой 88 A2 A0 AD AE A2 A0 20 20 8D A0 E2 A0 AB EC EF 20

Символ В л а д и м и р о в н а

Коды в 16-ой 82 AB A0 A4 A8 AC A8 E0 AE A2 AD AO 20

Символ с т у д е н т к а г р .

Коды в 16-ой E1 E2 E3 A4 A5 AD E2 AA A0 20 A3 E0 2E 20

Символ 1 - 1 6 - 1 $

Коды в 16-ой 31 2D 31 36 2D 31 24

Для ввода данных с адреса 200 необходимо набрать

E200 <Enter>,

а затем ASCII коды символов

88 A2 A0 AD AE A2 A0 20 20 8D A0 E2 A0 AB EC EF 20 82 AB A0 A4 A8 AC A8 E0 AE A2 AD A0 20 E1 E2 E3 A4 A5 AD E2 AA A0 20 A3 E0 2E 20 31 2D 31 36 2D 31 24 <Enter>

6. Проверить правильность ввода данных.

Проверка правильности ввода данных осуществляется с помощью команды D - просмотр дампа памяти.

D200 <Enter>

7. Выполнить программу.

Если программа и данные введены без ошибок, то необходимо выполнить программу с помощью команды G - запуск программы.

G <Enter>.

Отладчик выдает строку закодированных символов и сообщение о нормальном завершении:

Иванова Наталья Владимировна студентка гр. 1-16-1

Program terminated normally.

Пример 2. Подсчитать число символов в цепочке при следующем распределении функций регистров: SI является указателем и адресует текущий символ (байт) в цепочке; AH содержит код символа, идентифицирующего конец цепочки (например,символ NULL с нулевым кодом); CX является счетчиком символов.

Программа на ассемблере:

MOV CX,-1 ;Начальное значение -1

M: INC CX ;Увеличение счетчика (инкрементация)

INC SI ;Увеличение указателя - адреса символа

CMP AH,[SI-1] ;Сравнение с концом цепочки

JNZ M ;Проверка окончания цикла

Пример 3. Найти максимальное 8-битное беззнаковое число в массиве, адресуемом регистром SI. Регистр CX содержит число элементов в массиве. По окончании программы в регистре AL находится максимальное значение, а в регистре DX - его адрес в массиве. Сначала в качестве максимального числа принимается первый элемент массива, а затем с ним сравниваются следующие элементы. Если текущий элемент больше ранее найденного максимума, он замещает его в регистре AL, а адрес записывается в регистр DX.

Программа на ассемблере:

NEW: MOV AL,[SI] ;Загрузка максимума

MOV DX,SI ;Запись адреса максимума

NEXT: DEC CX ;Проверка окончания

JZ DONE ;поиска

INC SI ;Увеличение указателя-адреса символа

CMP AL,[SI] ;Сравнение с максимумом

JB NEW ;Новый максимум

JMP NEXT ;Продолжение поиска

DONE:

Пример 4. Найти максимальное число в массиве 16-битных знаковых чисел. Регистр SI адресует текущий элемент массива, а регистр CX содержит число слов в массиве. Сначала за максимум принимается число 8000h (-32768), а затем с ним сравниваются следующие слова массива и при необходимости производится замена максимума.

Программа на ассемблере:

MOV BX,8000h ;Загрузка первого максимума

MORE: MOV AX,[SI] ;Запись текущего элемента

CMP BX,AX ;Сравнение с максимумом

JGE NOEXC ;Переход, если заменять не нужно

MOV BX,AX ;Загрузка нового максимума

MOV DX,SI ;Запись адреса максимума

NOEXC: INC SI ;Увеличение указателя - адреса

INC SI ; слова массива

DEC CX ;Проверка окончания

JNZ MORE ;поиска

Пример 5. Найти сумму элементов массива данных, которые представлены 16-битными беззнаковыми целыми числами. Длина массива определяется переменной LENGTH, а начальный адрес массива находится в регистре DI. Сумма формируется в регистрах AX (младшее слово) и BX (старшее слово).

Программа на ассемблере:

XOR AX,AX ;Обнуление регистров

XOR BX,BX ;Обнуление регистров

MOV CX,LENGTH ; Запись длины массива в CX

MORE: ADD AX,[DI] ;Прибавление текущего элемента

JNC NOC ;Переход, если нет переноса

INC BX ;Если есть перенос, то увеличение BX

NOC: INC DI ;Увеличение указателя - адреса

INC DI ;слова массива

LOOP MORE ;Проверка окончания поиска

В данном примере команда LOOP MORE эффективно заменяет последовательность двух команд:

DEC CX ;Проверка окончания

JNZ MORE ;поиска