アセンブリ言語で手続きを使う

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節あたりを参照