x86-64 GNU汇编

问题描述:

在调查崩溃时,我遇到以下代码片断,并立即认识到mov指令实际上应该是movq以获得正确的64位寄存器操作。x86-64 GNU汇编

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

此外此,我也发现,声称,rbp寄存器x86-64的是通用和不包含当前帧的地址文档。我还发现文档声称rbp确实包含当前帧的地址。有人可以澄清吗?

+0

'rbp'包含基地址,如果你不'使用['-fomit-frame-pointer'(或类似的选项)](http://stackoverflow.com/questions/14666665/trying-to-understand-gcc-option-fomit-frame-pointer)http:/ /stackoverflow.com/questions/579262/what-is-the-purpose-of-the-frame-pointer – 2015-04-16 17:05:00

关于你的问题的第一部分(的movq代替mov),汇编器(如,在这种情况下),会认识到你的操作数是64位,并会正确使用movqmov不是一个有效的指令,它是告诉汇编程序“根据操作数使用正确的mov变体”的一种方式。

关于第二部分,它实际上是两个:它是一个通用寄存器,它可以保存任何值。它也被用作栈帧基址指针。的AMD64 Application programming手册的“2.4协议栈操作”部分表示:

堆栈是存储器中的堆栈段,其用于链接 程序的一部分。软件约定通常定义使用 堆栈帧,它由两个寄存器-一个堆栈框架基座 指针(RBP)和堆栈指针(RSP)栈 -

+0

不,“mov”是完全有效的,并且是英特尔语法中的实际操作码。在AT&T语法中,当上下文可以指示操作数大小时,后缀也不是必需的,就像在Intel语法中一样。 [“如果没有指定后缀,并且指令没有内存操作数,则GAS会根据目标寄存器操作数(最终操作数)的大小推断操作数大小。”](https://en.wikibooks.org /维基/ X86_Assembly/GAS_Syntax#Operation_Suffixes) – 2015-04-16 17:14:25