5.48 · exercise

Call yourself

Write fact, a subroutine that computes a factorial by calling itself. main reads n, calls fact, and prints n! = and the answer.

Each call to fact needs its own frame (lr must survive the recursive bl), and n has to outlive the recursive call, which means a callee-saved register that you save on entry and restore on exit. main itself keeps n in x19 across the call, so a fact that forgets to restore it prints the wrong n. Base case first: when n is 1 or less, the answer is 1. Otherwise it is n * fact(n - 1).

What is checked

  • 10! = 3628800 printed on its own line for the 10 in the stdin box
  • the program exits cleanly
  • a real call chain does it: fact builds a frame (stp) and calls itself (bl fact inside fact), with no precomputed answer
  • the same holds for other values of n you do not see, from 0 up to 20

specification

stdin10
stdoutprints the right output
exitexits with the right code
sourceuses bl fact in fact
sourceuses stp in fact
sourcedoes not hardcode the answer
hiddenright output and exit code on 4 more inputs you do not see

We run your program on the input above and on the hidden ones, and compare what it does. Nothing is matched against a stored solution.

loading editor...

regfile

N clearZ clearC clearV clear

x0–x30 are the integer registers.

X0arg00x0000000000000000
X1arg10x0000000000000000
X2arg20x0000000000000000
X3arg30x0000000000000000
X4arg40x0000000000000000
X5arg50x0000000000000000
X6arg60x0000000000000000
X7arg70x0000000000000000
X8ind0x0000000000000000
X90x0000000000000000
X100x0000000000000000
X110x0000000000000000
X120x0000000000000000
X130x0000000000000000
X140x0000000000000000
X150x0000000000000000
X16ip00x0000000000000000
X17ip10x0000000000000000
X18pr0x0000000000000000
X190x0000000000000000
X200x0000000000000000
X210x0000000000000000
X220x0000000000000000
X230x0000000000000000
X240x0000000000000000
X250x0000000000000000
X260x0000000000000000
X270x0000000000000000
X280x0000000000000000
X29fp0x0000000000000000
X30lr0x0000000000000000
SP0x0000000080000000
PC0x0000000000400000
console

Output prints here as your program runs.

Press step or run under the editor, or feed stdin from the box below.

not assembled

Open in playground