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

x86汇编中`call %rax`触发无`*`间接调用警告的原因咨询

解决GAS汇编中“indirect call without *”警告的问题

嘿,这个警告的根源其实是GNU汇编器(GAS)的AT&T语法规则,和你对%rax存储函数地址的理解完全不冲突~

为什么会出现这个警告?

GAS对直接调用和间接调用的语法有明确区分:

  • 直接调用(比如call add):汇编器直接识别符号add对应的地址,不需要额外标记。
  • 间接调用(通过寄存器/内存地址调用):必须用*明确告诉汇编器:“我要调用的是这个寄存器/内存里存储的地址指向的指令”。

你的代码里call %rax属于寄存器间接调用,虽然%rax确实存了add的入口地址,但GAS的语法规则要求你加上*来标注这是间接调用,否则它会认为你可能误用了语法,从而抛出警告。

怎么解决?

把这一行的调用代码修改成:

call *%rax # 现在明确标记为间接调用,警告会消失

补充说明:不同汇编器的语法差异

你提到“汇编不同于C语言无需*表示指针”,这个说法没错,但要注意:不同汇编器的语法规则不一样。比如NASM(Intel语法)里确实可以直接写call rax,但GAS的AT&T语法就是要求间接调用加*,这只是语法规范的区别,不是你对地址逻辑的理解有误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:57:34