assembly - 在括号中,什么是 *ALL* 可能的算术可能性?

  显示原文与译文双语对照的内容
0 0

我正在为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个字符分隔符 +-*

我想确保我得到所有的? division在这些 in? 或者 XOR/OR/AND/NOT?

时间: 原作者:

0 0

括号内的内容是地址表达式。 ,系列处理器支持某些地址操作,如有基 register,添加偏移量和 2,4或者 8. 有些汇编器允许将结构中的点引用作为基础偏移表达式的一部分。 除了计算基本偏移量外,括号内的'数学'不是在装配时完成的数学,而是在运行时计算的地址部分。

0 0

Maybe R/m 字节的表 is helpfull显示combination位和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

0 0

你需要阅读 Intel软件开发人员手册。 具体来说,第 3.7.5节"指定偏移量",它告诉我们有两种方法可以执行这样的操作:

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

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

或者,你可以查询各种disassemblers和模拟器的现有实现( 比如 。 distorm 或者其他项目以更方便的形式记录这里内容( 比如 。 corkami )

原作者:
0 0

查看位于Wikipedia页面底部的Intel手册,因为它应该包含所有的寻址模式,而且它将给你所有其他指令的外观和功能。

原作者:
...