ソフトウェアとのインターフェース
アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c オペランド
アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c ディスティネーション オペランド
アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c ソース オペランド
Cからアセンブリ言語への変換 C コード アセンブリコード a=b+c; d=a-e; add a,b,c sub d,a,e
Cからアセンブリ言語への変換 C コード アセンブリコード f=(g+h)-(i+j); add t0,g,h#一時変数t0にg+hを記憶 add t1,i,j #一時変数t1にi+jを記憶 sub f,t0,t1#fにt0ーt1を代入 実際は変数はレジスタに割り当てられる。
R形式命令(復習) op:命令の種類を表現。オペコード(opcode)と呼ばれる。 rs rt rd shamt funct R形式命令(復習) op:命令の種類を表現。オペコード(opcode)と呼ばれる。 rs:第一ソースオペランドレジスタ。$s0、$s1、…、$s7 rt:第二ソースオペランドレジスタ。$t0、$t1、…$t7 rd:ディスティネーションレジスタ。 shamt:シフト量。 funct:あるopで表現される命令の機能の区別をする表現。機能コードと呼ばれる。
レジスタの利用 C コード アセンブリコード f=(g+h)-(i+j); add $t0,$s1,$s2#一時変数t0にg($s1)+h($s2)を記憶 add $t1,$s3,$s4#一時変数t1にi($s3)+j(S4)を記憶 sub $s0,$t0,$t1#f($s0)に$t0ー$t1を代入
メモリにある値をオペランドとした演算 C コード アセンブリコード g=h+A[8]; lw $t0,8($s3) add $s1,$s2,$t0 #h は$s2に格納 lw : 1ワードをロードする命令 この場合、8+$s3のアドレスをロードする 今の例では32bitを考えているので1wordは32bit
lw h 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 制御処理 s2 t0 s3 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ s1 s5 7 A[0] h 制御処理 s2 t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw h 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 s2 t0 制御処理 s3 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ lw $t0,8($s3) s1 s5 7 A[0] s2 h t0 制御処理 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw h 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 制御処理 s2 t0 s3 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ s1 s5 7 A[0] h 制御処理 s2 t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw h A[8] 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 制御処理 s2 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ s1 s5 7 A[0] h A[8] 制御処理 s2 t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
add 1 h A[8] 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 s2 t0 lw $t0,8($s3) add $s1,$s2,$t0 1 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 s1 s5 7 A[0] s2 h t0 A[8] 制御処理 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
add 1 h+A[8] h A[8] 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 lw $t0,8($s3) add $s1,$s2,$t0 1 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 h+A[8] s1 s5 7 A[0] s2 h t0 A[8] 制御処理 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw h 7 ベースレジスタ オフセット メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ lw $t0,8($s3) s1 s5 7 A[0] 制御処理 s2 h t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8] ベースレジスタ オフセット
メモリのアドレス 通常、多くのアーキテクチャではbyteつまり8bitを単位としてアドレスを表現する。 今までの図はワードアドレスとしては正しいがバイトアドレスとしては正しくない。MIPS32を仮定すると1word=32bit=4byte 先のアセンブリコードは本来以下のようになる。 プログラムカウンタもバイトアドレス表現の場合は4ずつ増える。 lw $t0,32($s3) add $s1,$s2,$t0 #h は$s2に格納
バイトアドレス メモリ 3 メモリバス PC r0 r4 命令 デコーダ r1 r5 31 28 制御処理 r2 r6 r3 r7 ALU メモリバス PC r0 r4 命令 デコーダ r1 r5 31 28 制御処理 r2 r6 r3 r7 ALU 演算処理 63 60
ロードとストアが使用されるコード C コード アセンブリコード A[0]=h+A[8]; lw $t0,32($s3) add $t0,$s2,$t0 #h は$s2に格納 sw $t0,0($s3)
lw h 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 s3 t1 ALU lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,0($s3) PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60
lw h A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 s3 t1 lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,0($s3) PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60
add 4 h A[8] 28 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 s2 t0 lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,0($s3) 4 PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 h A[8] 制御処理 s2 t0 A[1] A[2] s3 28 t1 A[3] A[4] + A[5] ALU A[6] A[7] 演算処理 63 A[8] 60
add 4 h h+A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,0($s3) 4 PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 h+A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60
sw 8 h h+A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,0($s3) 8 PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 h+A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60
sw 8 h h+A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,0($s3) 8 PC s0 s4 命令 デコーダ s1 s5 31 h+A[8] 28 s2 h t0 h+A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60
条件判定(if-then-else) C コード アセンブリコード if(i==j) f=g+h;else f=g-h; bne $s3,$s4,Else #i と j が等しくなければ Else add $s0,$s1,$s2 j Exit #Exit へジャンプ Else: sub $s0,$s1,$s2 Exit:
If-then-else (i==j) 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i==j) bne 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ bne 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i==j) 4 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 4 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i==j) 4 add 1 2 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 4 PC s0 s4 命令 デコーダ add 1 s1 s5 31 28 s2 2 制御処理 t0 s3 t1 + ALU 演算処理 63 60
If-then-else (i==j) 4 3 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 4 3 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i==j) 8 3 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 8 3 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i==j) 16 3 J 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 16 3 PC s0 s4 命令 デコーダ J 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i==j) 16 3 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 16 3 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60
If-then-else (i!=j) 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60
If-then-else (i!=j) bne 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ bne 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60
If-then-else (i!=j) 12 bne 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 PC s0 s4 命令 デコーダ bne 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60
If-then-else (i!=j) 12 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60
If-then-else (i!=j) 12 sub 1 2 1 - メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 PC s0 s4 命令 デコーダ sub 1 s1 s5 31 28 s2 2 制御処理 t0 s3 1 t1 - ALU 演算処理 63 60
If-then-else (i!=j) 12 -1 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 -1 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60
If-then-else (i!=j) 16 -1 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 16 -1 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60
条件判定(while) C コード アセンブリコード while(A[i]!=k) i+=1; Loop:sll $t1,$s3,2 #$3を2ビットシフト=i*4 add $t1,$t1,$s6 #ベースアドレス加算 lw $t0,0($t1)#A[i]をロード beq $t0,$s5,Exit#A[i] と k の比較 addi $s3,$s3,1 j Loop Exit:
while 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 s3 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 s3 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while sll 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 s2 s6 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ sll 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 4 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 4 add 1 3 2 40 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ add 1 3 s1 s5 31 28 2 40 制御処理 s2 s6 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 63 60 演算処理
while 4 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 lw 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ lw 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 12 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 12 beq 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ beq 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 16 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 16 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 16 addi 1 3 2 40 40 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 16 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ addi 1 3 s1 s5 31 28 2 40 制御処理 s2 s6 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 63 60 演算処理
while 16 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 16 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 20 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 20 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 20 J 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 20 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ J 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while sll 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ sll 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 1 3 2 40 1 4 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 4 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 4 1 3 2 40 1 4 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 4 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 4 add 1 3 2 40 1 4 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ add 1 3 s1 s5 31 28 2 40 制御処理 s2 s6 s3 1 s7 A[0]=0 A[1]=1 4 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 63 60 演算処理
while 4 1 3 2 40 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 1 3 2 40 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 lw 1 3 2 40 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ lw 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 1 s7 A[0]=0 A[1]=1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 1 3 2 40 1 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 12 1 3 2 40 1 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 8 1 3 2 40 2 2 48 ループ変数(i) アドレス メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 制御処理 s2 2 s6 40 s3 2 s7 A[0]=0 A[1]=1 2 48 t0 t1 A[2]=2 ループ変数(i) A[3]=3 ALU A[4]=4 63 60 演算処理 アドレス
while 8 1 3 2 40 3 3 52 ループ変数(i) アドレス メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 制御処理 s2 2 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 52 t0 t1 A[2]=2 ループ変数(i) A[3]=3 ALU A[4]=4 63 60 演算処理 アドレス
while 12 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 12 beq 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ beq 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 24 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) bne $t0,$s5,24 24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 24 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) bne $t0,$s5,24 24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
while 24 ループから脱出 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 sll $t1,$s3,2 add $t1,$t1,$s6 lw$t0,0($t1) beq $t0,$s5,24 24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ ループから脱出 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理
関数呼び出し 関数実行の手順 関数からアクセス可能な場所に引数を置く 関数に制御を移す 関数に必要なメモリ資源の確保 処理の実行 呼び出し元からアクセス可能な場所に結果を置く 制御を元に戻す
関数呼び出し用レジスタ 引数用レジスタ $a0-$a3 返り値用レジスタ $v0-$v1 アドレス退避用レジスタ $ra
関数専用命令 ジャンプ&リンク命令 jal $raにPC+4を退避して指定のアドレスをPCにセットする 関数から戻る時には jr 命令を用いる。 jr $ra;
関数の呼び出し C コード int leaf_example(int g,int h,int i,int j){ int f; f=(g+h)-(i+j); return f }
関数の呼び出し 引数を受け取る $a* 返り値を返す $v* レジスタを関数呼び出し前の状況に戻す スタックに退避
関数の呼び出し アセンブリコード leaf_example: addi $sp,$sp, -12#スタックに3つスペース確保 sw $t1,8($sp) #関数で$t1を使うのであらかじめ退避 sw $t0,4($sp)#同じく$t0を退避 sw $s0,0($sp)#同様 add $t0,$a0,$a1#$a0=g $a1=h add $t1,$a2,$a3#$a2=i $a3=j sub $s0,$t0,$t1 add $v0,$s0,$zero#f を返す$zeroは0
関数の呼び出し アセンブリコード add $t0,$a0,$a1#$a0=g $a1=h add $t1,$a2,$a3#$a2=i $a3=j sub $s0,$t0,$t1 add $v0,$s0,$zero#f を返す$zeroは0 lw $s0, 0($sp) #退避した値の復旧 lw $t0,4($sp) lw $t1,8($sp) addi $sp,$sp,12 #スタックポインタの復旧 jr $ra #呼び出し元に戻る
より多くのレジスタが必要な場合 スタックの利用 スタック:LIFO(Last In First Out)の待ち行列 スタックポインタ$spで指定
プッシュ 1 をプッシュ 2 をプッシュ 高位 アドレス $sp $sp 1 1 $sp 2 低位 アドレス
ポップ 1 をポップ 2 をポップ 高位 アドレス $sp $sp 1 1 $sp 2 低位 アドレス
Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0
Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0
Func call 68 9 2 jal 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ jal 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 制御処理 a0 t0 8 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0
Func call 9 2 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra ALU 60 演算処理 jal 0
Func call 9 2 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra ALU 60 演算処理 jal 0
Func call 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra ALU 60 演算処理 jal 0
Func call 4 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 4 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra ALU 60 演算処理
Func call 4 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 4 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 制御処理 a0 t0 8 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 48 52 56 ALU 7 60 演算処理 jal 0
Func call 8 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 8 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 48 52 8 56 ALU 7 60 演算処理 jal 0
Func call 12 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 12 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 48 9 52 8 56 ALU 7 60 演算処理 jal 0
Func call 16 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 16 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 16 9 2 add 3 8 1 7 52 72 + メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 16 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ add 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 + ALU 7 60 演算処理 jal 0
Func call 16 9 2 3 1 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 16 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 20 9 2 3 1 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 20 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 20 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 20 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 24 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 24 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 24 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 24 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 24 -4 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 24 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 28 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 28 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 28 -4 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 28 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 28 -4 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 28 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 32 -4 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 32 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 32 -4 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 32 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 32 9 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 32 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 36 9 2 -4 3 8 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 36 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 40 9 2 -4 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 40 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 44 9 2 -4 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 44 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 44 9 2 add -4 3 8 1 7 52 72 + メモリ メモリバス PC s0 a2 命令 デコーダ v0 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 44 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ add -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 + ALU 7 60 演算処理 jal 0
Func call 44 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 44 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 48 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 48 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 48 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 48 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 48 9 2 jr -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 48 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ jr -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 a0 t0 8 制御処理 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 72 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 72 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0
Func call 72 9 2 -4 3 8 1 7 64 72 呼び出し元に戻る メモリ メモリバス PC s0 a2 命令 デコーダ メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 72 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 呼び出し元に戻る 演算処理 jal 0
関数の呼び出し 退避 復旧 $t0-$t9を復旧しなく 毎回やるとウザイ てもよいことにする sw $t1,8($sp) #関数で$t1を使うのであらかじめ退避 sw $t0,4($sp)#同じく$t0を退避 sw $s0,0($sp)#同様 lw $s0, 0($sp) #退避した値の復旧 lw $t0,4($sp) lw $t1,8($sp) $t0-$t9を復旧しなく てもよいことにする 毎回やるとウザイ
関数の呼び出し アセンブリコード leaf_example: addi $sp,$sp, -4#スタックに1つスペース確保 sw $s0,0($sp)#同様 add $t0,$a0,$a1#$a0=g $a1=h add $t1,$a2,$a3#$a2=i $a3=j sub $s0,$t0,$t1 add $v0,$s0,$zero#f を返す$zeroは0 lw $s0, 0($sp) #退避した値の復旧 addi $sp,$sp,4 #スタックポインタの復旧 jr $ra #呼び出し元に戻る
Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0
Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 68 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 64 ra ALU 60 演算処理 jal 0
Func call 68 9 2 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 68 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 64 ra 72 ALU 60 演算処理 jal 0
Func call 9 2 3 8 1 7 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 60 ra 72 ALU 60 演算処理 jal 0
Func call 4 9 2 3 8 1 7 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 4 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 60 ra 72 ALU 9 60 演算処理 jal 0
Func call 8 9 2 3 1 1 7 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 8 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 7 sp 60 ra 72 ALU 9 60 演算処理 jal 0
Func call 12 9 2 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 12 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0
Func call 16 -4 2 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 16 -4 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0
Func call 20 -4 2 -4 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 20 -4 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,12 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0
Func call 24 9 2 -4 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 24 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,12 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0
Func call 28 9 2 -4 3 1 1 5 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 28 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0
Func call 72 9 2 -4 3 1 1 5 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 72 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0
Func call 72 9 2 -4 3 1 1 5 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 72 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0
Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 68 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 64 ra ALU 60 演算処理 jal 0
Func call 72 9 2 -4 3 1 初期状態と比較すると、s0の値は保存されているがt0およびt1の値が変わっている。 1 5 メモリ メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 72 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra 初期状態と比較すると、s0の値は保存されているがt0およびt1の値が変わっている。 a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0
関数から関数を呼ぶ場合 $raの保存をどうするか? 引数レジスタは? 返り値レジスタは? 全てスタックに入れる
例:再帰呼び出し 次の関数を考える。 アセンブリコード int fact (int n){ if(n<1) return (1); else return (n*fact(n-1)); } fact: addi $sp,$sp,-8#スタックに2語分スペースを確保 sw $ra,4($sp) #$ra を退避 sw $a0,0($sp) #引数 $a0 を退避 slti $t0,$a0,1 # n<1 かどうかチェック beq $t0,$zero,L1 # n が1以上なら L1 に飛ぶ addi $v0,$zero,1 #戻り値レジスタに1をセット addi $sp,$sp,8 #スタックポインタを戻す #ここに処理が来る場合、$a0 と $ra は変わっていないので #値の復旧は省略。 jr $ra #呼び出し元に制御を移す
例:再帰呼び出し fact: addi $sp,$sp,-8#スタックに2語分スペースを確保 sw $ra,4($sp) #$ra を退避 sw $a0,0($sp) #引数 $a0 を退避 slti $t0,$a0,1 # n<1 かどうかチェック beq $t0,$zero,L1 # n が1以上なら L1 に飛ぶ addi $v0,$zero,1 #戻り値レジスタに1をセット addi $sp,$sp,8 #スタックポインタを戻す #ここに処理が来る場合、$a0 と $ra は変わっていないので #値の復旧は省略。 jr $ra #呼び出し元に制御を移す L1: addi $a0,$a0,-1 # n-1 を計算し引数レジスタにセット jal fact #関数factを呼び出し lw $a0,0($sp) #引数 n を復元 lw $ra,4($sp) #戻りアドレスを復元 mul $v0,$a0,$v0 # n*fact(n-1)を計算 jr $ra #呼び出し元にreturn
例:再帰呼び出し 次の関数を考える。 n=2で呼ぶ場合の動作 int fact (int n){ if(n<1) return (1); else return (n*fact(n-1)); } fact(2){ return(2*fact(1){ return (1*fact(0){ return 1; }) }
再帰呼び出し 68 2 148 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 68 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0
再帰呼び出し 68 2 148 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 68 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0
再帰呼び出し 2 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0
再帰呼び出し 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0
再帰呼び出し 4 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 4 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0 72
再帰呼び出し 8 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 8 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 12 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 12 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 16 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 16 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 32 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 32 1 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 36 1 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 36 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72
再帰呼び出し 4 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 4 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 8 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 8 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 12 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 12 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 16 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 16 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 32 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 32 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 36 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 36 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 4 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 4 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 8 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 8 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 12 1 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 12 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 16 1 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 16 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 20 1 1 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 20 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 24 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 24 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 28 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 28 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 44 1 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 44 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 48 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 48 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 52 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 52 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 56 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 56 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 40 1 2 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 44 1 2 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 44 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 44 1 2 1 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 44 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 48 1 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 48 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 52 1 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 52 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 52 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 52 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 56 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 56 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 72 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 72 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
再帰呼び出し 72 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 72 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72
MIPS GCC で遊んでみる .file 1 "func.c" .section .mdebug.abi32 .previous .text .align 2 .globl leaf_example .ent leaf_example leaf_example: .frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0 .mask 0x40000000,-8 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-16 sw $fp,8($sp) move $fp,$sp sw $4,16($fp) sw $5,20($fp) sw $6,24($fp)
sw $7,28($fp) lw $3,16($fp) lw $2,20($fp) nop addu $4,$3,$2 lw $3,24($fp) lw $2,28($fp) addu $2,$3,$2 subu $2,$4,$2 sw $2,0($fp) lw $2,0($fp) move $sp,$fp lw $fp,8($sp) addiu $sp,$sp,16 j $31 .set macro .set reorder .end leaf_example .size leaf_example, .-leaf_example .ident "GCC: (GNU) 4.1.2"
最適化オプションを 付けた場合 .file 1 "func.c" .section .mdebug.abi32 .previous .text .align 2 .globl leaf_example .ent leaf_example leaf_example: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 .mask 0x00000000,0 .fmask 0x00000000,0 .set noreorder .set nomacro addu $4,$4,$5 addu $2,$6,$7 j $31 subu $2,$4,$2 .set macro .set reorder .end leaf_example .size leaf_example, .-leaf_example .ident "GCC: (GNU) 4.1.2" 最適化オプションを 付けた場合
再帰呼び出し lw $2,32($fp) nop bgtz $2,$L2 li $2,1 # 0x1 sw $2,16($fp) j $L4 addiu $2,$2,-1 move $4,$2 jal fact move $3,$2 mult $3,$2 mflo $4 sw $4,16($fp) 再帰呼び出し .file 1 "recursion.c" .section .mdebug.abi32 .previous .text .align 2 .globl fact .ent fact fact: .frame $fp,32,$31 # vars= 8, regs= 2/0, args= 16, gp= 0 .mask 0xc0000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-32 sw $31,28($sp) sw $fp,24($sp) move $fp,$sp sw $4,32($fp) $L4: lw $2,16($fp) move $sp,$fp lw $31,28($sp) lw $fp,24($sp) addiu $sp,$sp,32 j $31 nop .set macro .set reorder .end fact .size fact, .-fact .ident "GCC: (GNU) 4.1.2"
最適化オプションを 付けた場合 .file 1 "recursion.c" .section .mdebug.abi32 .previous .text .align 2 .globl fact .ent fact fact: .frame $sp,24,$31 # vars= 0, regs= 2/0, args= 16, gp= 0 .mask 0x80010000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-24 sw $31,20($sp) sw $16,16($sp) bgtz $4,$L2 move $16,$4 j $L4 li $2,1 # 0x1 最適化オプションを 付けた場合 $L2: jal fact addiu $4,$4,-1 mult $16,$2 mflo $2 $L4: lw $31,20($sp) lw $16,16($sp) j $31 addiu $sp,$sp,24 .set macro .set reorder .end fact .size fact, .-fact .ident "GCC: (GNU) 4.1.2"
$fpって何? フレームポインタという 関数内の変数だがレジスタに割り付けられないものの格納に利用(ローカルなスタック) 配列 データ構造
フレームポインタの利用 高位 アドレス $sp=$fp として$sp を復旧 関数呼び出し前 関数呼び出し中 関数呼び出し後 $fp=$sp を保存 $fp $fp $sp $fp $sp 退避された引数レジスタ 退避された戻りアドレス 退避されたレジスタ ローカルな配列とデータ構造 $sp 低位 アドレス
ヒープの利用 動的に確保可能なメモリ領域 malloc や new で確保 $sp スタック 動的データ $gp 静的データ テキストセグメント:MIPSの機械語コード 静的データセグメント:静的変数、定数、配列 テキスト PC 予約済み
アドレシング MIPSで使えるアドレシングモード レジスタアドレシング:オペランドにレジスタを取る ベース相対アドレシング:命令中の定数とレジスタの和によってオペランドのアドレスを指定 即値アドレシング:命令中の定数をオペランドとする PC相対アドレシング:PCと命令中の定数によってアドレスを指定 擬似直接アドレシング:命令中の26ビットとPCの上位ビットを連結したものがアドレス
おわり