Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по Микропроцессорам_МИА.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Лабораторная работа №.3 Директивы equ, label, команды сложения и вычитания Директива equ

Эта директива определяет значение, которое можно использовать для подстановки в других командах. Директива не определяет элемент данных, она назначает имя какому-либо числу. Пусть в сегменте данных записана директива:

TIME EQU 20

Теперь в какой бы команде или директиве не использовалось бы слово TIME, ассемблер вместо него подставит значение 20.

Например, директиву

FIELD DB TIME DUP (?)

ассемблер преобразует в директиву

FIELD DB 20 DUP (?)

Другой пример:

CON EQU 70

...

MOV CX, CON ;это равносильно записи MOV CX, 70

Директива label

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

<имя> LABEL <тип>

В качестве типа фигурирует одно из ключевых слов: BYTE, WORD, DWORD, NEAR, FAR.

Пример:

BUFFER LABEL WORD

BUF DB 200 DUP(?)

Директива LABEL обычно применяется для присваивания второго имени некоторой ячейке памяти, с тем, чтобы к ней можно было бы обращаться командами, оперирующими различными типами данных. Если, например, одну и ту же область памяти в одном случае необходимо считать массивом байт, а в другом - массивом слов, то команда

MOV AL, BUF ;передает в аккумулятор AL первый байт массива,

MOV AX, BUFFER ;передает в аккумулятор AX первое слово массива.

Если бы директивы LABEL не было, для передачи в AX первого

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

Команды сложения и вычитания

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

Например:

ADD AL, DL ;содержимое регистра DL прибавляется к содержимому регистра AL и полученная сумма помещается в AL.

ADD AL, 3 ;содержимое регистра AL увеличивается на 3.

ADD AL, CATS ;к содержимому регистра AL добавляется содержимое байта памяти с адресом CATS.

ADD DX, [SI] ;к содержимому регистра DX прибавляется содержимое ;слова памяти, адрес которого содержится в регистре SI.

ADD [SI], AL ;содержимое байта памяти, адресуемое регистром SI, увеличивается на значение, хранящееся в регистре AL.

По команде вычитания SUB процессор вычитает второй операнд из первого и результат помещает в первый операнд. Например:

SUB AL, CATS

SUB DX, [SI]

SUB CATS+2, AH

Пример. Пусть в сегменте данных зарезервировано 5 слов со значениями: F501, 7136, 2122, 5711, 1246. Кроме того зарезервировано 10 байт без инициализации. Необходимо получить сумму 2, 5 и 8 байтов указанной последовательности слов. Младший байт результата нужно записать в третий байт последовательности байт. Затем из первого слова последовательности слов вычесть третье и результат записать в пятое слово последовательности байт.

Data segment

l1 label byte

l2 dw 0f501h, 7136h, 2122h, 5711h, 1246h

l3 label word

l4 db 10 dup(?)

data ends

assume cs:code, ds:data

code segment

start:

mov ax, data

;инициализация сегментного регистра

mov ds, ax;

mov ax, 0

;обнуление регистров: в ax накапливается

;сумма, cx вспомогательный регистр для

;представления считываемого байта как ;слова

mov cx, 0

mov al, l1+1

;в регистр аl второй байт последовательности слов

mov cl, l1+4

;в регистр сl пятый байт последовательности слов

add ax, cx;

;в ax сумма 2-го и 5-го байтов

mov cl, l1+7

;в cl 8-ой байт последовательности слов

add ax, cx

;в ax сумма 2-го, 5-го и 8-го байтов

mov l4+2, al

;младший байт результата заносится в 3-тий байт последовательности l4

mov ax, l2

;в ax заносится значение f501 - первое

;слово последовательности l2

sub ax, l2+4

;из первого слова последовательности вычитается третье. Результат заносится в ax

mov l3+8, ax

; результат вычитания записывается в

; пятое слово последовательности байт

ret

code ends

end start