'callq *(%rax)' 是什么意思?

What does 'callq *(%rax)' mean?

我正在 gdb 会话中分析事后崩溃。我正在查看函数的反汇编输出,我看到了这个:

=> 0x00007f8d354aed52 <+50>:    callq  *(%rax)

=> 表示这是崩溃时调用的指令。所以我在 *(%rax) 处调用函数时遇到段错误。我对组装很陌生。我看到寄存器周围的括号意味着尊重该地址(获取值)。这样(%rax)的意思就是得到%rax中当前存放的指针的值。星星装饰在上面有什么作用?这是否会进一步取消引用该值(因此 (%rax) 本身就是一个指针)?我在谷歌搜索 *( 汇编语法时遇到问题。

这是由 GCC 4.8 编译 C++ 代码生成的 x64 程序集。

星号表示调用是间接调用。这是为了区分call foo(调用函数foo)和call *foo(调用存储在变量foo中的函数)。指令 callq *(%rax) 从存储在 rax 中的地址加载一个四字(64 位)并调用从该四字开始的函数。

有关语法的详细信息,请参阅 GNU 汇编程序手册。