You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节立即数)。

解决方法

  1. 指定目标架构编译
    编译时添加-f elf64参数,明确生成x86-64架构的ELF目标文件:
    nasm -f elf64 your_code.asm -o your_code.o
    
  2. 将代码放在正确的段中
    执行指令必须放在.text代码段,而非.data数据段,示例代码:
    section .text
        global _start
    _start:
        mov eax, 0x12345678
        ; 后续执行逻辑
    
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:00:59