在NASM中使用OR r/m32,imm32

Bit*_*tes 8 x86 assembly amd intel

生成的操作码:

or ebx, 0ffffffffh
Run Code Online (Sandbox Code Playgroud)

与NASM是:

83CBFF
Run Code Online (Sandbox Code Playgroud)

但在英特尔说明手册中:

81 /1 id      OR r/m32, imm32
83 /1 ib      OR r/m32, imm8
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么NA​​SM使用操作码83代替81,以及如何生成操作码81

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

int*_*jay 9

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

or ebx, strict dword 0ffffffffh
Run Code Online (Sandbox Code Playgroud)

这导致:

81 cb ff ff ff ff
Run Code Online (Sandbox Code Playgroud)

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

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

  • `imm8`是符号扩展. (3认同)
  • @SedatKapanoglu ["在具有8位立即第二个操作数和更长的第一个操作数的形式中,第二个操作数被认为是有符号的,并且被符号扩展到第一个操作数的长度.在这些情况下,BYTE限定符有必要强迫NASM生成这种形式的指令."](http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html) (3认同)