如何通过操作码确定是否需要ModR / M?

问题描述 投票:0回答:1

我正在阅读ia-32指令格式,发现ModR/M是一个字节,如果需要,但如何确定是否需要,有人说这是由Opcode决定,但如何?我想知道细节,是否有一些有用和权威的文件解释细节?

assembly x86 opcode machine-code instruction-set
1个回答
2
投票

英特尔的vol.2手册详细介绍了每种指令的每种形式的操作数编码。例如仅采用着名的add指令的8位操作数大小版本,该指令具有2个reg,rm形式;一个直接的形式;和add al, imm8的无ModRM 2字节短

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.

在此之下,指令操作数编码¶表详细说明了上述Op / En(操作数编码)列中的I / MI / MR / RM代码的含义:

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字段填写了操作码表中/080 /0。)

请注意,RM和MR的区别仅在于r / m操作数(可以是内存)是目标还是源。

© www.soinside.com 2019 - 2024. All rights reserved.