x86指令编码表

Che*_*ery 10 x86 assembly code-generation disassembly

我正在重写我的汇编程序.在此期间,我对实施反汇编感到好奇.我想让它变得简单和紧凑,并且我可以利用这些概念.

可以从操作码确定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
Run Code Online (Sandbox Code Playgroud)

这里我有第一个操作数的表.格式是可以从包含它的文本文件直接解析表.我遗漏了一些CISC和分段相关的指令.

对于双字节指令,我需要四个这样的表.对于三字节指令,我需要两个表.FPU指令需要8个表,幸运的是非常简单.在那之后,我将覆盖相当大的x86指令.虽然我只用一两张桌子就可以了.

此外,很少有指令组可能需要一些小数组来识别指令类型.

Mar*_*tin 9

我相信ref.x86asm.net可能有你想要的东西.它是所有x86-64指令的列表,采用XML格式,易于解析.


Mar*_*ort 5

IIRC用于Free Pascal编译器的内部汇编程序,我们最初使用从NASM源中提取的表.