.text main: subu $sp, $sp, 32 # スタック・フレームは32 バイト長 sw $ra, 20($sp) # 戻りアドレスを退避 sw $fp, 16($sp) # 古いフレーム・ポインタを退避 addiu $fp, $sp, 28 # フレーム・ポインタを設定 li $a0, 10 # 引数(10) を$a0 に収める jal fact # 階乗関数を呼出す la $a0, $LC # フォーマット文字列のアドレスを$a0 に move $a1, $v0 # fact の結果を$a1 に収める jal printf # printf 関数を呼出す lw $ra, 20($sp) # 戻りアドレスを復元 lw $fp, 16($sp) # フレーム・ポインタを復元 addiu $sp, $sp, 32 # スタック・フレームをポップ jr $ra # 呼出し側へ戻る .rdata $LC: .ascii "The factorial of 10 is %d\n\000" .text fact: subu $sp, $sp, 32 # スタック・フレームは32 バイト長 sw $ra, 20($sp) # 戻りアドレスを退避 sw $fp, 16($sp) # フレーム・ポインタを退避 addiu $fp, $sp, 28 # フレーム・ポインタを設定 sw $a0, 0($fp) # 引数(n) を退避 lw $v0, 0($fp) # n をロードする bgtz $v0, $L2 # n > 0 の場合に分岐 li $v0, 1 # 1 を返す j $L1 # 戻り処理にジャンプ $L2: lw $v1, 0($fp) # n をロードする subu $v0, $v1, 1 # n-1 を計算 move $a0, $v0 # 値を$a0 に収める jal fact # 階乗関数を呼出す lw $v1, 0($fp) # n をロードする mul $v0, $v0, $v1 # fact(n-1) * n を計算 $L1: # 結果は$v0 に収められている lw $ra, 20($sp) # 戻りアドレスを復元 lw $fp, 16($sp) # フレーム・ポインタを復元 addiu $sp, $sp, 32 # スタック・フレームをポップ jr $ra # 呼出し元へ戻る