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

GNU汇编器Intel语法下add指令操作数类型不匹配问题求助

x86-64汇编add指令立即数报错的原因及解决办法

x86-64架构里,add指令并没有直接支持64位立即数加到64位寄存器的机器码。实际可用的只有add r/m64, imm32这条指令——它会把32位立即数符号扩展成64位后再执行加法操作。

你用0xffffffffffffffff能正常编译,是因为这个值是-1的64位表示,对应的32位值是0xffffffff,将其符号扩展到64位正好就是全1的64位值。汇编器会自动将其识别为32位立即数,用add r9, 0xffffffff的编码执行,自然不会报错。

而0x4014000000000000这个数,高32位是0x40140000,低32位是0。如果用32位立即数符号扩展,低32位是0意味着符号位为0,扩展后高32位应该全是0,和你的目标值高32位不符,没法用现有add指令的编码实现,所以汇编器会抛出「操作数类型不匹配」的错误。

解决方法

如果要给r9加上这个64位立即数,推荐两种常用方式:

  • 先把立即数加载到另一个64位寄存器,再执行加法:
    mov rax, 0x4014000000000000
    add r9, rax
    
  • 将立即数存入数据段,再从内存中读取参与运算:
    .data
    target_val dq 0x4014000000000000
    .text
    add r9, [target_val]
    

内容的提问来源于stack exchange,提问作者Citra Dewi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:18:28