Procedure Call & Return
Last updated
Last updated
int fact (int n)
{
if (n < 1)
return (1);
else
return (n * fact(n
1));
}fact:
addi $sp, $sp, -8 // 스택 포인터를 이동시켜 스택에 기존 레지스터 값을 저장해둔다.
sw $ra, 4($sp)
sw $a0 0($sp)
slti $t0, $a0, 1 // 2보다 작을 경우 $t0 에 1을 대입한다
beq $t0, $zero, L1
addi $v0, $zero, 1 // $v0이 최종 결과가 될 레지스터이며 해당 값에 1을 넣는다.
jr $ra
L1:
addi $sp, $sp,
8
sw $ra, 4($sp)
sw $a0, 0($sp)
addi $a0, $a0,
1
jal fact
lw $a0, 0($sp) // 스택 데이터를 레지스터에 복원한다.
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $a0, $v0 // 최종 결과 값에 현재 $a0을 곱한다. 여기가 재귀적으로 호출되면서 팩토리얼 결과가 계산된다.
jr $ra