Document

ソフトウェアとのインターフェース
アセンブリ言語

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
の上位ビットを連結したものがアドレス
おわり