main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
r1 3 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
r1 3 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
CPU Registers Memory 
??? 
r1 
r13 
r14 
100 
101 
102 
103 
104 
105 
r15 100 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100,101 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
100 
101 
102 
103 
104 
105 
r15 100,101 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
3 
100 
101 
102 
103 
104 
105 
r15 100,101 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
3 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
r15 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
3 
03 
r1 
r13 
r14 
CPU Registers Memory 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3, 2 
03 
r1 
r13 
r14 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03 
r1 
r13 
r14 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
100 
101 
102 
103 
104 
105 
r15 100,101,102,103 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
2 
100 
101 
102 
103 
104 
105 
r15 100,101,102,103 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
2 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2 
03,15 
r1 
r13 
r14 
3 
03 
2 
15 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15 
r1 
r13 
r14 
3 
03 
2 
15 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
03,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
03,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
03,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
1 
03,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
1 
03,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
1 
03,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
1 
03,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
1 
03,15,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0 
1 
03,15,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1 
1 
03,15,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1 
1 
03,15,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1 
1,1 
03,15,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1 
1,1 
03,15,15,15,15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1 
1,1 
03,15,15,15,15, 
15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1 
1,1 
03,15,15,15,15, 
15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2 
1,1 
03,15,15,15,15, 
15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2 
1,1 
03,15,15,15,15, 
15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2 
1,1,2 
03,15,15,15,15, 
15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2 
1,1,2 
03,15,15,15,15, 
15 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2 
1,1,2 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2 
1,1,2 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2,3 
1,1,2 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2,3 
1,1,2 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101, 
100 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2,3 
1,1,2,6 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101, 
100 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2,3 
1,1,2,6 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101, 
100 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2,3 
1,1,2,6 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101, 
100 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
main 
factorial 
store 
to stack 
recursive case 
load 
from stack 
base 
case 
Trace what happens for an input of 3... 
CPU Registers Memory 
3,2,1,0,1,2,3 
1,1,2,6 
03,15,15,15,15, 
15,03 
r1 
r13 
r14 
3 
03 
2 
15 
1 
100 
101 
102 
103 
104 
105 
100,101,102,103, 
104,105,106,105, 
104,103,102,101, 
100 
r15 
"the stack" 
input: x 
return value (the "result") 
return address (line #) 
the stack pointer 
00 read r1 
01 setn r15 100 
02 call r14 06 
03 write r13 
04 halt 
05 nop 
06 jnez r1 09 
07 setn r13 1 
08 jumpr r14 
09 addn r15 1 
10 storer r1 r15 
11 addn r15 1 
12 storer r14 r15 
13 addn r1 -1 
14 call r14 06 
15 loadr r14 r15 
16 addn r15 -1 
17 loadr r1 r15 
18 addn r15 -1 
19 mul r13 r13 r1 
20 jumpr r14 
106 
107 
It's easy to get lost! 
15 
Follow the line numbers below to stay on track... 
r15 
0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4

tracing a recursive factorial function in assembly language

  • 1.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 2.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... r1 3 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 3.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... r1 3 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 4.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 CPU Registers Memory ??? r1 r13 r14 100 101 102 103 104 105 r15 100 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 5.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 6.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 7.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 8.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 9.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100,101 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 10.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 100 101 102 103 104 105 r15 100,101 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 11.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 3 100 101 102 103 104 105 r15 100,101 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 12.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 3 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer r15 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 13.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... 3 03 r1 r13 r14 CPU Registers Memory 3 03 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 14.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3, 2 03 r1 r13 r14 3 03 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 15.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03 r1 r13 r14 3 03 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 16.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 17.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 18.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 100 101 102 103 104 105 r15 100,101,102 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 19.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 100 101 102 103 104 105 r15 100,101,102,103 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 20.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 2 100 101 102 103 104 105 r15 100,101,102,103 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 21.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 2 100 101 102 103 104 105 100,101,102,103, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 22.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2 03,15 r1 r13 r14 3 03 2 15 100 101 102 103 104 105 100,101,102,103, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 23.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15 r1 r13 r14 3 03 2 15 100 101 102 103 104 105 100,101,102,103, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 24.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15,15 r1 r13 r14 3 03 2 15 100 101 102 103 104 105 100,101,102,103, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 25.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15,15 r1 r13 r14 3 03 2 15 100 101 102 103 104 105 100,101,102,103, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 26.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15,15 r1 r13 r14 3 03 2 15 100 101 102 103 104 105 100,101,102,103, 104,105 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 27.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 28.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 29.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1 03,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 30.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 03,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 31.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 03,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 32.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 03,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 33.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 1 03,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 34.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 1 03,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 35.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 1 03,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 36.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 1 03,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 37.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 1 03,15,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 38.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0 1 03,15,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 39.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1 1 03,15,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 40.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1 1 03,15,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 41.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1 1,1 03,15,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 42.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1 1,1 03,15,15,15,15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 43.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1 1,1 03,15,15,15,15, 15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 44.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1 1,1 03,15,15,15,15, 15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 45.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2 1,1 03,15,15,15,15, 15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 46.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2 1,1 03,15,15,15,15, 15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 47.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2 1,1,2 03,15,15,15,15, 15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 48.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2 1,1,2 03,15,15,15,15, 15 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 49.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2 1,1,2 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 50.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2 1,1,2 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 51.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2,3 1,1,2 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 52.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2,3 1,1,2 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101, 100 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 53.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2,3 1,1,2,6 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101, 100 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 54.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2,3 1,1,2,6 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101, 100 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 55.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2,3 1,1,2,6 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101, 100 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4
  • 56.
    main factorial store to stack recursive case load from stack base case Trace what happens for an input of 3... CPU Registers Memory 3,2,1,0,1,2,3 1,1,2,6 03,15,15,15,15, 15,03 r1 r13 r14 3 03 2 15 1 100 101 102 103 104 105 100,101,102,103, 104,105,106,105, 104,103,102,101, 100 r15 "the stack" input: x return value (the "result") return address (line #) the stack pointer 00 read r1 01 setn r15 100 02 call r14 06 03 write r13 04 halt 05 nop 06 jnez r1 09 07 setn r13 1 08 jumpr r14 09 addn r15 1 10 storer r1 r15 11 addn r15 1 12 storer r14 r15 13 addn r1 -1 14 call r14 06 15 loadr r14 r15 16 addn r15 -1 17 loadr r1 r15 18 addn r15 -1 19 mul r13 r13 r1 20 jumpr r14 106 107 It's easy to get lost! 15 Follow the line numbers below to stay on track... r15 0, 1, 2, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 9, 10, 11, 12, 13, 14, 6, 7, 8 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 3, 4