diff --git a/calling-convention/Output-explanation.md b/calling-convention/Output-explanation.md index 5d359ab..285a9cd 100644 --- a/calling-convention/Output-explanation.md +++ b/calling-convention/Output-explanation.md @@ -30,3 +30,30 @@ Before the call, the 4 caller-saved registers (R0-R3) are pushed onto the stack to preserve their values. `RS` points to position 4, reflecting those 4 entries. After `undo_function_call`, the stack is empty, `RS` returns to 0, and the result value `42` is successfully collected from `RA`. + +--- + +## TEST 2: 8 arguments, some overflow to the stack + +**Function signature:** `result = func(a, b, c, d, e, f, g, h)` + +**Output** +``` +===== TEST 2: 8 arguments, some on the stack ===== +=== State after do_function_call === +Registers used: ['RA', 'RB', 'RC', 'RD', 'R8', 'R9'] +Stack: [{'type': 'caller_saved', 'reg': 'R0', 'value': 0}, {'type': 'caller_saved', 'reg': 'R1', 'value': 0}, {'type': 'caller_saved', 'reg': 'R2', 'value': 0}, {'type': 'caller_saved', 'reg': 'R3', 'value': 0}, {'type': 'param', 'name': 'g', 'size': 64, 'value': 0}, {'type': 'param', 'name': 'h', 'size': 64, 'value': 0}] +RS points to: 6 +=== State after undo_function_call === +Clean stack: [] +RS: 0 +Collected result: {'result': {'type': 'result', 'value': 99}} +``` + +**Explanation:** +Spider provides 6 registers for passing arguments: RA, RB, RC, RD, R8, R9. +The first 6 arguments (a through f) fill all available registers. +Arguments `g` and `h`, which are 64-bit values, have no registers left and +are pushed onto the stack instead. `RS` points to 6, reflecting the 4 +caller-saved entries plus 2 stack parameters. After `undo_function_call`, +all stack entries are cleaned and the result `99` is collected from `RA`.