GNU Assembler X64环境下如何Push大无符号值?报错求助
解决
pushl $0x80001000编译报错问题 错误原因
pushl指令的立即数操作数在GNU汇编器(GAS)中要求必须落在32位有符号整数范围内(即 -2^31 到 2^31-1,对应十六进制 0x80000000 到 0x7FFFFFFF)。你要推送的 0x80001000(十进制2147487744)作为无符号数超出了这个范围,即便它作为有符号数是合法负数,GAS的语法检查也会因数值超出范围报错。
可行解决方法
1. 32位目标架构场景
无法直接用pushl推送该立即数,需先将数值加载到寄存器,再推送寄存器:
movl $0x80001000, %eax pushl %eax
movl指令支持任意32位立即数(无论有符号/无符号),将数值写入寄存器后,pushl %eax即可正常执行。
2. 64位目标架构场景
确保以64位模式编译(添加-m64参数,如as -m64 mycc_cpp.s -o mycc_cpp.o),然后使用64位推送指令:
pushq $0x80001000
或直接省略后缀(GAS会自动推断为pushq):
push $0x80001000
64位模式下pushq支持64位立即数,32位的0x80001000完全符合要求。
内容的提问来源于stack exchange,提问作者pm100
相关产品推荐
相关产品推荐

