x86-64 GNU汇编

Cha*_*lle 2 assembly gnu x86-64

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

#elif defined(__x86_64__)
    unsigned long rbp;
    __asm__ volatile ("mov %%rbp, %0" : "=r" (rbp));
    sp = (void **) rbp;
#else
Run Code Online (Sandbox Code Playgroud)

除此之外,我还发现文档声称rbpx86-64 的寄存器是通用的,不包含当前帧的地址.我还发现了声称rbp包含当前帧地址的文档.有人可以澄清吗?

Fre*_*rdt 7

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

关于第二部分,它实际上都是:它是一个通用寄存器,在某种意义上它可以保留任何价值.它还用作堆栈帧基指针.AMD64 应用程序编程手册的"2.4堆栈操作"部分说:

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