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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:45:05