我正在重写我的汇编程序。在此期间,我对实现反汇编也很好奇。我想使它简单和紧凑,并有一些概念,我可以利用在这样做。
可以从操作码确定x86指令编码的其余部分(可能也需要前缀字节)。我知道很多人都为做这件事写了表格。
我对助记符不感兴趣,而是对指令编码感兴趣,因为这是一个实际的难题。对于每个操作码号码,我需要知道:
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指令被掩盖。不过我只需要一两张桌子就行了。
此外,很少有指令组可能需要一些小数组来识别指令类型。
发布于 2010-05-20 22:14:18
我相信ref.x86asm.net可能有你想要的东西。它是所有x86-64指令的列表,采用的XML格式应该很容易解析。
发布于 2010-06-14 10:16:28
对于自由Pascal编译器的内部汇编程序,我们最初使用的是从NASM源代码中提取的表。
https://stackoverflow.com/questions/2855418
复制相似问题