Using OR r/m32, imm32 in NASM

时间:2017-06-12 17:01:44

标签: assembly x86 intel amd

The opcode generated by:

or ebx, 0ffffffffh

with NASM is:

83CBFF

But in Intel Instructions Manual:

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

My question is, why NASM used the opcode 83 instead of 81, and how to generate the opcode 81?

this is the command line for NASM: nasm -fwin32 file.asm -l list.lst

1 个答案:

答案 0 :(得分:9)

NASM选择8位操作数大小作为优化,因为它做同样的事情并占用更少的空间。您可以强制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。< / p>