我正在为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怎么样?
答案 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
RIP + Displacement
(仅限64位模式)然后,检查指令集引用以找出每条指令的可能性。
或者,您可以参考各种反汇编程序和模拟器的现有实现(例如distorm)或以更方便的形式记录这一事实的其他项目(例如corkami)
答案 3 :(得分:-1)
查看位于Wikipedia page底部的英特尔手册,因为它应包含所有支持的各种寻址模式,并且它将为您提供所有其他指令的外观和功能。