Руководство Intel по vol.2 содержит подробности о кодировании операндов для каждой формы каждой инструкции. например взятие только 8-битных версий размера операнда хорошо известной инструкции add
, которая имеет 2 формы reg, rm; rm, непосредственная форма; и не-ModRM 2-байтовое сокращение для add al, imm8
Opcode Instruction | Op/En | 64-bit Mode | Compat/Leg Mode | Description
04 ib ADD AL, imm8 | I | Valid Valid Add imm8 to AL.
80 /0 ib ADD r/m8, imm8 | MI | Valid Valid Add imm8 to r/m8.
00 /r ADD r/m8, r8 | MR | Valid Valid Add r8 to r/m8.
02 /r ADD r8, r/m8 | RM | Valid Valid Add r/m8 to r8.
И ниже, таблица кодирования операнда инструкции details подробно описывает, что означают эти коды I / MI / MR / RM из столбца Op / En (кодирование операнда) выше:
Op/En | Operand 1 | Operand 2 | Operand 3 Operand 4
RM | ModRM:reg (r, w) | ModRM:r/m (r) | NA NA
MR | ModRM:r/m (r, w) | ModRM:reg (r) | NA NA
MI | ModRM:r/m (r, w) | imm8/16/32 | NA NA
I | AL/AX/EAX/RAX | imm8/16/32 | NA NA
Обратите внимание, что в форме операнда "I" нет упоминания ModRM, поэтому его нет. Но у MI он есть. (С заполнением поля /r
/0
из 80 /0
в таблице кодов операций.)
Обратите внимание, что RM и MR отличаются только тем, является ли операнд r / m (который может быть памятью) адресатом или источником.