'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 汇编程序手册。
我正在 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 汇编程序手册。