Procedures
CALL and RET
CALL pushes the return address and jumps to the procedure. RET pops the return address and jumps back to it. Together they nest calls to any depth:
call double_it
; rax now holds the result
double_it:
add rax, rax
ret
Stack frames
A procedure that needs locals builds a frame: save RBP, copy RSP into RBP, reserve space with SUB, and unwind with the mirror image in reverse:
my_proc:
push rbp
mov rbp, rsp
sub rsp, 32
; ... body ...
mov rsp, rbp ; or LEAVE
pop rbp
ret
The calling convention
On Linux x86-64 (System V ABI), integer arguments arrive in RDI, RSI, RDX, RCX, R8, R9, and the return value leaves in RAX. RBX, RBP, and R12-R15 are callee-saved: use them, but save and restore them first.
Next: LEA and addressing modes
Article author: Arthur Isaev