使用立即操作数编码 x86-16 指令
Encoding x86-16 instruction with immediate operand
我正在尝试解码指令,目前在 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
有人可以向我解释假设源操作数是立即值时解码是如何工作的吗?
通过参考 tables.
x86 的解码工作
如果给定一个字节,您已经知道它是指令操作码(而不是指令前缀),并且该字节将包含值 B8h (10111000b),您将在 table 中看到(s) 它代表 mov ax, imm16
.
opcode immediate
----------- --------------------
1011_1_000b, 00000011b, 00000000b
^ ^
| AX
w-bit
在您的第一个片段中,您尝试剖析 BBh (10111011b) 操作码,但如果您查阅相同的 table(s),您会发现它代表 mov bx, imm16
。
opcode immediate
----------- --------------------
1011_1_011b, 00000011b, 00000000b
^ ^
| BX
w-bit
然而,还有第二种方法可以使用 modr/m 字节对 mov ax, imm16
指令进行编码,就像您在第一个片段中尝试做的那样:
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位;没有可用的符号扩展名。因此这种编码很少被关心代码大小的汇编器使用。
ADD
、ADC
、SUB
、SBB
、CMP
、AND
、OR
、XOR
和 TEST
指令。但是对于这些短格式,没有 modr/m 字节的,只适用于 AX
寄存器。
您可以在 https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html
的英特尔手册中找到您需要的所有 table
我正在尝试解码指令,目前在 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
有人可以向我解释假设源操作数是立即值时解码是如何工作的吗?
通过参考 tables.
x86 的解码工作如果给定一个字节,您已经知道它是指令操作码(而不是指令前缀),并且该字节将包含值 B8h (10111000b),您将在 table 中看到(s) 它代表 mov ax, imm16
.
opcode immediate
----------- --------------------
1011_1_000b, 00000011b, 00000000b
^ ^
| AX
w-bit
在您的第一个片段中,您尝试剖析 BBh (10111011b) 操作码,但如果您查阅相同的 table(s),您会发现它代表 mov bx, imm16
。
opcode immediate
----------- --------------------
1011_1_011b, 00000011b, 00000000b
^ ^
| BX
w-bit
然而,还有第二种方法可以使用 modr/m 字节对 mov ax, imm16
指令进行编码,就像您在第一个片段中尝试做的那样:
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位;没有可用的符号扩展名。因此这种编码很少被关心代码大小的汇编器使用。
ADD
、ADC
、SUB
、SBB
、CMP
、AND
、OR
、XOR
和 TEST
指令。但是对于这些短格式,没有 modr/m 字节的,只适用于 AX
寄存器。
您可以在 https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html
的英特尔手册中找到您需要的所有 table