【问题标题】:Encoding x86-16 instruction with immediate operand使用立即操作数编码 x86-16 指令
【发布时间】:2021-05-18 12:49:18
【问题描述】:

我正在尝试解码指令,目前在 80x86 16 位机器上,我在解码没有立即值作为源操作数的指令时没有很多问题,当源操作数不再是寄存器或位置存储器,但立即值。 以下指令我会这样解码:

mov ax, 3

101110|11| |11|000|000| 00000011 -> 3 with sign expansion
      |       |   |  register AX
      s = 1   |  null
      w = 1   |
              the second operand is a register

反而不公平。 这是正确的解码:

mov ax, 3

10111000 00000011 0000000

如果源操作数是立即数,有人可以向我解释一下解码是如何工作的吗?

【问题讨论】:

标签: assembly x86 machine-code instruction-encoding


【解决方案1】:

x86 的解码通过查阅表格来工作。

如果给你一个你已经知道它是指令操作码(而不是指令前缀)的字节,并且该字节将保存值 B8h (10111000b),你会在它所代表的表中看到为mov ax, imm16

opcode       immediate
-----------  --------------------
1011_1_000b, 00000011b, 00000000b
     ^  ^
     |  AX
     w-bit

在您的第一个 sn-p 中,您尝试剖析 BBh (10111011b) 操作码,但如果您查阅同一张表,您会看到它代表 mov bx, imm16

opcode       immediate
-----------  --------------------
1011_1_011b, 00000011b, 00000000b
     ^  ^
     |  BX
     w-bit

不过,还有第二种方法可以使用 modr/m 字节对 mov ax, imm16 指令进行编码,就像您在第一个 sn-p 中尝试的那样:

opcode      modr/m       immediate
----------  -----------  --------------------
1100011_1b, 11_000_000b, 00000011b, 00000000b
        ^   ^   ^   ^
        |   |   |   r/m is AX
        |   |   000
        |   mod=11b => r/m is register
        w-bit

此操作码没有 s 位;没有可用的符号扩展。因此,关心代码大小的汇编程序很少使用这种编码。

ADDADCSUBSBBCMPANDORXORTEST 指令存在类似的一对编码。但是对于这些短格式,没有 modr/m 字节的格式,仅适用于AX 寄存器。

您可以在https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html 的英特尔手册中找到您需要的所有表格

【讨论】:

    猜你喜欢
    • 2019-10-24
    • 2016-10-03
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多