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

时间:2019-07-10 23:24:45

标签: assembly x86-64 att

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

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

=>表示这是崩溃时调用的指令。因此,我在调用*(%rax)时遇到了段错误。我是组装的新手。我看到寄存器周围的括号意味着要遵从该地址(在该地址获取值)。因此,(%rax)意味着获取当前存储在%rax中的指针的值。星星装饰对此有什么作用?这是否会进一步取消引用该值(因此(%rax)本身就是一个指针)?我在使用*(汇编语法时遇到了麻烦。

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

1 个答案:

答案 0 :(得分:2)

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

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