While investigating a crash, I came across the following code snippet and immediately recognized that the mov instruction should actually be movq to get the correct 64-bit register operation.
#elif defined(__x86_64__)
unsigned long rbp;
__asm__ volatile ("mov %%rbp, %0" : "=r" (rbp));
sp = (void **) rbp;
#else
Further to this, I also found documentation that claims that the rbp register for x86-64 is general purpose and does not contain the address of the current frame. I have also found documentation that claims that rbp does contain the address of the current frame. Can someone clarify?
Regarding the first part of your question (
movqinstead ofmov), the assembler (as, in this case), will recognize that your operand is 64 bits, and will correctly usemovq.movis not a valid instruction, it’s a way to tell the assembler “use the rightmovvariant depending on the operands”.Regarding the second part, it’s actually both: it’s a general purpose register, in the sense that it can hold any value. It is also used as a stack-frame base pointer. The ‘2.4 Stack operation’ section of the AMD64 Application programming manual says: