使用 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
.
生成的操作码:
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
.