Presentation is loading. Please wait.

Presentation is loading. Please wait.

ソフトウェアとのインターフェース.

Similar presentations


Presentation on theme: "ソフトウェアとのインターフェース."— Presentation transcript:

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 おわり


Download ppt "ソフトウェアとのインターフェース."

Similar presentations


Ads by Google