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

Формат машинной команды 32х разрядного процессора.

Формат машинной команды 32 разрядного процессора приведен на рис. 84.

Дадим пояснения к рисунку. Каждый прямоугольник обозначает поле. Сверху поля указано сколько байт может занимать это поле. Например, поле кода операций (КОП) занимает либо один, либо два байта. Любое из полей (кроме КОП) в конкретной команде может отсутствовать. Префиксы, если они есть, располагаются в младших байтах команды, а поле DATA (если оно есть) занимает старшие байты. Далее приведем назначения полей.

0/1

0/1

0/1

0/1

Префикс команды

Префикс размера операнда

Префикс размера адреса

Префикс замены сегмента

1/2

0/1

0/1

0/1/2/4

0/1/2/4

КОП

постбайт

SIB

Disp.

data

Рис. 84

Префикс команды. Это либо префикс rep, либо префикс lock. Их может ставить перед командой программист.

Префикс размера операнда. Вместе с битом D в дескрипторе, загруженном в теневую часть cs, определяет размерность используемых в команде операндов. Если этот префикс есть и D = 0 или если этого префикса нет и D = 1, команда работает с 32-х разрядными операндами. В двух противных случаях команда работает с 16-ти разрядными операндами. Префикс размера операнда имеет значение 66h.

Префикс размера адреса (67h). Аналогичен предыдущему префиксу, но определяет размерность ( 16-ти или 32- разрядный) вырабатываемого командой Аэф.

Префикс замены сегмента. Напрямую задает сегментный регистр, участвующий в формировании Аф. Например mov cs:[200h], al.

Отметим, что порядок следования префиксов значения не имеет, то есть например, префикс замены сегмента может стоять перед префиксом команды.

Код операции ( КОП ). Чаще всего это поле имеет размер один байт и имеет формат, приведенный на рис. 85

КОП

W

Рис. 85

Бит W определяет размерность операндов. При W =0 - 8-ми разрядный, при W = 1 - 16-ти или 32-х разрядный.

Постбайт имеет формат, приведенный на рис. 86.

Поля reg и r/m задают два операнда в двухоперандных командах. При этом поле reg задает операнд в регистре, а поле r/m - в регистре или в памяти. В однооперандных командах или в двухоперандных, где один операнд задан непосредственно ( в поле data), поле reg оказывается не нужным и используется для расширения кода операции. Если поле reg используется для задания операнда, то оно трактуется в соответствии с таблицей 16.

Рис. 86

Таблица 16

reg

w = 0

w = 1

000

AL

(E)AX

001

CL

(E)CX

010

DL

(E)DX

011

BL

(E)BX

100

AH

(E)SP

101

CH

(E)BP

110

DH

(E)SI

111

BH

(E)DI

Аналогично трактуется поле r/m при md = 11. При других значениях md вместе с r/m задает алгоритм формирования Аэф. При этом для 16-ти и для 32-х разрядного Аэф эти алгоритмы различны. Для 16-ти разрядного Аэф алгоритм его вычисления определяется в соответствии с таблицей 17.

Таблица 17

r/m

md = 00

md = 01

md = 10

000

BX+SI

BX+SI+disp8

BX+SI+disp16

001

BX+DI

BX+DI+disp8

BX+DI+disp16

010

BP+SI

BP+SI+disp8

BP+SI+disp16

011

BP+DI

BP+DI+disp8

BP+DI+disp16

100

SI

SI+disp8

SI+disp16

101

DI

DI+disp8

DI+disp16

110

disp16

BP+disp8

BP+disp16

111

BX

BX+disp8

BX+disp16

Здесь disp8 и disp16 соответственно 8-ми и 16-ти разрядное смещение, заданное в поле disp команды. Из таблицы следует, что допустима команда mov [bx], al и недопустимы команды mov [ax], cx и mov [si+di], dx.

Алгоритм формирования 32-х разрядного Аэф показан в таблице 18.

Б айт SIB имеет формат, представленный на рис. 87.

При наличии байта SIB Аэф рассчитывается по формуле:

Аэф = 2SCALE × INDEX + BASE + DISP

Таблица 18

r/m

md = 00

md = 01

md = 10

000

EAX

EAX+disp8

EAX+disp32

001

ECX

ECX+disp8

ECX+disp32

010

EDX

EDX+disp8

EDX+disp32

011

EBX

EBX+disp8

EBX+disp32

100

Аэф задается байтом SIB

SIB и disp8

SIB и disp32

101

disp32

EBP+disp8

EBP+disp32

110

ESI

ESI+disp8

ESI+disp32

111

EDI

EDI+disp8

EDI+disp32

Поле INDEX трактуется в соответствии с таблицей 19.

Таблица 19

000

EAX

001

ECX

010

EDX

011

EBX

100

нет индекса (scale = 0)

101

EBP

110

ESI

111

EDI

Поле BASE трактуется в соответствии с таблицей 20.

Таблица 20

000

EAX

001

ECX

010

EDX

011

EBX

100

ESP

101

особый случай

110

ESI

111

EDI

Особый случай: если md = 00, то в качестве BASE берется disp32 из поля disp, если md =01 или md = 10, то в качестве BASE берется содержимое EBP.

Из вышеизложенного видно, что в случае 32-х разрядного Аэф возможных вариантов команд значительно больше, чем при 16-ти разрядном Аэф (за счет байта SIB). Например возможна команда mov eax, [2*eax+eax+7]. В шестнадцатеричной системе счисления эта команда имеет следующее представление:

66 67 8B 44 40 07.

Здесь 66 - префикс размера операнда, 67 - префикс размера адреса, 8В - КОП, 44 - постбайт, 40 - SIB, 07 - disp8.

Назначение полей data и disp очевидно и не требует пояснений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]