= Solution
The <calling convention> passes the integer argument in \b[`$a0`], returns the result in \b[`$v0`], and uses \b[`jal` with `$ra`] for a call and its <return address>. The callee returns using `jr $ra`. Its <stack frame> grows downwards from `$sp` and must be removed before returning, restoring the caller's <stack pointer>.
The `$s` <processor registers> are <callee-saved registers>: a callee that uses `$s0` or `$s1` must restore their incoming values. The `$a`, `$v`, and `$t` <processor registers> are <caller-saved registers>; a caller must preserve any of their values that it needs after a call. Consequently `foo` keeps its own argument in `$s0` and the first call's result in `$s1`, where nested calls preserve them. Because a nested `jal` overwrites `$ra`, `foo` also saves its incoming <return address>. Every recursive activation has its own <stack frame>.
The supplied <MIPS instructions> use the paper's simplified convention: <pseudoinstructions> such as `subi` are accepted, and control transfers have no <branch delay slot>. The completed code below follows that convention. A hardware implementation with delayed control transfers requires suitable scheduling or `nop` instructions throughout the supplied code as well.
Back to article page