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

Глава 25 Справочник по командам языка Ассемблер

__________________________________________________________________________

Ц е л ь: описать набор команд Ассемблера и объяснить их машинные

коды.

ВВЕДЕНИЕ

________________________________________________________________

В данной главе приведены объяснения машинных кодов и перечислены в

алфавитном порядке символические коды команд с указанием их назначений.

Многие специфические команды имеют однобайтовые машинные коды,

например:

Объектный код: Символические команды:

40 Inc ax ;Увеличение ax на 1

50 Push ax ;Запись aх в стек

С3 RET (short) ;Короткий возврат из процедуры

CB RET (far) ;Длинный возврат из процедуры

FD STD ;Остановка флага направления

Ни одна из перечисленных команд не использует прямой адресации

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

регистр, регистровую пару или адрес памяти, требуют более сложного

машинного кода.

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

________________________________________________________________

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

на конкретный регистр, и один бит "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,