.text .align 2 print_string: li $v0,4 syscall j $ra print_int: li $v0,1 syscall j $ra _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: .asciiz "The factorial of 10 is" .align 2 $LC1: .asciiz "\n" .text .align 2 main: subu $sp,$sp,32 # スタックを 32バイト確保 sw $ra,20($sp) # 戻りアドレスを退避 la $a0,$LC0 jal print_string li $a0,10 # jal _fact # $v0 = fact(10) move $a0,$v0 jal print_int la $a0,$LC1 jal print_string lw $ra,20($sp) # 戻りアドレスを復元 addu $sp,$sp,32 # スタックを解放 j $ra # 呼出し元に戻る