Download presentation
Presentation is loading. Please wait.
1
ソフトウェアとのインターフェース
2
アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c
オペランド
3
アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c
ディスティネーション オペランド
4
アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c
ソース オペランド
5
Cからアセンブリ言語への変換 C コード アセンブリコード a=b+c; d=a-e; add a,b,c sub d,a,e
6
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を代入 実際は変数はレジスタに割り当てられる。
7
R形式命令(復習) op:命令の種類を表現。オペコード(opcode)と呼ばれる。
rs rt rd shamt funct R形式命令(復習) op:命令の種類を表現。オペコード(opcode)と呼ばれる。 rs:第一ソースオペランドレジスタ。$s0、$s1、…、$s7 rt:第二ソースオペランドレジスタ。$t0、$t1、…$t7 rd:ディスティネーションレジスタ。 shamt:シフト量。 funct:あるopで表現される命令の機能の区別をする表現。機能コードと呼ばれる。
8
レジスタの利用 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を代入
9
メモリにある値をオペランドとした演算 C コード アセンブリコード g=h+A[8]; lw $t0,8($s3)
add $s1,$s2,$t0 #h は$s2に格納 lw : 1ワードをロードする命令 この場合、8+$s3のアドレスをロードする 今の例では32bitを考えているので1wordは32bit
10
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]
11
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]
12
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]
13
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]
14
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]
15
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]
16
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] ベースレジスタ オフセット
17
メモリのアドレス 通常、多くのアーキテクチャではbyteつまり8bitを単位としてアドレスを表現する。
今までの図はワードアドレスとしては正しいがバイトアドレスとしては正しくない。MIPS32を仮定すると1word=32bit=4byte 先のアセンブリコードは本来以下のようになる。 プログラムカウンタもバイトアドレス表現の場合は4ずつ増える。 lw $t0,32($s3) add $s1,$s2,$t0 #h は$s2に格納
18
バイトアドレス メモリ 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
19
ロードとストアが使用されるコード C コード アセンブリコード A[0]=h+A[8]; lw $t0,32($s3)
add $t0,$s2,$t0 #h は$s2に格納 sw $t0,0($s3)
20
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
21
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
22
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
23
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
24
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
25
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
26
条件判定(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:
27
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
28
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
29
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
30
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
31
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
32
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
33
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
34
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
35
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
36
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
37
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
38
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
39
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
40
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
41
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
42
条件判定(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:
43
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 演算処理
44
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 演算処理
45
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 演算処理
46
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 演算処理
47
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 演算処理
48
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 演算処理
49
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 演算処理
50
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 演算処理
51
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 演算処理
52
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 演算処理
53
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 演算処理
54
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 演算処理
55
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 演算処理
56
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 演算処理
57
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 演算処理
58
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 演算処理
59
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 演算処理
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 演算処理
61
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 演算処理
62
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 演算処理
63
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 演算処理
64
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 演算処理
65
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 演算処理
66
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 演算処理
67
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 演算処理
68
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 演算処理
69
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 演算処理
70
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 演算処理
71
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 演算処理 アドレス
72
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 演算処理 アドレス
73
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 演算処理
74
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 演算処理
75
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 演算処理
76
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 演算処理
77
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 演算処理
78
関数呼び出し 関数実行の手順 関数からアクセス可能な場所に引数を置く 関数に制御を移す 関数に必要なメモリ資源の確保 処理の実行
呼び出し元からアクセス可能な場所に結果を置く 制御を元に戻す
79
関数呼び出し用レジスタ 引数用レジスタ $a0-$a3 返り値用レジスタ $v0-$v1 アドレス退避用レジスタ $ra
80
関数専用命令 ジャンプ&リンク命令 jal $raにPC+4を退避して指定のアドレスをPCにセットする
関数から戻る時には jr 命令を用いる。 jr $ra;
81
関数の呼び出し C コード int leaf_example(int g,int h,int i,int j){ int f;
f=(g+h)-(i+j); return f }
82
関数の呼び出し 引数を受け取る $a* 返り値を返す $v* レジスタを関数呼び出し前の状況に戻す スタックに退避
83
関数の呼び出し アセンブリコード 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
84
関数の呼び出し アセンブリコード 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 #呼び出し元に戻る
85
より多くのレジスタが必要な場合 スタックの利用 スタック:LIFO(Last In First Out)の待ち行列
スタックポインタ$spで指定
86
プッシュ 1 をプッシュ 2 をプッシュ 高位 アドレス $sp $sp 1 1 $sp 2 低位 アドレス
87
ポップ 1 をポップ 2 をポップ 高位 アドレス $sp $sp 1 1 $sp 2 低位 アドレス
88
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
89
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
90
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
91
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
92
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
93
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
94
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 演算処理
95
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
96
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
97
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
98
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
99
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
100
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
101
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
102
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
103
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
104
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
105
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
106
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
107
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
108
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
109
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
110
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
111
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
112
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
113
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
114
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
115
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
116
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
117
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
118
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
119
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
120
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
121
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
122
関数の呼び出し 退避 復旧 $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を復旧しなく てもよいことにする 毎回やるとウザイ
123
関数の呼び出し アセンブリコード 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 #呼び出し元に戻る
124
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
125
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
126
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
127
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
128
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
129
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
130
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
131
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
132
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
133
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
134
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
135
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
136
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
137
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
138
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
139
関数から関数を呼ぶ場合 $raの保存をどうするか? 引数レジスタは? 返り値レジスタは? 全てスタックに入れる
140
例:再帰呼び出し 次の関数を考える。 アセンブリコード 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 #呼び出し元に制御を移す
141
例:再帰呼び出し 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
142
例:再帰呼び出し 次の関数を考える。 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; }) }
143
再帰呼び出し 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
144
再帰呼び出し 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
145
再帰呼び出し 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
146
再帰呼び出し 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
147
再帰呼び出し 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
148
再帰呼び出し 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
149
再帰呼び出し 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
150
再帰呼び出し 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
151
再帰呼び出し 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
152
再帰呼び出し 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
153
再帰呼び出し 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
154
再帰呼び出し 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
155
再帰呼び出し 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
156
再帰呼び出し 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
157
再帰呼び出し 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
158
再帰呼び出し 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
159
再帰呼び出し 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
160
再帰呼び出し 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
161
再帰呼び出し 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
162
再帰呼び出し 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
163
再帰呼び出し 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
164
再帰呼び出し 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
165
再帰呼び出し 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
166
再帰呼び出し 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
167
再帰呼び出し 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
168
再帰呼び出し 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
169
再帰呼び出し 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
170
再帰呼び出し 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
171
再帰呼び出し 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
172
再帰呼び出し 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
173
再帰呼び出し 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
174
再帰呼び出し 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
175
再帰呼び出し 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
176
再帰呼び出し 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
177
再帰呼び出し 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
178
再帰呼び出し 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
179
再帰呼び出し 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
180
再帰呼び出し 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
181
再帰呼び出し 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
182
再帰呼び出し 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
183
再帰呼び出し 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
184
再帰呼び出し 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
185
再帰呼び出し 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
186
再帰呼び出し 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
187
再帰呼び出し 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
188
再帰呼び出し 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
189
再帰呼び出し 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
190
再帰呼び出し 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
191
再帰呼び出し 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
192
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 0x ,-8 .fmask 0x ,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)
193
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"
194
最適化オプションを 付けた場合 .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 0x ,0 .fmask 0x ,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" 最適化オプションを 付けた場合
195
再帰呼び出し 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 0xc ,-4 .fmask 0x ,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"
196
最適化オプションを 付けた場合 .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 0x ,-4 .fmask 0x ,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"
197
$fpって何? フレームポインタという 関数内の変数だがレジスタに割り付けられないものの格納に利用(ローカルなスタック) 配列 データ構造
198
フレームポインタの利用 高位 アドレス $sp=$fp として$sp を復旧 関数呼び出し前 関数呼び出し中 関数呼び出し後 $fp=$sp
を保存 $fp $fp $sp $fp $sp 退避された引数レジスタ 退避された戻りアドレス 退避されたレジスタ ローカルな配列とデータ構造 $sp 低位 アドレス
199
ヒープの利用 動的に確保可能なメモリ領域 malloc や new で確保 $sp スタック 動的データ $gp 静的データ
テキストセグメント:MIPSの機械語コード 静的データセグメント:静的変数、定数、配列 テキスト PC 予約済み
200
アドレシング MIPSで使えるアドレシングモード レジスタアドレシング:オペランドにレジスタを取る
ベース相対アドレシング:命令中の定数とレジスタの和によってオペランドのアドレスを指定 即値アドレシング:命令中の定数をオペランドとする PC相対アドレシング:PCと命令中の定数によってアドレスを指定 擬似直接アドレシング:命令中の26ビットとPCの上位ビットを連結したものがアドレス
201
おわり
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.