Лекции по Вычислительным машинам, системам и сетям   

3. Тридцатидвухразрядные процессоры фирмы Intel

3.28. Формат машинной команды

Формат машинной команды 32-разрядного процессора приведен на рис. 3.43. Каждый прямоугольник обозначает поле. Сверху поля указано, сколько байт может занимать это поле. Например, поле кода операций (КОП) занимает либо один, либо два байта. Любое из полей (кроме КОП) в конкретной команде может отсутствовать. Префиксы, если они есть, располагаются в младших байтах команды, а поле 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

Рис. 3.43

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

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

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

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

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

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

КОП W

Рис. 3.44

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

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

Рис. 3.45

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

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

Таблица 3.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

Таблица 3.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

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

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

Таблица 3.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

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

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

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

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

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

Рис. 3.46

Таблица 3.19

000

EAX

001

ECX

010

EDX

011

EBX

100

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

101

EBP

110

ESI

111

EDI

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

Из вышеизложенного видно, что в случае 32-разрядного Аэф возможных вариантов команд значительно больше, чем при 16-разрядном Аэф (за счет байта SIB).

Таблица 3.20

000

EAX

001

ECX

010

EDX

011

EBX

100

ESP

101

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

110

ESI

111

EDI

Например, возможна команда mov eax, [2*eax+eax+7]. В шестнадцатеричной системе счисления эта команда имеет следующее представление:

66 67 8B 44 40 07,

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



*****
© Банк лекций Siblec.ru
Формальные, технические, естественные, общественные, гуманитарные, и другие науки.