# 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`