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