我正在阅读ia-32
指令格式,发现ModR/M
是一个字节(如果需要),但是如何确定是否需要,有人说它是由Opcode
确定的,但是怎么样?我想知道细节,是否有一些有用的权威性文件解释这些细节?
答案 0 :(得分:2)
Intel的vol.2手册详细介绍了每种指令的每种形式的操作数编码。例如仅采用著名的add
指令的8位操作数大小版本,该指令具有2个reg,rm形式; rm,立即表格;和arr
add al, imm8
在此之下,指令操作数编码¶表详细说明了上面Op / En(操作数编码)列中的那些I / MI / MR / RM代码的含义:
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.
请注意,“ I”操作数形式未提及ModRM,因此没有之一。但MI确实有一个。 (在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
字段中填充了操作码表中/r
的{{1}}。)
请注意,RM和MR的区别仅在于r / m操作数(可以是内存)是目的地还是源。