我正在gdb会话中分析事后崩溃。我正在查看反汇编输出的函数,看到的是:
=> 0x00007f8d354aed52 <+50>: callq *(%rax)
=>
表示这是崩溃时调用的指令。因此,我在调用*(%rax)
时遇到了段错误。我是组装的新手。我看到寄存器周围的括号意味着要遵从该地址(在该地址获取值)。因此,(%rax)
意味着获取当前存储在%rax
中的指针的值。星星装饰对此有什么作用?这是否会进一步取消引用该值(因此(%rax)
本身就是一个指针)?我在使用*(
汇编语法时遇到了麻烦。
这是从GCC 4.8编译C ++代码生成的x64程序集。
答案 0 :(得分:2)
星号表示该呼叫是间接呼叫。这是为了将call foo
(调用函数foo)和call *foo
(存储在变量foo中的调用函数)区分开来。指令callq *(%rax)
从rax
中存储的地址中加载一个四字(64位),并从该四字开始调用函数。
有关语法的详细信息,请参阅GNU汇编程序手册。