使用 OR r/m32,NASM 中的 imm32

Using OR r/m32, imm32 in NASM

生成的操作码:

or ebx, 0ffffffffh

与 NASM 是:

83CBFF

但是在英特尔说明手册中:

81 /1 id      OR r/m32, imm32
83 /1 ib      OR r/m32, imm8

我的问题是,为什么NASM使用操作码83而不是81,以及如何生成操作码81

这是 NASM 的命令行:nasm -fwin32 file.asm -l list.lst

NASM 选择 8 位操作数大小作为优化,因为它做同样的事情并且占用更少 space。您可以强制 NASM 使用特定的操作数大小:

or ebx, strict dword 0ffffffffh

这导致:

81 cb ff ff ff ff

在没有优化的情况下汇编原始代码 (nasm -O0) 也会得到这个结果。

请注意,如果寄存器是 EAX,这样做将导致 0D 操作码(mov eax, imm32)而不是 81。因此在这种情况下,您可能必须自己输出指令:db 0x81, 0xc8, 0xff, 0xff, 0xff, 0xff .