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

链接汇编目标文件时出现undefined reference to esp错误的原因及解决方法

解决汇编链接时“undefined reference to esp”的错误

错误原因分析

这问题我之前也踩过坑,其实是个很容易忽略的AT&T汇编语法细节:在AT&T格式的x86汇编里,所有寄存器名称必须以%作为前缀。

你代码里的这一行:

addl $4, esp

这里的esp没加%前缀,汇编器会把它当成一个普通的外部符号(比如未定义的函数或全局变量),而不是CPU的栈指针寄存器。等到链接阶段,链接器找不到名为esp的符号定义,自然就抛出了undefined reference to 'esp'的错误。

而你之前写的addl $8, %esp是正确的,因为加了%前缀,汇编器能识别这是寄存器,所以编译阶段没问题。

修复方法

只需要把出错的那行代码里的esp加上%前缀就行:

addl $4, %esp

修正后的相关代码片段:

pushl $buffer
call isdigit
addl $4, %esp  # 补上%前缀,标记这是寄存器
cmp $1, %eax
je if_digit

额外注意事项

  • AT&T语法和Intel语法的核心区别之一就是寄存器的前缀要求,写AT&T汇编时一定要记得给所有寄存器加%,别和Intel语法搞混。
  • 编译时汇编器没报错,是因为它允许未定义的外部符号存在,这种问题只会在链接阶段暴露出来,以后遇到类似的“undefined reference”错误,也可以先检查下是不是符号名(包括寄存器)的语法写错了。

内容的提问来源于stack exchange,提问作者Jimmy Suh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:32:12