Assembly 什么是';callq*(%rax)和#x27;什么意思?
我正在gdb会议中分析一个死后崩溃。我正在查看函数的反汇编输出,我看到:Assembly 什么是';callq*(%rax)和#x27;什么意思?,assembly,x86-64,att,Assembly,X86 64,Att,我正在gdb会议中分析一个死后崩溃。我正在查看函数的反汇编输出,我看到: => 0x00007f8d354aed52 <+50>: callq *(%rax) =>0x00007f8d354aed52:callq*(%rax) =>表示这是崩溃时调用的指令。因此,我在调用*(%rax)处的函数时遇到了seg故障。我对组装很陌生。我看到寄存器周围的paren意味着尊重(获取)该地址的值。因此,(%rax)意味着获取当前存储在%rax中的指针值。星星装饰在上面有什么作用
=> 0x00007f8d354aed52 <+50>: callq *(%rax)
=>0x00007f8d354aed52:callq*(%rax)
=>
表示这是崩溃时调用的指令。因此,我在调用*(%rax)
处的函数时遇到了seg故障。我对组装很陌生。我看到寄存器周围的paren意味着尊重(获取)该地址的值。因此,(%rax)
意味着获取当前存储在%rax
中的指针值。星星装饰在上面有什么作用?这是否进一步取消了对该值的引用(因此(%rax)
本身就是一个指针)?我在谷歌搜索*(
汇编语法时遇到问题
这是由GCC 4.8编译C++代码生成的X64程序集。
< P>星号表示该调用是间接调用。这是为了区分<代码>调用FoO < /C>(调用函数FO)与<代码> call *Fo< <代码>(存储在变量FO中的调用函数)。从存储在rax
中的地址,调用从该四字开始的函数
有关语法的详细信息,请参阅GNU汇编程序手册。您是对的,这里似乎有一个额外的间接层,因为(%rax)已表示rax中包含的地址处的内存。星号是gnu汇编程序语法的一种特性,用于间接调用指令。它不表示额外的间接寻址。在英特尔语法中,这将是“调用[rax]”。注意,您可以切换gdb(和其他gnu工具)到英特尔语法模式。相关:描述这意味着什么。此外,如果您不熟悉AT&T或asm GCC,您可以使用英特尔语法反汇编;
objdump-drwC-Mintel
,或GDB设置反汇编风格英特尔
,首先使用GCC-S-masm=intel
()它与call*foo
指令相同,只是具有不同的寻址模式:(%rax)
基址寄存器,而不是foo
32位绝对值或foo(%rip)
rip相对值。所有这些指令都使用相同的操作码(),只是一个不同的ModRM字节。调用*%rax
,它对64位绝对目标使用寄存器而不是内存源。