-------------------------------------------------------------------- /* 二つのint値を加算する */ int tasu(int a, int b) { int ans; ans = a + b; return ans; } --------------------------------------------------------------------
-------------------------------------------------------------------- # 値の交換 .align 2 #以下のプログラムをワード境界へ配置 .globl tasu #関数tasuを外部から参照可能とする .ent tasu #関数tasuの始まり .frame $fp,16,$31 #スタックフレームの設定 .mask 0x40000000,-8 #R30のマスク .fmask 0x00000000,0 #浮動小数レジスタのマスク tasu: subu $sp,$sp,16 #SP←SP-16(ワークを16バイト確保) sw $fp,8($sp) #FPを保存 move $fp,$sp sw $4,16($fp) sw $5,20($fp) lw $2,16($fp) #スタックに積まれた値を取り出す lw $3,20($fp) # 〃 addu $2,$2,$3 #R2 ← R2 + R3 sw $2,0($fp) #いったんストアして、 lw $2,0($fp) #またロード(なぜ?) j $skip $skip: move $sp,$fp #SP←FP lw $fp,8($sp) #FPを復帰 addu $sp,$sp,16 #SP←SP+16(確保していたワークを開放) j $31 #サブルーチンから戻る .end tasu #関数tasuの終わり --------------------------------------------------------------------moveはR3000には存在しない命令で、