如何在 NASM 中为 x86 程序集上的 `ADD r/m16, imm16` 匹配 `81 /0 iw` 生成输出?
How do I produce output in NASM matching `81 /0 iw` for `ADD r/m16, imm16` on x86 Assembly?
我正在阅读 x86 Intel 文档上的 ADD 指令,一次一行,并尝试重现它,这样我就可以了解它们晦涩的符号是如何工作的,并弄清楚如何在不使用的情况下生成机器代码gcc/clang/llvm/etc..
我目前卡在 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
前缀的使用位置,因为它始终以相同的方式用于标量指令(但要注意 SSE 指令,其中前缀用于不同的目的)。
关于您的 add ax, 6553
指令:汇编程序在这里选择较短的 add ax, imm16
编码。选择与 ax
不同的寄存器以避免这种影响。
也许试试
add cx, 1234
add ecx, 1234
也许还有更好的措施
add rcx, 1234
我正在阅读 x86 Intel 文档上的 ADD 指令,一次一行,并尝试重现它,这样我就可以了解它们晦涩的符号是如何工作的,并弄清楚如何在不使用的情况下生成机器代码gcc/clang/llvm/etc..
我目前卡在 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
前缀的使用位置,因为它始终以相同的方式用于标量指令(但要注意 SSE 指令,其中前缀用于不同的目的)。
关于您的 add ax, 6553
指令:汇编程序在这里选择较短的 add ax, imm16
编码。选择与 ax
不同的寄存器以避免这种影响。
也许试试
add cx, 1234
add ecx, 1234
也许还有更好的措施
add rcx, 1234