This program demonstrates use of the stack and tests the JALR operation.
R1 | first argument |
---|---|
R2 | second argument |
R3 | return value |
R6 | stack pointer |
R7 | return address |
LI | R6 30 | ; R6 is the stack | |
---|---|---|---|
LI | R1 10 | ; first argument | |
LI | R2 5 | ; second argument | |
LI | R3 8 | ; address of function (L) | |
JALR | R7 R3 | ; call function | |
SWI | R3 31 | ; save return value | |
HALT | |||
NOP | |||
L: | ADD | R6 R6 R0 | ; push R6 (stack pointer) |
ADDI | R6 R6 -1 | ||
ADD | R6 R7 R0 | ; push R7 (return address) | |
ADDI | R6 R6 -1 | | |
ADD | R3 R1 R2 | ; body of function f(a,b) returns a+b | |
ADDI | R6 R6 1 | ; pop R7 from stack | |
ADD | R7 R6 R0 | | |
ADDI | R6 R6 1 | ; pop R6 from stack | |
ADD | R6 R6 R0 | ||
JALR | R0 R7 0 | ; return from function |
# | pc | op | rd | qd | immed |
---|---|---|---|---|---|
1 | 00 | LI | 6 | 001E | 001E |
2 | 01 | LI | 1 | 000A | 000A |
3 | 02 | LI | 2 | 0005 | 0005 |
4 | 03 | LI | 3 | 0008 | 0008 |
5 | 04 | JALR | 7 | 0005 | 0060 |
6 | 08 | ADD | 6 | 001E | 00C0 |
7 | 09 | ADDI | 6 | 001D | 00DF |
8 | 0A | ADD | 6 | 0005 | 00E0 |
9 | 0B | ADDI | 6 | 0004 | 00DF |
10 | 0C | ADD | 3 | 000F | 0028 |
11 | 0D | ADDI | 6 | 0005 | 00C1 |
12 | 0E | ADD | 7 | 0005 | 00C0 |
13 | 0F | ADDI | 6 | 0006 | 00C1 |
14 | 10 | ADD | 6 | 0006 | 00C0 |
15 | 11 | JALR | 0 | 0012 | 00E0 |
16 | 05 | SWI | 0 | 001F | 001F |
format | r1 | r2 | r3 | r4 | r5 | r6 | r7 |
---|---|---|---|---|---|---|---|
hex | 000A | 0005 | 000F | 4444 | 5555 | 0006 | 0005 |
decimal | 10 | 5 | 15 | 17476 | 21845 | 6 | 5 |
addr | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0000 | 1E1E | 190A | 1A05 | 1B08 | 5F60 | 131F | 0000 | 0000 | 46C0 | 3EDF | 46E0 | 3EDF | 4328 | 3EC1 | 47C0 | 3EC1 |
0010 | 46C0 | 58E0 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 000F |