Calling Conventions
Cheatsheet
| Platform | Return Value | Parameter Registers | Additional Parameters | Stack Alignment | Scratch Registers | Preserved Registers | Call List |
|---|---|---|---|---|---|---|---|
| System V i386 | eax, edx | none | stack (right to left)1 | eax, ecx, edx | ebx, esi, edi, ebp, esp | ebp | |
| System V X86_642 | rax, rdx | rdi, rsi, rdx, rcx, r8, r9 | stack (right to left)1 | 16-byte at call3 | rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 | rbx, rsp, rbp, r12, r13, r14, r15 | rbp |
| Microsoft x64 | rax | rcx, rdx, r8, r9 | stack (right to left)1 | 16-byte at call3 | rax, rcx, rdx, r8, r9, r10, r11 | rbx, rdi, rsi, rsp, rbp, r12, r13, r14, r15 | rbp |
| ARM (32-bit) | r0, r1 | r0, r1, r2, r3 | stack | 8 byte4 | r0, r1, r2, r3, r12 | r4, r5, r6, r7, r8, r9, r10, r11, r13, r14 |
System V i386
- Parametres are pushed to stack from right to left
- Caller cleans the stack
- Callee is free to modify parametres
- Caller must not assume they stayed the same!
- Scratch registers are
EAX,ECXandEDX- Caller must preserve if needed
- Function preserves
EBX,ESI,EDIandEBP - Return value in
EAX- If 64bit value: higher 32bits in
EDX
- If 64bit value: higher 32bits in
- Functions push
ebpsuch that the caller-return-eip is 4 bytes above it, and setebpto the address of the saved ebp.- Allows iterating through the existing stack frames.
- Can be eliminated by specifying the -fomit-frame-pointer GCC option.
CDECL
Caller's responsibilities
- Push parameters in reverse order (last parameter pushed first)
- Perform the call
- Pop the parameters, use them, or simply increment ESP to remove them (stack clearing)
- The return value is stored in EAX
Callee's responsibilities (callee is the routine being called)
- Store caller's EBP on the stack
- Save current ESP in EBP
- Code, storing local data on the stack
- For a fast exit load the old ESP from EBP, else pop local data elements
- Pop the old EBP and return – store return value in EAX
It looks like this in assembly (NASM)
SECTION .text
caller:
; ...
; Caller responsibilities:
PUSH 3 ; push the parameters in reverse order
PUSH 2
CALL callee ; perform the call
ADD ESP, 8 ; stack cleaning (remove the 2 words)
; ... Use the return value in EAX ...
callee:
; Callee responsibilities:
PUSH EBP ; store caller's EBP
MOV EBP, ESP ; save current stack pointer in EBP
; ... Code, store return value in EAX ...
; Callee responsibilities:
MOV ESP, EBP ; remove an unknown number of local data elements
POP EBP ; restore caller's EBP
RET ; return
Sources
- https://wiki.osdev.org/Stack
- https://wiki.osdev.org/Calling_Conventions
- https://wiki.osdev.org/System_V_ABI
TODO: Check if SysV ABI and CDECL are really the same thing?