| |
w reg = AX
Первый байт машинного кода указывает на размер в одно слово (w=1) и на
регистр AХ (000). Не следует обобщать приведенные примеры, так как
указание регистра и бита w может быть в различных позициях кода.
БАЙТ СПОСОБА АДРЕСАЦИИ
________________________________________________________________
Байт способа адресации, если он присутствует, занимает второй байт
машинного кода и состоит из следующих трех элементов:
1) mod - двухбитового кода, имеющего значения 11 для ссылки на
регистр и 00, 01 и 10 для ссылки на память;
2) reg - трехбитового указателя регистра;
3) r/m - трехбитового указателя регистра или памяти (r -
регистр, m - адрес памяти).
Кроме того, первый байт машинного кода может содержать бит "а",
который указывает направление потока между операндом 1 и операндом 2.
Рассмотрим пример сложения содержимого регистра АХ с содержимым
регистра BX:
ADD BX,AX 00000011 11 011 000
dw mod reg r/m
В этом примере d=1 означает, что mod (11) и reg (011) описывают
операнд 1, а r/m (000) описывает операнд 2. Так как бит w=1, то размер
равен одному слову. Таким образом, команда должна прибавить AX (OOQ) к BХ
(011).
Второй байт команды в объектном коде указывает большинство способов
адресации памяти. В следующем разделе способы адресации будут подробно
рассмотрены.
Биты MOD
----------
Два бита mod определяют адресацию регистра или памяти. Ниже
поясняется их назначение:
00 биты г/m дают абсолютный адрес, байт смещения (относительный
адрес) отсутствует;
01 биты г/m дают абсолютный адрес памяти и имеется один байт
смещения;
10 биты г/m дают абсолютный адрес и имеется два байта смещения;
11 биты г/m определяют регистр. Бит w (в байте кода операции)
определяет ссылку на восьми- или шестнадцатибитовый регистр.
Биты REG
----------
Три бита reg (вместе с битом w) определяют конкретный восьми- или
шестнадцатибитовый регистр.
Биты R/M
----------
Три бита г/m (регистр/память) совместно с битами mod определяют
способ адресации, как показано на рис.25.2.
__________________________________________________________________________
r/m mod=00 mod=01 mod=10 mod=1.1 mod=11
w=0 w=1
000 BX+SI BX+SI+disp BX+SI+disp AL AX
001 BX+DI BX+DI+disp BX+DI+disp CL CX
010 BP+SI BP+SI+disp BP+SI+disp DL DX
011 BP+DI BP+DI+disp BP+DI+disp BL BX
100 SI SI+disp SI+disp AH SP
101 DI DI+disp DI+disp CH BP
110 Direct BP+disp BP+disp DH SI
111 BX BX+disp BX+disp BH DI
__________________________________________________________________________
Рис.25.2. Биты r/m
ДВУХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Рассмотрим пример сложения содержимого регистров BХ и AХ:
ADD BX,AX 0000 0011 11 011 000
dw mod reg r/m
d 1 означает, что биты reg и w описывают операнд 1 (BХ), а биты
mod, r/m и w - Операнд 2 (AХ);
w 1 определяет размер регистров в одно слово,
mod 11 указывает, что операнд 2 является регистром;
reg 011 указывает, что операнд 1 является регистром BХ;
r/m 000 указывает, что операнд 2 является регистром AX.
Рассмотрим пример умножения регистра AL на регистр BL:
MUL BL 11110110 11 100 011
w mod reg r/m
Команда MUL предполагает, что регистр AL содержит множимое. Размер
регистра равен одному байту (w = 0), mod указывает на регистровую
операцию, г/m = 011 указывает на регистр BL. В данном случае reg = 100 не
имеет смысла.
ТРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Следующая команда MOV генерирует три байте машинного кода:
MOV mem,AX 10100001 dddddddd dddddddd
Для команды пересылки из регистра AХ или AL необходимо знать, сколько
байтов участвует в операции: один или два. В данном примере w = 1 означает
слово, следовательно, предполагается 16-битовый регистр AХ. Использование
во втором операнде регистра AL приведет к значению бита w = 0. Байты 2 и 3
содержат относительный адрес памяти. Команды, использующие регистры АХ или
AL, часто генерируют более эффективный (короткий) машинный код.
ЧЕТЫРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Рассмотрим пример умножения регистра AL на значение в памяти.
Процессор предполагает, что множимое находится в регистре AL для
однобайтового умножения и в регистре AХ для Двухбайтового умножения:
MUL mem_byte 11110110 00 100 110
w mod reg r/m
Для данной команды reg всегда имеет значение 100, mod = 00 указывает на
операцию с памятью, a r/m=110 - на прямой способ адресации. Машинная
команда также содержит два следующих байта, определяющих относительный
адрес памяти.
Рассмотрим еще один пример, иллюстрирующий команду LEA, которая
всегда специфицирует двухбайтовый адрес:
LEA DX,mem 10001101 00 010 110
LEA mod rеg r/m
Reg =010 означает регистр DX. Mod =00 и r/m=110 определяют прямой
способ адресации памяти. В следующих двух байтах содержится относительный
адрес.
КОМАНДЫ В АЛФАВИТНОМ ПОРЯДКЕ
________________________________________________________________
В данном разделе представлен набор команд Ассемблера в алфавитном
порядке. Некоторые команды, например сдвиг и циклический сдвиг, для
краткости сгруппированы. Ряд специальных команд для процессоров 80186,
80286 и 80386 выходят за рамки данной книги и поэтому в данной главе также
отсутствуют. При пояснении команд и способов адресации используются
следующие сокращения:
addr адрес памяти;
addr-high первый байт адреса (старший);
addr-low левый (младший) байт. адреса;
data непосредственный операнд (8 бит при w=0 и 16 бит при w= 1);
data-high правый (старший) байт непосредственного операнда;
data-low левый (младший) байт непосредственного операнда;
disp смещение (относительный адрес);
rеg ссылка на регистр.
AAA: Коррекция ASCII-формата для сложения
-------------------------------------------
О п е р а ц и я: Корректирует сумму двух ASCII-байтов в регистре AL.
Если правые четыре бита регистра AL имеют значение больше 9 или флаг AF
установлен в 1, то команда AAA прибавляет к регистру АН единицу и
устанавливает флаги AF и CF. Команда всегда очищает четыре левых бита в
регистре AL.
Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF, PF, SF и
ZF не определены).
О б ъ е к т н ы й к о д: 00110111 (без операндов).
AAD: Коррекция ASCII-формата для деления
------------------------------------------
О п е р а ц и я: Корректирует ASCII-величины для деления. Команда AAD
используется перед делением неупакованных десятичных чисел в регистре AХ
(удаляет тройки ASCII-кода). Эта команда корректирует делимое в двоичное
значение в регистре AL для последующего двоичного деления. Затем умножает
содержимое регистра AН на 10. прибавляет результат к содержимому регистра
AL и очищает AН. Команда AAD не имеет операндов.
Ф л а г и: Команда воздействует на флаги PF, CF, ZF (флаги AF CF и OF
не определены).
О б ъ е к т н ы й к о д: |11010101|00001010|.
AAМ: Коррекция ASCII-формата для умножения
--------------------------------------------
О п е р а ц и я: Команда AAM используется для коррекции результата
умножения двух неупакованных десятичных чисел. Команда делит содержимое
регистра AL на 10, записывает частное в регистр AН, а остаток в регистр
AL.
Ф л а г и: Команда воздействует на флаги PF, SF и ZF (флаги AF CF и
OF не определены).
О б ъ е к т н ы й к о д: |11010100|00001010| (без операндов).
AAS: Коррекция ASCII-формата для вычитания
--------------------------------------------
О п е р а ц и я: Корректирует разность двух ASCII-байтов в регистре
AL. Если первые четыре бита имеют значение больше 9 или флаг CF установлен
в 1, то команда AAS вычитает 6 из регистра AL и 1 из регистра АН, флаги AF
и CF при этом устанавливаются в 1. Команда всегда очищает левые четыре
бита в регистре AL.
Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF PF SF и ZF
не определены).
О б ъ е к т н ы й к о д: 00111111 (без операндов).
ADC: Сложение с переносом
---------------------------
О п е р а ц и я: Обычно используется при сложении многословных
величин для учета бита переполнения в последующих фазах операции. Если
флаг CF установлен в 1, то команда ADC сначала прибавляет 1 к операнду 1.
Команда всегда прибавляет операнд 2 к операнду 1, аналогично команде ADD.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (три формата):
Регистр плюс регистр или память:
|000100dw|modregr/m|
Регистр АХ (AL) плюс непосредственное значение:
|0001010w|-- data--|data, если w=1|
Регистр или память плюс непосредственное значение:
y100000sw|mod010r/m|--data--|data, если sw=01|
ADD: Сложение двоичных чисел
------------------------------
О п е р а ц и я: Прибавляет один байт или одно слово в памяти,
регистре или непосредственно к содержимому регистра или прибавляет один
байт или слово в регистре или непосредственно к памяти.
Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
О б ъ е к т н ы й к о д (три формата):
Регистр плюс регистр или память:
|000000dw|modregr/rm|
Регистр AX (AL) плюс непосредственное значение:
|0000010w|--data--|data, если w=1|
Регистр или память плюс непосредственное значение:
|100000sw|mod000r/m|--data--|data, если BW=01|
AND: Логическое И
-------------------
О п е р а ц и я: Команда выполняет поразрядную конъюнкцию (И) битов
двух операндов. Операнды представляют собой одно- или двухбайтовые
величины в регистре или памяти. Второй операнд может содержать
непосредственные данные. Команда AND проверяет два операнда поразрядно.
Если два проверяемых бита равны 1, то в первом операнде устанавливается
единичное значение бита, в других случаях - нулевое. См. также команды OR,
XOR и TEST.
Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF
не определен).
О б ъ е к т н ы й к о д (три формата):