局所変数とはスタック上に確保されたものであり.globlで指定されるものとは異なる。
100までの総和を局所変数を使ってもとめる
int main()
{
print_int(sum(10));
print_string("\n");
return 0;
}
int sum(int n)
{
int s;
s = 0;
while(n>0){
s = s + n;
n = n - 1;
}
return s;
}
関数後ごとにスタックを設定してsum2で$v0に結果を書き込んで、mainの
move $a0, $v0
で返り値を受ける。
.data
_s1: .asciiz "\n"
.text
.globl main
main:
addiu $sp, $sp, -24
sw $ra, 20($sp)
sw $fp, 16($sp)
move $fp, $sp
li $a0, 100
jal sum
move $a0, $v0
li $v0, 1
syscall
la $a0, _s1
li $v0, 4
syscall
li $v0, 0
move $sp, $fp
lw $ra, 20($sp)
lw $fp, 16($sp)
addiu $sp, $sp, 24
jr $ra
sum:
addiu $sp, $sp, -12
sw $ra, 8($sp)
sw $fp, 4($sp)
move $fp, $sp
sw $zero, 0($fp)
_sum_1:
slt $t0, $zero, $a0
beq $t0, $zero, _sum_2
lw $t1, 0($fp)
add $t1, $t1, $a0
sw $t1, 0($fp)
addi $a0, $a0, -1
b _sum_1
_sum_2:
lw $v0, 0($fp)
move $sp, $fp
lw $ra, 8($sp)
lw $fp, 4($sp)
addiu $sp, $sp, 12
jr $ra
18章終了