RIP addressing is always relative to RIP (64bit Instruction Pointer) register. So it can be use for global variables only. The 0 offset is equal to address of the following instruction after the RIP-addressed instruction. For example:
mov al,[rip+2] al=53 jmp short next (length=2 bytes) db 53 next: mov bl,[rip-7] (length=6 bytes) bl=53
You wouldn’t normally mix data right in with your code, except as an immediate, but this shows what would happen if you actually ran code with very small offsets.
In your code you cannot see and check offsets (you see four zeros) because you disassembled a .o
. Use objdump -drwC
to show symbol names / relocations when disassembling. They will be filled by the linker when you link this object into an executable.
Example for accessing locals relative to `rbp:
push rbp ;save rbp mov rbp,rsp ;rbp = pointer to return address (8 bytes) sub rsp,64 ;reserve 64 bytes for local variables mov rax,[rbp+8]; rax = the last stack-passed qword parameter (if any) mov rdx,[rbp]; rdx = return address mov rcx,[rbp-8]; rcx = first qword local variable (this is undefined now) mov r8, [rbp-16]; r8 = second qword local variable (this is undefined now) . . mov rsp,rbp pop rbp ret