Linux amd64下NASM生成意外操作数长度前缀问题求助
问题原因与解决方法
你遇到的问题是NASM默认未匹配amd64环境的架构模式,导致指令被错误解析。
具体分析
- 你的NASM输出中,代码被放在
.data段,且生成的指令带66前缀(16位操作数标识),mov eax, 0x12345678被拆成了mov ax, 0x5678和xor al, 0x12——这是因为在16位模式下不存在eax寄存器,NASM自动降级为ax,后续字节被误解析为独立指令。 - 而
as在amd64环境下默认启用64位模式,能正确识别%eax是32位寄存器,生成了标准的5字节mov指令(操作码b8+4字节立即数)。
解决方法
- 指定目标架构编译
编译时添加-f elf64参数,明确生成x86-64架构的ELF目标文件:nasm -f elf64 your_code.asm -o your_code.o - 将代码放在正确的段中
执行指令必须放在.text代码段,而非.data数据段,示例代码:section .text global _start _start: mov eax, 0x12345678 ; 后续执行逻辑 - 32位模式兼容处理
若需生成32位代码,改用-f elf32参数,此时mov eax, 0x12345678也会生成正确的5字节指令。
验证
编译完成后,用objdump -d your_code.o反汇编查看,会得到与as一致的正确指令:
0000000000000000 <_start>: 0: b8 78 56 34 12 mov $0x12345678,%eax
内容的提问来源于stack exchange,提问作者iBug
相关产品推荐
相关产品推荐

