Function Prolog / Epilog

Source: pb_cg_emit_function_prolog (pb_codegen.c:1272), pb_cg_emit_routine epilogue (pb_codegen.c:1400)

Standard Prolog (frame <= 4096 bytes)

push   rbp
mov    rbp, rsp
sub    rsp, <frame_size>

Large Frame Prolog (with stack probing)

; Required when frame > 4096 to touch each guard page
push   rbp
mov    rbp, rsp
mov    r11, <frame_size>
__pb_stack_probe_loop_N:
cmp    r11, 4096
jle    __pb_stack_probe_last_N
sub    rsp, 4096
mov    r10, [rsp]                       ; touch page
sub    r11, 4096
jmp    __pb_stack_probe_loop_N
__pb_stack_probe_last_N:
sub    rsp, r11
mov    r10, [rsp]                       ; touch final page

Parameter Capture (Win64 ABI)

; First 4 integer/pointer args:
mov    [rbp - param0_offset], rcx       ; arg 1
mov    [rbp - param1_offset], rdx       ; arg 2
mov    [rbp - param2_offset], r8        ; arg 3
mov    [rbp - param3_offset], r9        ; arg 4

; Args 5+ from caller's stack frame:
mov    rax, [rbp + 48]                  ; arg 5 (above shadow space + return addr)
mov    [rbp - param4_offset], rax
mov    rax, [rbp + 56]                  ; arg 6
mov    [rbp - param5_offset], rax

; First 4 float args:
movsd  [rbp - fparam0_offset], xmm0     ; FP arg 1
movsd  [rbp - fparam1_offset], xmm1     ; FP arg 2
movsd  [rbp - fparam2_offset], xmm2     ; FP arg 3
movsd  [rbp - fparam3_offset], xmm3     ; FP arg 4

Standard Epilogue

; Load return value from [rbp - return_offset]
mov    rax, [rbp - return_offset]        ; integer return
; or: movsd xmm0, [rbp - return_offset]  ; float return
add    rsp, <frame_size>
pop    rbp
ret

PBMAIN Epilogue

mov    rcx, [rbp - return_offset]        ; exit code
call   [__imp_ExitProcess]
xor    rax, rax                           ; unreachable
add    rsp, <frame_size>
pop    rbp
ret

Stack Frame Layout

; RBP-based frame (grows downward):
[rbp + 16]    ; return address (from CALL)
[rbp + 8]     ; saved RBP
[rbp]         ; <- RBP points here
[rbp - 8]     ; return value slot
[rbp - 16]    ; GOSUB depth counter
[rbp - 24]    ; GOSUB stack base (32 entries * 8 bytes)
[rbp - N]     ; local variables and temporaries
; ... variable offsets ...
[rbp - frame_size] ; <- RSP after prolog