我正在一个gdb会议上分析一次死后的崩溃。我正在查看一个函数的反汇编输出,我看到如下:
=> 0x00007f8d354aed52 <+50>: callq *(%rax)
=>
表示这是崩溃时调用的指令。因此,我在*(%rax)
调用函数时遇到了一个seg错误。我对装配很陌生。我看到寄存器周围的父母亲意味着尊重(获取地址的值)。因此,(%rax)
意味着获取当前存储在%rax
中的指针的值。星星装饰是用来做什么的?这是否进一步取消了该值的引用(因此,(%rax)
本身就是一个指针)?我在谷歌*(
程序集语法时遇到了麻烦。
这是GCC 4.8编译x64代码生成的C++程序集。
发布于 2019-07-10 23:30:35
星号表示调用是间接调用。这是为了区分call foo
(调用函数foo)和call *foo
(存储在变量foo中的调用函数)。指令callq *(%rax)
从存储在rax
中的地址加载一个四字(64位),并调用从该四字开始的函数。
有关语法的详细信息,请参阅GNU汇编程序手册。
https://stackoverflow.com/questions/56979796
复制相似问题