【发布时间】:2010-05-18 07:58:53
【问题描述】:
我正在重写我的汇编程序。在此期间,我也对实现反汇编感到好奇。我想让它变得简单紧凑,并且在这样做的时候我可以利用一些概念。
可以从操作码确定其余的 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 指令块。虽然我只用一两张桌子就可以了。
此外,很少有指令组可能需要一些小数组来识别指令类型。
【问题讨论】:
标签: code-generation x86 assembly disassembly