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
相关产品推荐
相关产品推荐

