x86-64 GNU组件

x86-64 GNU组件,gnu,x86-64,assembly,Gnu,X86 64,Assembly,在调查崩溃时,我遇到了以下代码片段,并立即意识到mov指令实际上应该是movq,以获得正确的64位寄存器操作 \elif已定义(\uuuuux86\u64) 无符号长rbp; __asm_uuuuuuuuuuuuuuuuvolatile(“mov%%rbp,%0”:“=r”(rbp)); sp=(无效**)rbp; #否则 除此之外,我还发现了一些文档,声称x86-64的rbp寄存器是通用的,不包含当前帧的地址。我还发现有文档声称,rbp确实包含当前帧的地址。有人能澄清一下吗?关于问题的第一部

在调查崩溃时,我遇到了以下代码片段,并立即意识到
mov
指令实际上应该是
movq
,以获得正确的64位寄存器操作

\elif已定义(\uuuuux86\u64)
无符号长rbp;
__asm_uuuuuuuuuuuuuuuuvolatile(“mov%%rbp,%0”:“=r”(rbp));
sp=(无效**)rbp;
#否则

除此之外,我还发现了一些文档,声称x86-64的
rbp
寄存器是通用的,不包含当前帧的地址。我还发现有文档声称,
rbp
确实包含当前帧的地址。有人能澄清一下吗?

关于问题的第一部分(
movq
而不是
mov
),汇编程序(在本例中)将识别您的操作数是64位,并正确使用
movq
mov
不是有效的指令,它是告诉汇编程序“根据操作数使用正确的
mov
变量”的一种方式

关于第二部分,它实际上是两个:它是一个通用寄存器,在这个意义上,它可以保存任何值。它还用作堆栈帧基指针。AMD64手册的“2.4堆栈操作”部分说明:

堆栈是内存中用于链接的堆栈段的一部分 程序。软件约定通常使用 堆栈帧,由两个寄存器组成——一个堆栈帧基 指针(rBP)和堆栈指针(rSP)-


rbp
包含基址如果不使用No,
mov
完全有效,并且是英特尔语法中的实际操作码。在AT&T语法中,当上下文可以告诉操作数大小时,也不需要后缀,就像在Intel语法中一样。