[Назад] [Далее] | |
В этом приложении приведены скорости выполнения всех команд процессоров Intel от 8086 до Pentium II и машинные коды, которые им соответствуют.
Команда может содержать до шести полей:
биты 7 – 6: поле MOD — режим адресации;
биты 5 – 3: поле R/O — либо указывает регистр, либо является продолжением кода команды;
биты 2 – 0: поле R/M — либо указывает регистр, либо совместно с MOD - режим адресации.
биты 7 – 6: S — коэффициент масштабирования;
биты 5 – 3: I — индексный регистр;
биты 2 – 0: В — регистр базы.
В кодах некоторых команд мы будем встречать специальные биты и группы бит, которые обозначим w, s, d, reg, sreg и cond:
w = 0, если команда работает с байтами;
w = 1, если команда работает со словами или двойными словами;
s = 0, если непосредственный операнд указан полностью;
s = 1, если непосредственный операнд — младший байт большего операнда и должен рассматриваться как число со знаком;
d = 0, если код источника находится в поле R/O, а приемника — в R/M;
d = 1, если код источника находится в поле R/M, а приемника — в R/O.
Запись 10dw будет означать, что код команды — 000100dw.
Поле reg определяет используемый регистр и имеет длину 3 бита:
000 — AL/AX/EAX/ST(0)/MM0
001 — CL/CX/ECX/ST(1)/MM1
010 — DL/DX/EDX/ST(2)/MM2
011 — BL/BX/EBX/ST(3)/MM3
100 — AH/SP/ESP/ST(4)/MM4
101 — CH/BP/EBP/ST(5)/MM5
110 — DH/SI/ESI/ST(6)/MM6
111 — BH/DI/EDI/ST(7)/MM7
Запись C8r будет означать 11001reg.
Поле sreg определяет используемый сегментный регистр:
000 — ES
001 — CS
010 — SS
011 — DS
100 — FS
110 — GS
Поле cond определяет условие для команд Jcc, CMOVcc, SETcc, FCMOVcc.
Его значения для разных команд:
0000 — О
0001 — NO
0010 — C/B/NAE
0011 — NC/NB/AE
0100 — E/Z
0101 — NE/NZ
0110 — BE/NA
0111 — NBE/A
1000 — S
1001 — NS
1010 — Р/РЕ
1011 — NP/PO
1100 — L/NGE
1101 — NL/GE
1110 — LE/NG
1111 — LNE/G
Запись типа 4сс будет означать 0100cond.
Поле R/O (биты 5 – 3) содержит либо дополнительные три бита кода команды, либо код операнда, который может быть только регистром. Будем обозначать второй случай reg, а в первом записывать используемые биты.
Поля MOD (биты 7 – 6) и R/M (биты 3 – 0) определяют операнд, который может быть как регистром, так и переменной в памяти:
MOD = 11, если используется регистровая адресация и R/M содержит код регистра reg;
MOD = 00, если используется адресация без смещения ([ВХ + SI] или [EDX]);
MOD = 01, если используется адресация с 8-битным смещением (variable[BX + SI]);
MOD = 10, если используется адресация с 16- или 32-битным смещением.
Значение поля R/M различно в 16- и 32-битных режимах.
R/M в 16-битном режиме:
000 — [ВХ + SI]
001 — [ВХ + DI]
010 — [BP + SI]
011 — [ВР + DI]
100 — [SI]
101 — [DI]
110 — [ВР] (кроме MOD = 00 — в этом случае после ModR/M располагается 16-битное смещение, то есть используется прямая адресация)
111 — [ВХ]
R/M в 32-битном режиме:
000 — [ЕАХ]
001 — [ЕСХ]
010 — [EDX]
011 — [ЕВХ]
100 — используется SIB
101 — [ЕВР] (кроме MOD = 00 — в этом случае используется SIB, после которого располагается 32-битное смещение)
110 — [ESI]
111 — [EDI]
Значение поля S:
00 — не используется;
01 — умножение на 2;
10 — умножение на 4;
11 — умножение на 8;
Значения полей I и В:
(I — регистр, используемый в качестве индекса, то есть умножающийся на S, В — регистр базы, который не умножается)
000 — ЕАХ
001 — ЕСХ
010 — EDX
011 — ЕВХ
100 — для I — индекса нет
для В — ESP
101 — для I — ЕВР
для В — ЕВР, только если MOD = 01 или 10, если MOD = 00 — базы нет
110 — ESI
111 — EDI
Поля ModR/M и SIB будут записываться как /r, если поле R/O содержит код регистра, или /0 – /7, если поле R/O содержит дополнительные три бита кода команды. В других случаях поля ModR/M и SIB отсутствуют только у команд без операндов, так что они не будут обозначаться дополнительно.