x86操作码指令解码

4

我一直在研究x86架构的软件开发手册,试图提高我的反向工程技能。我知道这个架构很复杂,并且向后兼容以前的几代。随着新一代的出现,一些旧的文档部分被遗漏了。但是有些指令的解释和解读是令人困扰的,就像这个:

80 /2 ib

以下基于80操作码的指令将会被一个MOD/RM/REG字节跟随。忽略旧内容的一个副作用是,我对不同版本的MOD/RM/REG字节毫不知情。但我总是认为由于架构根源是8/16位,它们之间存在差异。幸运的是,在架构最初引入时,我偶然发现了MOD/RM/REG字节的解析。
因此,像上面提供的指令后面跟着斜杠数字的指令表示,MOD/RM/REG字节中RM偏移量包含的八进制值将是2
我的实际问题如下:
在当前情况下,MOD/RM/REG字节中的MOD偏移量是否接受所有寻址模式,还是有任何强制限制?
另一件事是,有没有人知道为什么数字被指定为/2?这是否意味着在老一代ISA中使用较低的值,并因此保留向后兼容性。

/2 指的是 ModRM 字节中的 reg 字段的值。reg 字段的大小为 3 位(位 3 到位 5)。在 AMD 手册第三卷中:/n A ModRM-byte reg field or SIB-byte base field, where n is a value between zero (binary 000) and 7 (binary 111). ib 表示立即字节。在 16 位代码中,80 00 00add byte [bx+si], 0x080 08 00or byte [bx+si], 0x0,**80 10 00adc byte [bx+si], 0x0**,80 18 00sbb byte [bx+si], 0x080 20 00and byte [bx+si], 0x080 28 00sub byte [bx+si], 0x080 30 00xor byte [bx+si], 0x0,而 80 38 00cmp byte [bx+si], 0x0 - nrz
你可能想要查看AMD和Intel的手册。[AMD的手册](http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/) AMD卷3 pdf的直接链接 Intel的手册 Intel组合卷的直接链接pdf - nrz
2个回答

2
Instruction Prefix                0 or 1 Byte
Address-Size Prefix               0 or 1 Byte
Operand-Size Prefix               0 or 1 Byte
Segment Prefix                    0 or 1 Byte
Opcode                            1 or 2 Byte
Mod R/M                           0 or 1 Byte
SIB, Scale Index Base (386+)      0 or 1 Byte
Displacement                      0, 1, 2 or 4 Byte (4 only 386+)
Immediate                         0, 1, 2 or 4 Byte (4 only 386+)

Format of Postbyte(Mod R/M byte from Intel-manual)
--------------------------------------------------
MM RRR MMM

MM  - Memory addressing mode
RRR - Register operand address
MMM - Memory operand address

RRR Register Names
Filds  8bit  16bit  32bit
000    AL     AX     EAX
001    CL     CX     ECX
010    DL     DX     EDX
011    Bl     BX     EBX
100    AH     SP     ESP
101    CH     BP     EBP
110    DH     SI     ESI
111    BH     DI     EDI

---

16bit memory (No 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
100   DS       [SI]      [SI+o8]     [SI+o16]
101   DS       [DI]      [DI+o8]     [SI+o16]
110   SS       [o16]     [BP+o8]     [BP+o16]
111   DS       [BX]      [BX+o8]     [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

32bit memory (Has 67h 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [EAX]     [EAX+o8]    [EAX+o32]
001   DS       [ECX]     [ECX+o8]    [ECX+o32]
010   DS       [EDX]     [EDX+o8]    [EDX+o32]
011   DS       [EBX]     [EBX+o8]    [EBX+o32]
100   SIB      [SIB]     [SIB+o8]    [SIB+o32]
101   SS       [o32]     [EBP+o8]    [EBP+o32]
110   DS       [ESI]     [ESI+o8]    [ESI+o32]
111   DS       [EDI]     [EDI+o8]    [EDI+o32]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

---

SIB is (Scale/Base/Index)
SS BBB III
Note: SIB address calculated as:
<sib address>=<Base>+<Index>*(2^(Scale))

Fild   Default Base
BBB    Sreg    Register   Note
000    DS      EAX
001    DS      ECX
010    DS      EDX
011    DS      EBX
100    SS      ESP
101    DS      o32        if MM=00 (Postbyte)
SS      EBP        if MM<>00 (Postbyte)
110    SS      ESI
111    DS      EDI

Fild  Index
III   register   Note
000   EAX
001   ECX
010   EDX
011   EBX
100              never Index SS can be 00
101   EBP
110   ESI
111   EDI

Fild Scale coefficient
SS   =2^(SS)
00   1
01   2
10   4
11   8

2
你应该已经阅读了手册中的第二章指令格式。简单概括一下,/digit符号使用modr/m字节的reg/opcode字段作为给定值的操作码扩展。手册上说:“reg/opcode字段指定寄存器编号或三个额外的操作码信息。”另请参见“表2-2.带有ModR/M字节的32位寻址形式”。当没有第二个寄存器操作数时(例如在你的示例中的ADC r/m8, imm8),会使用操作码扩展。还有其他主操作码为80但扩展不同的指令。可以查看“表A-6.按组号划分的单字节和双字节操作码的操作码扩展”,并且可以看到从0到7的操作码扩展分别对应于ADD、OR、ADC、SBB、AND、SUB、XOR、CMP。此外,请注意modr/m和因此此编码方案也用于32位和64位代码,因此它不是过时的东西。例如,“ADC [eax], 0x42”的机器码是“80 10 42”,其中80是主操作码,10是具有2的寄存器字段并指定[eax]的modr/m,当然42是立即数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接