NASM 汇编程序 - 生成的机器代码中不需要 66

Rom*_*ski 5 x86 assembly nasm

  • 操作系统:Windows 10
  • CPU:英特尔酷睿i5-5300U
  • 架构:x64

我刚开始学习汇编语言。我用的是在线编译器,但今天我下载了NASM。我试图组装这个简单的代码,将 10 乘以 15:

mov eax, 0xa
mov edx, 0xf
imul eax, edx
ret
Run Code Online (Sandbox Code Playgroud)

尝试执行由 NASM 生成的机器代码失败,因此我在十六进制编辑器中打开此代码并将其与我可以成功执行的在线汇编程序生成的代码进行比较。

纳姆:

66 b8 0a 00 00 00 66 ba 0f 00 00 00 66 0f af c2 c3
Run Code Online (Sandbox Code Playgroud)

在线编辑:

b8 0a 00 00 00 ba 0f 00 00 00 0f af c2 c3
Run Code Online (Sandbox Code Playgroud)

这两个代码之间的唯一区别66是 NASM 生成的代码中不需要的 。谁能帮我?

Rom*_*ski 3

正如杰斯特所建议的那样。我没有包含 BITS 64 声明。现在,当我包含 BITS 64 时,一切正常

  • 请注意,您只需要在代码中使用“nasm -fbin”将其组装成平面二进制文件。如果您要使用“nasm -fwin64”,则会为您设置 BITS 64。使用显式的“bits 64”会让您犯错误,例如将 64 位机器代码汇编到 32 位目标文件中,然后在运行时遇到奇怪的问题,而不是像“push rax”这样好的错误消息警告您它是64 位模式下的寄存器名称(但您“不是”汇编 64 位代码)。 (2认同)