Computer Architecture: MIPS Instruction Set Architecture
Computer Architecture: MIPS Instruction Set Architecture
6 $a2 27 $k1
7 $a3 28 $gp global pointer
Caller Callee
Caller Callee
Caller Callee
6 $a2 27 $k1
7 $a3 28 $gp global pointer (caller saves)
C Assembly
leaf_example :
sub $sp, $sp, 12
int leaf_example ( int g, sw $t1, 8($sp)
int h, int, i, int, j ) sw $t0, 4($sp)
{ sw $s0, 0($sp)
int f ; add $t0, $a0, $a1
add $t1, $a2, $a3
f = ( g + h ) – ( i + j ); sub $s0, $t0, $t1
return f; Actually add $v0, $s0, $zero
} Not needed lw $s0, 0($sp)
lw $t0, 4($sp)
lw $t1, 8($sp)
add $sp, $sp,12
jr $ra
FIGURE 3.12 Illustration of the stack allocation (a)before, (b)during, and (c)after the procedure call
C Assembly
int nonleaf_example (int arg) nonleaf_example:
{ sub $sp, $sp, 12
int result; sw $s0, 8($sp)
result = arg + sw $ra, 4($sp)
leaf_example(5,4,3,2); sw $a0, 0($sp)
return result; add $a0, $zero, 5
} add $a1, $zero, 4
add $a2, $zero, 3
add $a3, $zero, 2
jal leaf_example
lw $a0, 0($sp)
lw $ra, 4($sp)
add $s0, $a0, $v0
add $v0, $zero, $s0
lw $s0, 8($sp)
add $sp, $sp, 12
jr $ra
C Assembly
fact :
int fact ( int n ) sub $sp, $sp, 8
{ sw $ra, 4($sp)
if ( n < 1 ) return (1) ; sw $a0, 0($sp)
else slt $t0, $a0, 1
return ( n * fact ( n – 1) ); beq $t0, $zero, L1
add $v0, $zero, 1
} add $sp, $sp, 8
jr $ra
L1 : sub $a0, $a0, 1
jal fact
lw $a0, 0($sp)
lw $ra, 4($sp)
add $sp, $sp, 8
mul $v0, $a0, $v0
jr $ra
4 jal 0 4 jal 0
… … … …
… … … …
Relocation information Address Instruction type Dependency Relocation information Address Instruction type Dependency
0 lw X 0 sw Y
4 jal B 4 jal A
Symbol table Label Address Symbol table Label Address
X - Y -
B - A -