使用nasm编译含xmmword操作数的汇编代码报错如何解决
NASM原生支持包含128位XMM寄存器的SSE、AVX等扩展指令集,你遇到的编译报错是编译参数或代码声明配置错误导致的,可按以下步骤修复:
- 第一步:指定正确的目标输出格式或位宽
你的代码中使用了64位通用寄存器rsi,属于x86-64架构汇编代码,需要明确告知NASM使用64位汇编模式:- 编译为平台通用可重定位目标文件时,需通过
-f参数指定对应64位输出格式:- Linux平台:
nasm -f elf64 -o file.o input.asm - Windows平台:
nasm -f win64 -o file.obj input.asm - macOS平台:
nasm -f macho64 -o file.o input.asm
- Linux平台:
- 若你需要生成纯二进制输出(如引导程序、固件代码),无需指定
-f参数,只需在汇编代码最开头添加bits 64声明即可。
你之前的命令未指定输出格式也未声明位宽,NASM默认会按16/32位模式解析代码,自然无法识别64位寄存器和SSE扩展指令。
- 编译为平台通用可重定位目标文件时,需通过
- 第二步:显式声明指令集(可选,适配低版本NASM)
如果按上述配置修改后仍有报错,可以在汇编代码开头补充指令集声明,明确允许NASM汇编SSE2指令(movdqu属于SSE2指令集),修改后的完整代码示例如下:
bits 64 cpu sse2 mov rsi, 0x400200 movdqu xmm0, xmmword [rsi] nop
- 补充说明:NASM仅输出汇编后的目标文件或二进制文件,如果你需要生成可执行程序,还需要将输出的目标文件通过
ld、gcc等链接器进行链接才能正常运行。
内容的提问来源于stack exchange,提问作者Goks
相关产品推荐
相关产品推荐

