.text .align 2 _fact: sub $sp,$sp,32 # スタックを32バイト確保 sw $ra,4($sp) # 戻りアドレスを退避 sw $a0,0($sp) # 引数1 (= n) を退避 slt $t0,$a0,1 # (a) if (n < 1) $t0 = 1 beq $t0,$zero,L1 # (b) if ($t0 == 0) goto L1 # つまり ==> if (n >= 1) goto L1 add $v0,$zero,1 # 戻り値を 1にセット add $sp,$sp,32 # スタックを解放 j $ra # 呼出し元に戻る L1: sub $a0,$a0,1 # 引数 n = n - 1 jal _fact # fact(n - 1) lw $a0,0($sp) # 元の引数 n を復元 lw $ra,4($sp) # 戻りアドレスを復元 add $sp,$sp,32 # スタックを解放 mul $v0,$a0,$v0 # 戻り値 $v0 = n * fact(n - 1) j $ra # 呼出し元に戻る .data .align 2 $LC0: .ascii "The factorial of 10 is \000" .align 2 $LC1: .ascii "\n\000" .text .align 2 main: subu $sp,$sp,32 # スタックを 32バイト確保 sw $ra,20($sp) # 戻りアドレスを退避 la $a0,$LC0 li $v0,4 # print_string: 4 syscall li $a0,10 # jal _fact # $v0 = fact(10) move $a0,$v0 # li $v0,1 # print_int: 1 syscall la $a0,$LC1 li $v0,4 # print_string: 4 syscall lw $ra,20($sp) # 戻りアドレスを復元 addu $sp,$sp,32 # スタックを解放 j $ra # 呼出し元に戻る