1

我正在为 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]

我必须解析的原因是转换E00x000000E0then 4to0x00000004

据我所知+, -, *are possible is \and or /possible too, 或者点怎么样?.?

我认为最好的方法是拆分包含括号的每条指令[]以获得内部数学。然后将内部数学拆分为 1 char delimiters +-*

我想确保我得到他们所有?有没有可能在这些中进行划分?或者不是 XOR/OR/AND/NOT 怎么样?

4

4 回答 4

3

也许这些用于构建 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
于 2014-02-01T10:10:09.007 回答
2

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

于 2011-10-12T23:44:01.423 回答
0

您需要阅读英特尔软件开发人员手册。具体来说,第 3.7.5 节“指定偏移量”告诉我们有两种方法:

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

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

或者,您可以查阅各种反汇编程序和模拟器的现有实现(例如distorm)或以更方便的形式记录此确切内容的其他项目(例如corkami

于 2014-02-01T10:29:24.033 回答
-1

查看位于Wikipedia 页面底部的 Intel 手册,因为它应该包含所有支持的各种寻址模式,此外它还会为您提供所有其他指令的外观和功能。

于 2011-10-13T00:24:09.820 回答