【问题标题】:How do I produce output in NASM matching `81 /0 iw` for `ADD r/m16, imm16` on x86 Assembly?如何在 NASM 中为 x86 程序集上的 `ADD r/m16, imm16` 生成匹配 `81 /0 iw` 的输出?
【发布时间】:2021-01-29 03:29:06
【问题描述】:

我正在阅读 x86 英特尔文档上的 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,我不明白。

【问题讨论】:

    标签: assembly x86 nasm machine-code


    【解决方案1】:

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

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

    不妨试试

    add cx, 1234
    add ecx, 1234
    

    也许是为了更好的衡量

    add rcx, 1234
    

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      相关资源
      最近更新 更多