# Function
## Function Call
- Stack vs register calling convention
- Wether the arguments are stored on the stack or in the registers.
- Refer to the ABI convention.
- May be alternated in the program, e.g. [[x86]] offers `cdecl` and `fastcall`
instruction
- Register calling is faster for leaf functions (don't call function and don't
access memory)
- Reg Calling is likely to be used in architectures that have abundant
registers.
- Stack Calling Convention
- Save caller saved registers.
- Push args in reverse order
- Call the function = `PUSH PC`, and `JUMP f`
- Leave room for local variables
- Save callee saved registers registers in the stack.
- Such "preamble" is common across languages, and can be used to identify
function calls even without debugging symbols.
- Register Calling Convention
- Save registers
- Move n args to `R{0..n}`
- Additional args are pushed to stack
- Call `f`
- Before pushing local variables to the stack, save space for args, as they
need to be saved when calling a new function before return!
- What happens on stack
- `CALL` instruction pushes return address to stack
- `PUSH %rbp`
- `MOV %rsp %rbp` - new stack frame
- `MOV %rbp %rsp` - clean up frame
- `POP %rbp` - go back to previous stack frame1
- `RET`