使用Intel Compiler内嵌x64汇编时add指令操作数无效问题求解
解决x64内嵌汇编中ADD指令大立即数操作数无效的问题
错误原因
x86-64架构的add指令对立即数操作数有编码限制:当目标是64位寄存器时,只能接受32位有符号立即数(会自动符号扩展为64位)。你使用的0x7FFFFFFFFFFFFFF0是64位无符号大数值,超出了32位有符号数的范围(最大值为0x7FFFFFFF),因此编译器判定操作数无效。
解决方法
必须通过通用寄存器中转这个64位大数值,再执行加法操作。修改后的代码如下:
__asm { mov rax, 0x7FFFFFFFFFFFFFF0 add rbp, rax and rbp, 0x7FFFFFFF }
补充说明
如果你的立即数可以用32位有符号数表示(比如0xFFFFFFFFFFFFFFF0等价于32位有符号数0xFFFFFFF0符号扩展),可以直接写add rbp, 0xFFFFFFF0。但你的数值0x7FFFFFFFFFFFFFF0无法被32位有符号数覆盖,所以必须用寄存器中转的方式。
内容的提问来源于stack exchange,提问作者hotline1337
相关产品推荐
相关产品推荐

