assembly - 在 NASM 中使用 OR r/m32、imm32

标签 assembly x86 intel amd

生成的操作码:

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 位操作数大小作为优化,因为它做同样的事情并且占用更少的空间。您可以通过以下方式强制 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

关于assembly - 在 NASM 中使用 OR r/m32、imm32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504943/

相关文章:

linux - 用于 INTEL GPU 的 OpenCL SDK Linux 下载

c - 如何在 Assembly 中正确写入字节数组?

assembly - 指令解码器如何区分 32 位模式下的 EVEX 前缀和 BOUND 操作码?

c - 汇编程序在调用 printf 后崩溃

c - 32 位英特尔堆栈帧格式字符串利用

c++ - RDTSC 开销的差异

c - 如何让 Dev-C++ 从 C 代码生成英特尔程序集?

c - 代码是如何执行的和gcc

c - 如果需要,堆栈会分配更多空间还是会溢出?

c - 如何加载IDT?