微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 NASM 中为 x86 程序集上的“ADD r/m16、imm16”生成匹配“81 /0 iw”的输出?

如何解决如何在 NASM 中为 x86 程序集上的“ADD r/m16、imm16”生成匹配“81 /0 iw”的输出?

我正在浏览 x86 Intel 文档上的 ADD 指令,一次一行,并尝试重现它,以便我可以了解它们晦涩的符号是如何工作的,并弄清楚如何在没有 gcc/ 的情况下生成机器代码clang/llvm/等..

我目前被困在 81 操作码对上:

81 /0 iw    ADD r/m16,imm16    MI  Valid   Valid   Add imm16 to r/m16.
81 /0 id    ADD r/m32,imm32    MI  Valid   Valid   Add imm32 to r/m32.

哪两个 NASM 指令调用示例(每个示例一个)将生成与这些模式匹配的输出并为每个示例生成81 开头的输出

当我尝试我认为可行的方法时,我得到了完全不同的输出

add ax,6553

变成:

66 05 99 19                     

从这里:

bits 64
global start
section .text
start:
  ADD ax,6553

nasm -f macho64 test.asm

我可以让 83 工作,例如:

83 /0 ib    ADD r/m16,imm8

它是这样工作的:

bits 16
global start
section .text
start:
  add ax,1

但是 81 不工作,它只相差 imm16,我不明白。

解决方法

在开头的某处提到:66 前缀在 16 位和 32 位操作数大小之间切换。在 16 位模式下,16 位操作数大小是默认值。在 32 位和 64 位模式下,32 位是默认操作数大小。由于指令列表适用于所有操作模式(除非另有说明),它没有显示 66 前缀的使用位置,因为它总是以相同的方式用于标量指令(但要注意前缀为用于不同的目的)。

关于您的 add ax,6553 指令:汇编程序在这里选择较短的 add ax,imm16 编码。选择与 ax 不同的寄存器以避免这种影响。

也许试试

add cx,1234
add ecx,1234

也许是一个很好的衡量

add rcx,1234

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。