如何解读x86操作码映射?

时间:2015-02-22 23:46:54

标签: assembly x86 machine-code

查看x86操作码映射,例如:

http://www.mlsite.net/8086/#tbl_map1

它定义了映射,例如:

00: ADD Eb,Gb
01: ADD Ev,Gv
...

该链接具有字母含义的基本描述,例如:

  
      
  • E :操作码后面有一个ModR / M字节并指定操作数。操作数是通用寄存器或存储器地址。如果是存储器地址,则从段寄存器和以下任何值计算地址:基址寄存器,索引寄存器,位移。
  •   
  • b :字节参数。
  •   

但它有点过于模糊。你如何将其转化为完整的操作码" (整个指令+操作码中的args)? Haven还能够从Intel manuals中找到它,也许我在错误的地方找到它(并且它有点压倒性)?看到显示输入指令的输出操作码的片段(以及你是如何做到的)将会非常有用。

3 个答案:

答案 0 :(得分:10)

一定要使用intel手册。对于每条指令,它给出机器代码,第2章对指令格式有非常详细的描述。

但是为了给你一个演练,让我们看看ADD EDX, [EBX+ECX*4+15h]。 首先,我们通读章节2 INSTRUCTION FORMAT3.1 INTERPRETING THE INSTRUCTION REFERENCE PAGES,了解我们将会看到的内容。我们对3.1.1.3 Instruction Column in the Opcode Summary Table中列出的缩写特别感兴趣。

有了这些信息,我们转向描述ADD指令的页面,并尝试为我们要编码的那个指定适当的版本。我们的第一个操作数是一个32位寄存器,第二个是32位存储器位置,所以让我们看看它匹配的是什么。它将成为倒数第二行:03 /r ADD r32, r/m32。我们回到第3.1.1.1 Opcode Column in the Instruction Summary Table (Instructions without VEX prefix)章,看看那个神奇的/r是什么:Indicates that the ModR/M byte of the instruction contains a register operand and an r/m operand.

好的,Figure 2-1. Intel 64 and IA-32 Architectures Instruction Format向我们展示了指令的外观。到目前为止,我们知道我们没有任何前缀,操作码将是03,我们将使用至少一个modr / m字节。所以,让我们看看如何解决这个问题。看Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte。列表示寄存器操作数,行表示内存操作数。由于我们的注册是EDX,我们使用第3列。内存操作数为[EBX+ECX*4+15h],可使用8位或32位位移进行编码。要获得更短的代码,我们将使用8位版本,因此行[--][--]+disp8适用。这意味着我们的modr / m字节将是54

我们也需要一个SIB字节。这些列在Table 2-3. 32-Bit Addressing Forms with the SIB Byte中。由于我们的基数为EBX,因此我们使用第4列,[ECX*4]的行使我们的SIB字节为8B

最后,我们添加了8位位移字节,即15。因此,完整的指令是03 54 8B 15。我们可以使用汇编程序验证这一点:

2 00000000 03548B15                add edx, [ebx+ecx*4+15h]

答案 1 :(得分:1)

您正在查看一个操作码映射,该映射在该字节匹配的指令模式中转换操作码的第一个字节。如果您想了解指令字节的 rest ,您需要查看其他地方。

如果您查看ADD指令的页面,它会显示如下内容:

00 /r        ADD r/m8, r8

这告诉你00字节后跟一个ModR / M字节,其中包含寄存器字段中的寄存器r,该寄存器是一个8位寄存器,它是第二个操作数。 ADD指令(指令模式中的r8),而第一个操作数位于ModR / M字节的其余部分

现在,如果您查看ModR / M字节的文档,它会告诉您ModR / M字节有3个字段 - 一个2位' mod'字段,3位'寄存器/操作码'字段和3位' r / m'领域。然后,它给出了一个包含所有256个ModR / M字节值的表,记录了每种情况下字段的含义。该表(通常)被组织为32行,每列8列 - 将32行分成4组,每组8个,其中组对应于' mod'字段位和组内的行到' r / m'字段位,而列对应于'寄存器/操作码'场位。它是一个很奇怪的' mod'是前2位和' r / m'是'寄存器/操作码'的最后3位在中间,但它是有道理的' mod'和' r / m'位是紧密相关的,并且一起描述一个操作数,而“寄存器/操作码”是一个操作数。位完全独立,描述另一个操作数或是操作码的一部分。

答案 2 :(得分:0)

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 from Intel-Doku)
------------------------------------------
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