2011-10-12 38 views
1

我正在做的x86彙編到C代碼,模擬器..和我的解析器我到支架解析組裝什麼是括號中的* ALL *可能的算術可能性?

QWORD PTR []

DWORD PTR []

WORD PTR []

BYTE PTR []

MOV X, []

LEA X, []

現在我會忽略..

MMWORD PTR[]

XMMWORD PTR[]

FWORD PTR []

TBYTE PTR []

我想知道什麼是所有可能的數學運算可以是被放置在支架

最複雜的我所遇到的是.. [EBP+ECX*4-E0]

我之所以要解析是轉換E00x000000E0然後40x00000004

據我所知+-*是可能的也可能是\和or /,或點怎麼樣? .

我想最好的方式來拆分包含括號[]的每條指令以獲得內部數學。 然後用1個字符分隔符+-*分隔內部數學。

我想確保我能得到它們全部?這些都是可能的分裂嗎?或者不是XOR/OR/AND/NOT怎麼樣?

回答

2

括號內有什麼是地址表達式。英特爾x86系列處理器支持某些地址操作,例如具有基址寄存器,添加偏移量以及使用2,4或8進行縮放。一些彙編器允許對結構中的字段進行虛線引用,作爲基本偏移量表達式的一部分。除了計算基本偏移量外,括號內的「數學」在彙編時不是數學運算,而是在運行時計算指令的地址部分的編碼。

+0

你能不能給我舉例用點,所以我可以去查一下向上。我基於這個ollydebugger指令產生 – SSpoke

+0

螺絲當它發生一些未處理的事情時,我會解決它。現在+ - *是我將使用的。 – SSpoke

-1

查看位於Wikipedia page底部的英特爾手冊,因爲該手冊應該包含所有支持的各種尋址模式,並且還會爲您提供所有其他指令的外觀和功能。

+0

斷開的鏈接,謝謝 – SSpoke

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 
+1

另外請注意,大多數彙編器允許比操作碼支持的更多。例如,不是隻允許添加偏移量,而是允許減去偏移量(但實際上添加負數)。另一個例子是'mov eax,[eax * 5]'(它實際上是'mov eax,[eax * 4 + eax]')。然後是'mov eax,[eax * 9 + foo - bar + hello * 3 - world/8]'(彙編器將常量表達式轉換爲單個常量偏移量) – Brendan

0

您需要閱讀Intel Software Developer Manuals。具體來說,第3.7.5節「指定偏移」,它告訴我們這樣做有兩種方式:

  • 一般形式Base + (Index * Scale) + Displacement
  • 相對於IP:RIP + Displacement(僅64位模式)

然後,檢查指令集引用以查找每條指令的可能性。

或者,您也可以諮詢各種反彙編器和仿真器(如distorm)或其他項目中更方便的形式記錄這個確切的事情的現有實現(如corkami

相關問題