我正在重写我的汇编程序 . 在此期间,我对实施反汇编感到好奇 . 我想让它变得简单和紧凑,并且我可以在这样做时使用这些概念 .
可以从操作码确定x86指令编码的其余部分(也可能需要前缀字节,一点) . 我知道很多人都写过表 .
我对助记符感兴趣但对指令编码不感兴趣,因为那是一个实际的难题 . 对于每个操作码编号,我需要知道:
-
这条指令是否包含modrm?
-
该指令有多少个直接字段?
-
立即使用什么编码?
-
是字段中的指令指针 - 相对地址吗?
-
modrm用于操作数和寄存器字段的寄存器是什么类型的?
sandpile.org有一些我需要的东西,但它的格式不容易解析 .
在我开始自己编写和验证这些表之前,我决定写这个问题 . 你知道这种 table 存在吗?在一种不需要太多努力解析的形式 .
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指令 . 虽然我只用一两张 table 就可以了 .
此外,很少有指令组可能需要一些小数组来识别指令类型 .
2 回答
我相信ref.x86asm.net可能有你所有x86-64指令的列表,XML格式应该很容易解析 .
对于Free Pascal编译器的内部汇编程序的IIRC,我们最初使用从NASM源中提取的表 .