汇编括号中* ALL *可能的算术可能性是什么?

时间:2011-10-12 23:36:36

标签: assembly x86 addressing-mode

我正在为C代码模拟器制作一个x86 asm ..对于我的解析器,我可以解析括号

QWORD PTR []

DWORD PTR []

WORD PTR []

BYTE PTR []

MOV X, []

LEA X, []

现在我会忽略..

MMWORD PTR[]

XMMWORD PTR[]

FWORD PTR []

TBYTE PTR []

我想知道什么是可以放在方括号中的所有可能的数学运算

我遇到的最复杂的是...... [EBP+ECX*4-E0]

我必须解析的原因是将E0转换为0x000000E0然后将4转换为0x00000004

据我所知+-*可能\/也可能,或点数如何? .

我想要分割包含括号[]的每条指令以获得内部数学的最佳方法。 然后将内部数学拆分为1个字符分隔符+-*

我想确保我得到所有这些?在这些是可能的分裂吗?或者不是XOR / OR / AND / NOT怎么样?

4 个答案:

答案 0 :(得分:2)

括号内的是地址表达式。 Intel x86系列处理器支持某些地址操作,例如具有基址寄存器,添加偏移量以及使用2,4或8进行缩放。某些汇编器允许对结构中的字段进行虚线引用,作为基本偏移表达式的一部分。除了计算基本偏移量之外,括号内的“数学”不是在汇编时进行数学运算,而是在运行时计算指令的地址部分的编码。

答案 1 :(得分:2)

这些用于构建Mod R / M-Byte的表可能有助于显示使用16位和32位基址和索引寄存器构建地址的组合。

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

MM  - Memeory addressing mode
RRR - Register operand address
MMM - Memoy 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 :(得分:0)

您需要阅读Intel Software Developer Manuals。具体来说,第3.7.5节“指定偏移量”,它告诉我们有两种方法:

  • 一般表格Base + (Index * Scale) + Displacement
  • 相对于IP:RIP + Displacement(仅限64位模式)

然后,检查指令集引用以找出每条指令的可能性。

或者,您可以参考各种反汇编程序和模拟器的现有实现(例如distorm)或以更方便的形式记录这一事实的其他项目(例如corkami

答案 3 :(得分:-1)

查看位于Wikipedia page底部的英特尔手册,因为它应包含所有支持的各种寻址模式,并且它将为您提供所有其他指令的外观和功能。