rbp
is the frame pointer on x86_64. In your generated code, it gets a snapshot of the stack pointer (rsp
) so that when adjustments are made to rsp
(i.e. reserving space for local variables or push
ing values on to the stack), local variables and function parameters are still accessible from a constant offset from rbp
.
A lot of compilers offer frame pointer omission as an optimization option; this will make the generated assembly code access variables relative to rsp
instead and free up rbp
as another general purpose register for use in functions.
In the case of GCC, which I’m guessing you’re using from the AT&T assembler syntax, that switch is -fomit-frame-pointer
. Try compiling your code with that switch and see what assembly code you get. You will probably notice that when accessing values relative to rsp
instead of rbp
, the offset from the pointer varies throughout the function.