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
相关产品推荐
相关产品推荐

