如何解决使用立即操作数编码 x86-16 指令
我正在尝试解码指令,现在在 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
有人可以向我解释假设源操作数是立即数的解码是如何工作的吗?
解决方法
x86 解码通过查阅表格进行。
如果你得到一个字节,你已经知道它是一个指令操作码(而不是指令前缀),并且该字节将保存值 B8h (10111000b),你会在表中看到它代表mov ax,imm16
。
opcode immediate
----------- --------------------
1011_1_000b,00000011b,00000000b
^ ^
| AX
w-bit
在您的第一个代码段中,您尝试剖析 BBh (10111011b) 操作码,但如果您查阅相同的表,您会看到它代表 mov bx,imm16
。
opcode immediate
----------- --------------------
1011_1_011b,00000000b
^ ^
| BX
w-bit
然而,还有第二种方法可以使用 modr/m 字节对 mov ax,imm16
指令进行编码,就像您在第一个代码段中尝试做的那样:
opcode modr/m immediate
---------- ----------- --------------------
1100011_1b,11_000_000b,00000000b
^ ^ ^ ^
| | | r/m is AX
| | 000
| mod=11b => r/m is register
w-bit
这个操作码没有 s 位;没有可用的符号扩展。因此,这种编码很少被关心代码大小的汇编程序使用。
ADD
,ADC
,SUB
,SBB
,CMP
,AND
,{{1} 存在一对类似的编码}}、OR
和 XOR
指令。但对于这些简短形式,没有 modr/m 字节的形式,仅适用于 TEST
寄存器。
您可以在英特尔手册中找到您需要的所有表格,网址为 https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。