Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 什么是';callq*(%rax)和#x27;什么意思?_Assembly_X86 64_Att - Fatal编程技术网

Assembly 什么是';callq*(%rax)和#x27;什么意思?

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中的指针值。星星装饰在上面有什么作用

我正在gdb会议中分析一个死后崩溃。我正在查看函数的反汇编输出,我看到:

=> 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位绝对目标使用寄存器而不是内存源。