アセンブリ言語で手続きを使う
SPIMは日本語でコメントしてあるとフリーズした。
.text .globl main main: li $a0, 0 #引数レジスタに引数を格納 li $a1, 3 li $a2, 2 li $a3, 4 jal leaf_example #手続きに制御を移す。$raに次の命令のアドレスを格納する。 add $a0, $v0, $zero li $v0, 1 syscall #結果をコンソールに出力する。 jr $ra leaf_example: addi $sp, $sp, -12 #手続内で使用するレジスタをスタックに退避する。 sw $t0, 8($sp) sw $t1, 4($sp) sw $s0, 0($sp) add $t0, $a0, $a1 #($a0 + $a1) - ($a2 + $a3)を計算する。 add $t1, $a2, $a3 sub $s0, $t0, $t1 add $v0, $s0, $zero #結果を値レジスタに格納する。 lw $s0, 0($sp) #退避したレジスタを元に戻す。 lw $t1, 4($sp) lw $t0, 8($sp) jr $ra #制御を呼び出し元に戻す。
C言語で書くとこんな感じ
#include <stdio.h> int leaf_example(int g, int h, int i, int j) { int f; f = (g + h) - (i + j); return f; } int main(int argc, char *args[]) { int g = 0; int h = 3; int i = 2; int j = 4; int a; a = leaf_example(g, h, i, j); printf("%d", a); }
パターソン&ヘネシー本の2章8節あたりを参照