Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник.docx
Скачиваний:
5
Добавлен:
26.11.2018
Размер:
54.24 Кб
Скачать

ОБОЗНАЧЕНИЕ РЕГИСТРОВ

________________________________________________________________

Команды, использующие регистр, могут содержать три бита, указывающих

на конкретный регистр, и один бит "w", определяющий размер регистра: байт

или слово. Кроме того, лишь некоторые команды обеспечивают доступ к

сегментным регистрам. На рис.25.1 показана полная идентификация регистров.

Рассмотрим команду MOV с однобайтовым непосредственным операндом:

MOV АН,00 10110 100 00000000

| |

w rеg = AН

__________________________________________________________________________

Основные, базовые и индексные регистры:

Биты: w = 0 w = 1

000 AL AX

001 CL CX

010 DL DX

011 BL BX

100 AH SP

101 CH BP

110 DH SI

111 BH DI

Биты: Сегментный регистр:

00 ES

01 CS

10 SS

11 DS

__________________________________________________________________________

Рис.25.1. Обозначение регистров

В данном случае первый байт машинного кода указывает на однобайтовый

размер (w = 0) и на регистр AН (100). Следующая команда MOV содержит

непосредственный двухбайтовый операнд:

MOV AX,00 10111 000 00000000 00000000

| |

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,