Директивы 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 |
Индивидуальные задания
Вариант 1.
Зарезервировать в сегменте данных:
1. 5 байт со значениями 88h, 234, 122, ab, fe , присвоить последовательности имя L1;
2. три слова без инициализации с именем L2;
3. 4 байта с именем L3 и значениями 11h, 55h, 44h, eeh. Обеспечить с помощью директивы LABEL доступ к этим байтам как к словам.
4. присвоить значению 250 имя L4.
Написать программу, в которой:
1. Получить сумму 1, 3, 5 байтов из последовательности с именем L1 и записать результат во 2 слово последовательности L2.
2. Полученный в п.1. результат сложить со значением L4, результат записать в 3 слово последовательности L2.
3. Содержимое 2 слова последовательности L2 вычесть из 3 слова этой последовательности, результат записать в первое слово.
4. Выполнить п.1., используя косвенную адресацию (см. примечание), результат записать по адресу L3.
Вариант 2.
Зарезервировать в сегменте данных:
1. 3 слова со значениями b88h, 1234h, e22h, присвоить последовательности имя M1. Обеспечить с помощью директивы LABEL доступ к этим словам как к байтам.
2. четыре байта без инициализации с именем М2;
3. присвоить значению 211 имя M3.
Написать программу, в которой:
1. Получить сумму 3 значений (каждого второго байта последовательности M1) и записать результат во 2 слово последовательности M2.
2. Получить сумму 2 и 3 слов последовательности M1, из которой вычесть значение M3, записать результат в 1 слово последовательности M2.
3. Получить сумму 2 и 3 байтов последовательности M2, записать результат (1байт) во 2 байт последовательности M1.
4. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 3.
Зарезервировать в сегменте данных:
1. цепочку символов "канитель" , присвоить последовательности имя Q1. Обеспечить с помощью директивы LABEL доступ к этим байтам как к словам.
2. четыре слова без инициализации с именем Q2;
3. присвоить значению 184 имя Q3.
Написать программу, в которой:
1. Получить сумму 2,3,4 слов последовательности Q1 и записать результат в 3 слово последовательности Q2.
2. Полученный в п.1. результат сложить с 1 байтом последовтельности Q1 и вычесть значение Q3, результат записать во 2 слово последовательности Q2.
3. Получить сумму 2 и 3 слов последовательности Q2, старший байт результата записать в 1 байт последовательности Q1, младший байт в 1 слово последовательности Q2.
4. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 4.
Зарезервировать в сегменте данных:
1. 8 байт со значениями 88h, присвоить последовательности имя T1. Обеспечить с помощью директивы LABEL доступ к этим байтам как к словам.
2. четыре слова, значение 1 слова равно cf1h, остальные слова не инициализировать, имя последовательности - T2;
3. Присвоить значению 232 имя T3.
Написать программу, в которой:
1. Записать во 2 слово последовательности T2 первое слово последовательности T1;
2. Получить сумму 3 значений: первых двух слов последовательности T2 и второго байта последовательности T1, результат записать в 3 слово последовательности T2.
3. Получить сумму 2 и 3 слов последовательности T2 и из результата вычесть значение T3, результат записать во 2 слово последовательности T1.
4. Выполнить п.2., используя косвенную адресацию (см. примечание).
Вариант 5.
Зарезервировать в сегменте данных:
1. три слова без инициализации и одно слово со значением 773fh, дать последовательности имя P1. Обеспечить с помощью директивы LABEL доступ к этим словам как к байтам .
2. цепочку символов "трек", присвоить последовательности имя P2.
3. присвоить значению 28Fh имя P3.
Написать программу, в которой:
1. Получить сумму 2,3,4 байтов последовательности P1 и записать результат во 2 слово последовательности P2.
2. Получить сумму второго и четвертого слов последовательности P1 и из результата вычесть значение P3, полученное значение записать: старший байт результата записать в старший байт 1 слова последовательности P1, младший байт - в младший байт третьего слова этой последовательности.
3. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 6.
Зарезервировать в сегменте данных:
1. 5 слов со значениями ABCD, 813F, 4567h, 8AFE, 71F1. Дать последовательности имя M1. Обеспечить с помощью директивы LABEL доступ к этим словам как к байтам.
2. цепочку символов "говорун" с именем М2;
3. Присвоить значению F86 имя M3.
Написать программу, в которой:
1. Получить сумму 7, 9 и 10 байтов последовательности M1. Записать результат во 2 слово последовательности M2.
2. Получить сумму 3 и 5 слов последовательности M1 ,из которой вычесть значение M3, Старший байт полученного значения записать в третий байт последовательности M2, а младший байт в шестой байт последовательности М1.
3. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 7.
Зарезервировать в сегменте данных:
1. 7 байт со значениями A8, F4, 22, ab, fe, -77. Присвоить последовательности имя L1;
2. два слова без инициализации с именем L2;
3. 4 байта с именем L3 и значениями 34h, AD, FC, eeh. Обеспечить с помощью директивы LABEL доступ к этим байтам как к словам.
4. присвоить значению 250 имя L4.
Написать программу, в которой:
1. Получить сумму 6, 3, 5 байтов из последовательности с именем L1 и записать результат в 1 слово последовательности L2.
2. Полученный в п.1. результат сложить со значением L4, результат записать в 1 слово последовательности L2.
3. Содержимое 2 слова последовательности L2 вычесть из 3 слова последовательности L1, результат записать в первое слово последовательности L1.
4. Выполнить п.1., используя косвенную адресацию (см. примечание), результат записать по адресу L3.
Вариант 8.
Зарезервировать в сегменте данных:
1. 4 слова со значениями C78h, FA4h, EE2h, 23453. Присвоить последовательности имя M1. Обеспечить с помощью директивы LABEL доступ к этим словам как к байтам.
2. четыре байта без инициализации с именем М2;
3. присвоить значению F231 имя M3.
Написать программу, в которой:
1. Получить сумму 3 значений (каждого второго байта последовательности M1) и записать результат во 2 слово последовательности M2.
2. Получить сумму 2 и 4 слов последовательности M1, из которой вычесть значение M3, записать результат во 2 слово последовательности M2.
3. Получить сумму 2 и 3 байтов последовательности M2, записать результат (1байт) в 5 байт последовательности M1.
4. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 9.
Зарезервировать в сегменте данных:
1. цепочку символов "терморегулятор", присвоить последовательности имя Q1. Обеспечить с помощью директивы LABEL доступ к этим байтам как к словам.
2. четыре слова без инициализации с именем Q2;
3. присвоить значению A841 имя Q3.
Написать программу, в которой:
1. Получить сумму 1, 3, 6 слов последовательности Q1 и записать результат в 3 слово последовательности Q2.
2. Полученный в п.1. результат сложить с 1 байтом последовательности Q1 и вычесть значение Q3, результат записать во 2 слово последовательности Q2.
3. Получить сумму 2 и 3 слов последовательности Q2, старший байт результата записать во 2 байт последовательности Q1, младший байт - в младший байт первого слова последовательности Q2.
4. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 10.
Зарезервировать в сегменте данных:
1. 3 байта со значением 133 и 5 байт со значением 88h. Присвоить последовательности имя T1. Обеспечить с помощью директивы LABEL доступ к этим байтам как к словам.
2. четыре слова, значение первого слова равно CF1h, остальные слова не инициализировать, имя последовательности - T2;
3. присвоить значению 2A5 имя T3.
Написать программу, в которой:
1. Записать во 2 слово последовательности T2 первое слово последовательности T1;
2. Получить сумму 3 значений: первых двух слов последовательности T2 и шестого байта последовательности T1, результат записать в 3 слово последовательности T2.
3. Получить 2 и 3 слов последовательности T2 и из результата вычесть значение Т3, результат записать в 4 слово последовательности T1.
4. Выполнить п.2., используя косвенную адресацию (см. примечание).
Вариант 11.
Зарезервировать в сегменте данных:
1. слово CFA2, два слова без инициализации и одно слово со значением 27CFh, дать последовательности имя P1. Обеспечить с помощью директивы LABEL доступ к этим словам как к байтам .
2. цепочку символов "история", присвоить последовательности имя P2.
3. присвоить значению 28Fh имя P3.
Написать программу, в которой:
1. Получить сумму 2, 4, 7 байтов последовательности P1 и записать результат в 3 слово последовательности P2.
2. Получить сумму первого и четвертого слов последовательности P1 и из результата вычесть значение P3, полученное значение записать: старший байт результата записать в старший байт 2 слова последовательности P1, младший байт - в младший байт третьего слова этой последовательности.
3. Выполнить п.1., используя косвенную адресацию (см. примечание).
Вариант 12.
Зарезервировать в сегменте данных:
1. 5 слов со значениями 6B8D, F13F, C127, 8ADE, 51F4. Дать последовательности имя M1. Обеспечить с помощью директивы LABEL доступ к этим словам как к байтам.
2. цепочку символов "солидарность" с именем М2;
3. присвоить значению F160 имя M3.
Написать программу, в которой:
1. Получить сумму 4, 7 и 9 байтов последовательности M1. Записать результат в третье слово последовательности M2.
2. Получить сумму 1 и 4 слов последовательности M1, из которой вычесть значение M3, Старший байт полученного значения записать в шестой байт последовательности M2, а младший байт в седьмой байт последовательности М1.
3. Выполнить п.1., используя косвенную адресацию (см. примечание).
Примечание.В случае косвенной адресации адрес слова (байта) находится в одном из регистров: BX, SI, DI.
Например:
MOV AX, [BX] ;в AX заносится слово, адрес которого содержится в регистре BX.
MOV AX, 2[BX] ;равносильно MOV AX, [BX+2], в AX заносится слово, адрес которого на 2 байта больше адреса, содержащегося в регистре BX.
ADD AX, 3[BX] ;добавить к содержимому AX слово, адрес
;которого на 3 байта больше адреса, содержащегося в регистре BX.
SUB AX, 4[BX] ;вычесть из AX слово, адрес которого на 4 байта больше ;адреса, содержащегося в регистре BX
Лабораторная работа № 4