【问题标题】:x86 instruction encoding tablesx86 指令编码表
【发布时间】: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


    【解决方案1】:

    我相信ref.x86asm.net 可能有您正在寻找的东西。它是所有 x86-64 指令的列表,采用 XML 格式,应该易于解析。

    【讨论】:

    • 这包含了完整汇编程序所需的足够信息。我想这是足够好的桌子。让我们看看我是否可以基于它构建代码生成器。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-03
      • 2014-12-23
      • 2013-08-11
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      相关资源
      最近更新 更多