首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用直接操作数编码x86-16指令

用直接操作数编码x86-16指令
EN

Stack Overflow用户
提问于 2021-05-18 12:49:18
回答 1查看 364关注 0票数 1

我正在尝试解码指令,现在在80x86 16位机器上,我在解码指令方面没有太多问题,因为它们的源操作数没有即时值,当源操作数不再是寄存器或位置内存,而是一个即时值时,就会出现问题。下面是我要用这种方式解码的指令:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
mov ax, 3

10111000 00000011 0000000

如果源操作数是一个即时值,那么有人能向我解释解码是如何工作的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-29 21:12:39

x86的解码是通过查阅表来完成的。

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

代码语言:javascript
复制
opcode       immediate
-----------  --------------------
1011_1_000b, 00000011b, 00000000b
     ^  ^
     |  AX
     w-bit

在您的第一个片段中,您尝试剖析BBh (10111011b)操作码,但是如果您要查阅相同的表,您将看到它代表mov bx, imm16

代码语言:javascript
复制
opcode       immediate
-----------  --------------------
1011_1_011b, 00000011b, 00000000b
     ^  ^
     |  BX
     w-bit

但是,还有第二种方法可以使用modr/m字节对mov ax, imm16指令进行编码,就像您在第一个代码段中所做的那样:

代码语言:javascript
复制
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的英特尔手册中找到您需要的所有表。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67586535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档