首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86 OpCode指令译码

x86 OpCode指令译码
EN

Stack Overflow用户
提问于 2014-10-28 11:41:59
回答 2查看 3.6K关注 0票数 4

我一直在研究软件开发人员手册的x86架构,试图刷我的反向工程技能。我知道这个体系结构是复杂的,并且与前几代人向后兼容。随着新一代的到来,一些旧的文档部分被忽略了。但其中一个令人不安的解释和错误解释是类似于这一种的指令:

代码语言:javascript
复制
80 /2 ib

因此,基于以下80 OpCode的指令后面跟着一个MOD/RM/REG字节。忽略旧内容的副作用之一是,我对MOD/RM/REG字节的不同版本一无所知。但我总是认为他们是不同的,因为建筑的根源是8/16位。谢天谢地,在最初引入该体系结构时,我无意中发现了对MOD/RM/REG字节的剖析。

因此,正如上面提供的指令,后面跟着斜杠数字,说明八进制值将包含在MOD/ RM /REG字节的RM偏移量中,这将是2的值。

我的实际问题如下:

MOD/RM/REG字节中的MOD偏移是否接受当前状态下的所有寻址模式,还是有任何强制限制?另一件事是,有人知道为什么数字是用/2指定的吗?这是否是一个理由,认为较低的值是使用在较老一代的ISA,从而保存为向后兼容性。

EN

回答 2

Stack Overflow用户

发布于 2014-10-28 12:19:34

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-10-28 12:44:08

你应该在手册中阅读第二章的指令格式。作为一个简短的总结,/digit符号使用modr/m字节的reg/opcode字段作为给定值的操作码扩展。手册上写着: reg/opcode字段指定一个寄存器号或另外三位操作码信息。另见表2-2.使用ModR/M Byte的32位寻址表单。

操作码扩展在没有第二个寄存器操作数的情况下使用,例如用于直接操作数,在您的示例中是ADC r/m8, imm8。其他指令有主操作码80,但扩展不同。你可以看看表A-6.按组号对一字节和两字节Opcode进行opcode扩展,并看到从0到7的操作码扩展分别对应于ADDORADCSBBANDSUBXORCMP

还请注意,modr/m,因此,这种编码方案也使用在32和64位代码,所以它不是什么过时的东西。例如,ADC [eax], 0x42有机器代码80 10 42,其中80是主要操作代码,10是reg字段中带有2并指定[eax]的modr/m,当然42是直接的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26607462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档