2010-05-18 81 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源中提取的表。