I am reading the ia-32
instruction format and found that ModR/M
is one byte if required, but how to determine if it is required, someone says it is determined by Opcode
, but how? I want to know the details, and is there some useful and authoritative documents which explain the details?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Intel's vol.2 manual has details on the encoding of operands for each form of each instruction. e.g. taking just the 8-bit operand size versions of the well-known add
instruction, which has 2 reg,rm forms ; a rm,immediate form ; and a no-ModRM 2-byte short for for 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.
And below that, the Instruction Operand Encoding ¶ table details what those I / MI / MR / RM codes from the Op/En (operand encoding) column above mean:
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
Notice that the "I" operand form doesn't mention a ModRM, so there isn't one. But MI does have one. (With the /r
field being filled in with the /0
from the 80 /0
in the opcode table.)
Notice that RM and MR differ only in whether the r/m operand (that can be memory) is the destination or source.