2010-05-18 80 views
10

我正在重寫我的彙編程序。儘管如此,我對實現反彙編也很好奇。我想讓它變得簡單和緊湊,並且我可以在這樣做的時候利用這些概念。x86指令編碼表

可以從操作碼中確定x86指令編碼的其餘部分(也許前綴字節也是需要的)。我知道很多人已經寫過表格。

我對助記符沒有興趣,但指令編碼,因爲它是一個真正的難題。對於每個操作碼我需要知道:

  • 這個指令是否包含modrm?
  • 這條指令有幾個直接字段?
  • 什麼編碼立即使用?
  • 是直接在字段中的指令指針 - 相對地址?
  • modrm使用什麼樣的寄存器用於操作數和寄存器字段?

sandpile.org有一些我需要的東西,但它的格式不容易解析。

在我開始自己編寫和驗證這些表之前,我決定寫這個問題。你知道某種地方存在這種表嗎?在一個不需要太多努力解析的表單中。

b byte 
w word 
v word or dword (or qword), depends on operand size attribute (0x66) 
z word or dword (or dword), depends on operand size attribute 
J instruction-relative address (next character describes type) 
G instruction group, has modrm-field (next character describes operand type) 
R has modrm-field (next two characters describe register and operand type) 
M modrm, but operand field must point to memory 
O direct offset (next character describes type) 
F FPU 
T separate table 
_ defined, but no arguments 

x 0 1 2 3 4 5 6 7 8 9 A B C D E F 
0 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z   T 
1 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z 
2 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z 
3 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z 
4 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
5 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
6 _ _ Mvv        z Rvvz b Rvvb 
7 Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb 
8 Gbb Gvz Gbb Gvb Rbb Rvv Rbb Rvv Rbb Rvv Rbb Rvv  Mvv 
9 _ _ _ _ _ _ _ _      _ _ _ _ 
A Ob Ov Ob Ov _ _ _ _ b z _ _ _ _ _ _ 
B b b b b b b b b v v v v v v v v 
C Gbb Gvb w _           _ b _ _ 
D Gb Gv Gb Gv      F F F F F F F F 
E           Jz Jz  Jb 
F      _ _ Gb Gv _ _ _ _ _ _ Gb Gv 

在這裏,我已經得到了第一個操作數的表。格式是這樣的,可以從包含它的文本文件中直接解析表格 。我離開了一些CISC和分段相關的指令。

對於雙字節指令,我很可能需要四個這樣的表。對於三字節指令,我需要兩個表格。 FPU指令需要8個表格,這非常簡單。之後,我會覆蓋很大一部分x86指令。雖然我只用一兩個表就可以了。

此外,很少有指令組可能需要一些小陣列來識別指令類型。

回答

8

我相信ref.x86asm.net可能有你在找什麼。這是所有x86-64指令的列表,採用XML格式,應該很容易解析。

+0

包含足夠的完整彙編信息。我猜這是足夠好的桌子。讓我們看看我是否可以基於它構建一個代碼生成器。 – Cheery 2010-05-21 08:31:42

5

IIRC爲Free Pascal編譯器的內部彙編程序,我們最初使用從NASM源中提取的表。