Upload
kieran-bradshaw
View
16
Download
0
Embed Size (px)
DESCRIPTION
ソフトウェアとのインターフェース. アセンブリ言語. MIPS アセンブリ言語による加算 add a, b, c 動作 a= b+c 減算 sub a, b, c 動作 a=b-c. オペランド. アセンブリ言語. MIPS アセンブリ言語による加算 add a, b, c 動作 a= b+c 減算 sub a, b, c 動作 a=b-c. ディスティネーション. オペランド. アセンブリ言語. MIPS アセンブリ言語による加算 add a, b, c 動作 a= b+c 減算 sub a, b, c 動作 a=b-c. - PowerPoint PPT Presentation
Citation preview
ソフトウェアとのインターフェース
アセンブリ言語 MIPS アセンブリ言語による加算
add a, b, c 動作
a=b+c 減算
sub a, b, c 動作
a=b-c
オペランド
アセンブリ言語 MIPS アセンブリ言語による加算
add a, b, c 動作
a=b+c 減算
sub a, b, c 動作
a=b-c
オペランドディスティネーション
アセンブリ言語 MIPS アセンブリ言語による加算
add a, b, c 動作
a=b+c 減算
sub a, b, c 動作
a=b-c
オペランドソース
C からアセンブリ言語への変換
C コード
アセンブリコード
a=b+c;d=a-e;
add a,b,csub d,a,e
C からアセンブリ言語への変換
C コード
アセンブリコード
f=(g+h)-(i+j);
add t0,g,h# 一時変数 t0 に g+h を記憶add t1,i,j # 一時変数 t1 に i+j を記憶sub f,t0,t1#f に t0 ー t1 を代入
実際は変数はレジスタに割り当てられる。
R 形式命令(復習) op: 命令の種類を表現。オペコード
( opcode )と呼ばれる。 rs: 第一ソースオペランドレジスタ。
$s0 、 $s1 、…、 $s7 rt: 第二ソースオペランドレジスタ。
$t0 、 $t1 、… $t7 rd: ディスティネーションレジスタ。 shamt: シフト量。 funct: ある op で表現される命令の機
能の区別をする表現。機能コードと呼ばれる。
op rs rt rd shamt funct
レジスタの利用 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
lwlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
7
0
0
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15
lwlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
7
0
0
0
00
lw $t0,8($s3)
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15
lwlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
7
0
0
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15
lwlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
7
0
A[8]
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15
addlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
7
0
A[8]
0
01
add $s1,$s2,$t
0
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15
addlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
h +A[8]
h
7
0
A[8]
0
01
add $s1,$s2,$t
0
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15
lwlw $t0,8($s3)add
$s1,$s2,$t0
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
7
0
0
0
00
lw $t0,8($s3)
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
7
15ベースレジスタ
オフセット
メモリのアドレス 通常、多くのアーキテクチャでは byte
つまり 8bit を単位としてアドレスを表現する。 今までの図はワードアドレスとしては正
しいがバイトアドレスとしては正しくない。 MIPS32 を仮定すると1word=32bit=4byte
先のアセンブリコードは本来以下のようになる。
プログラムカウンタもバイトアドレス表現の場合は 4 ずつ増える。
lw $t0,32($s3)add $s1,$s2,$t0 #h は $s2 に格納
バイトアドレス
PC
命令デコーダ
メモリ
メモリバス
r0
r1
r2
r3
r4
r5
r6
r7
ALU
演算処理
制御処理
0
31
63
3
28
60
ロードとストアが使用されるコード
C コード
アセンブリコードA[0]=h+A[8];
lw $t0,32($s3)add $t0,$s2,$t0 #h は $s2 に格納sw $t0,0($s3)
lwlw $t0,32($s3)add
$t0,$s2,$t0 sw $t0,0($s3)
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
28
0
0
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
lwlw $t0,32($s3)add
$t0,$s2,$t0 sw $t0,0($s3)
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
28
0
A[8]
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
addlw $t0,32($s3)add
$t0,$s2,$t0 sw $t0,0($s3)
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
28
0
A[8]
0
04PC
命令デコーダ
メモリ
メモリバス
+
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
addlw $t0,32($s3)add
$t0,$s2,$t0 sw $t0,0($s3)
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
28
0
h+A[8]0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
swlw $t0,32($s3)add
$t0,$s2,$t0 sw $t0,0($s3)
A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
28
0
h+A[8]0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
swlw $t0,32($s3)add
$t0,$s2,$t0 sw $t0,0($s3)
h+A[8]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A[8]
0
0
h
28
0
h+A[8]0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
条件判定 (if-then-else)
C コード
アセンブリコード
if(i==j) f=g+h;else f=g-h;
bne $s3,$s4,Else #i と j が等しくなければ Elseadd $s0,$s1,$s2j Exit #Exit へジャンプElse: sub $s0,$s1,$s2Exit:
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
0
0
0
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
0
0
0
0
00
bne
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
0
0
0
0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
0
0
0
0
04
add
PC
命令デコーダ
メモリ
メモリバス
+
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 3
1
2
0
0
0
0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 3
1
2
0
0
0
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 3
1
2
0
0
0
0
016
J
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i==j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 3
1
2
0
0
0
0
016PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
1
0
0
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
1
0
0
0
00
bne
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
1
0
0
0
012
bne
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
1
0
0
0
012PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 0
1
2
1
0
0
0
012
sub
PC
命令デコーダ
メモリ
メモリバス
-
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 -1
1
2
1
0
0
0
012PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
If-then-else (i!=j)bne $s3,$s4,12add
$s0,$s1,$s2 J 16
sub $s0,$s1,$s2 -1
1
2
1
0
0
0
016PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
t0
t1
ALU
演算処理
制御処理
0
31
63
3
28
60
条件判定 (while)
C コード
アセンブリコード
while(A[i]!=k) i+=1;
Loop:sll $t1,$s3,2 #$3 を 2 ビットシフト =i*4add $t1,$t1,$s6 # ベースアドレス加算lw $t0,0($t1)#A[i] をロードbeq $t0,$s5,Exit#A[i] と k の比較addi $s3,$s3,1j LoopExit:
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 0t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 0t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
00
sll
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 0t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 0t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
04
add
PC
命令デコーダ
メモリ
メモリバス
+
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 0t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
08
lw
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
012PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
012
beq
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
016PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
0
3
40
0
016
addi
PC
命令デコーダ
メモリ
メモリバス
+
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
016PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
020PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
020
J
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
00
sll
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 40t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
00PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 4t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 4t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
04
add
PC
命令デコーダ
メモリ
メモリバス
+
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 4t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
04PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
08
lw
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
0 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
1 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
1
3
40
0
012PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
1 44t0 t1
while sll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
2
3
40
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
2 48t0 t1ループ変数 (i)
アドレス
while sll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
3
3
40
0
08PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
3 52t0 t1ループ変数 (i)
アドレス
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
3
3
40
0
012PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
3 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
3
3
40
0
012
beq
PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
3 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
bne $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
3
3
40
0
024PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
3 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
bne $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
3
3
40
0
024PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
3 44t0 t1
whilesll $t1,$s3,2
add $t1,$t1,$s6 lw$t0,0($t1)
beq $t0,$s5,24
addi $s3,$s3,1
j 0
A[0]=0A[1]=1A[2]=2A[3]=3A[4]=4
0
1
2
3
3
40
0
024PC
命令デコーダ
メモリ
メモリバス
s0
s1
s2
s3
s4
s5
s6
s7
ALU
演算処理
制御処理
0
31
63
3
28
60
3 44t0 t1
ループから脱出
関数呼び出し 関数実行の手順
関数からアクセス可能な場所に引数を置く 関数に制御を移す 関数に必要なメモリ資源の確保 処理の実行 呼び出し元からアクセス可能な場所に結果を
置く 制御を元に戻す
関数呼び出し用レジスタ 引数用レジスタ
$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=hadd $t1,$a2,$a3#$a2=i $a3=jsub $s0,$t0,$t1add $v0,$s0,$zero#f を返す $zero は 0
関数の呼び出し アセンブリコード
add $t0,$a0,$a1#$a0=g $a1=hadd $t1,$a2,$a3#$a2=i $a3=jsub $s0,$t0,$t1add $v0,$s0,$zero#f を返す $zero は 0lw $s0, 0($sp) # 退避した値の復旧lw $t0,4($sp)lw $t1,8($sp)addi $sp,$sp,12 # スタックポインタの復旧jr $ra # 呼び出し元に戻る
より多くのレジスタが必要な場合
スタックの利用 スタック :LIFO(Last In First Out) の待ち
行列 スタックポインタ $sp で指定
プッシュ
高位アドレス
低位アドレス
$sp
1$sp
21
$sp
1 をプッシュ 2 をプッシュ
ポップ
高位アドレス
低位アドレス
$sp
1$sp
21
$sp
1 をポップ 2 をポップ
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
268PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 0ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
268PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 0ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
268
jal
PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 0ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
20PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
20PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
20PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
9
0
0
1
3
8
7
24PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
7
jal 0
9
0
0
1
3
8
7
24PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra 485256
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
87
jal 0
9
0
0
1
3
8
7
28PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra 485256
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
8
7
212PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra 485256
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
8
7
216PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
8
7
216
add
PC
命令デコーダ
メモリ
メモリバス
+
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
1
7
216PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
1
7
220PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
1
5
220PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
1
5
224PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
1
5
224PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
-4
0
0
1
3
1
5
224PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
0
0
1
3
1
5
228PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
-4
0
0
1
3
1
5
228PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
-4
-4
0
1
3
1
5
228PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
-4
-4
0
1
3
1
5
232PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
-4
-4
0
1
3
1
5
232PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
1
5
232PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
5
236PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
240PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
244PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
244
add
PC
命令デコーダ
メモリ
メモリバス
+
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
52sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
244PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
248PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
248PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
248
jr
PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
272PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
987
jal 0
9
-4
0
1
3
8
7
272PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
呼び出し元に戻る
関数の呼び出し 退避
復旧
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=hadd $t1,$a2,$a3#$a2=i $a3=jsub $s0,$t0,$t1add $v0,$s0,$zero#f を返す $zero は 0lw $s0, 0($sp) # 退避した値の復旧addi $sp,$sp,4 # スタックポインタの復旧jr $ra # 呼び出し元に戻る
Func calladdi $sp,$sp, -12sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp,$sp,12jr $ra
jal 0
9
0
0
1
3
8
7
268PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 0ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
jal 0
9
0
0
1
3
8
7
268PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 0ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
jal 0
9
0
0
1
3
8
7
268PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
jal 0
9
0
0
1
3
8
7
20PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
0
0
1
3
8
7
24PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
0
0
1
3
1
7
28PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
0
0
1
3
1
5
212PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
-4
0
0
1
3
1
5
216PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,12jr $ra
9
jal 0
-4
-4
0
1
3
1
5
220PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,12jr $ra
9
jal 0
9
-4
0
1
3
1
5
224PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
60sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
-4
0
1
3
1
5
228PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
-4
0
1
3
1
5
272PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
-4
0
1
3
1
5
272PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
jal 0
9
0
0
1
3
8
7
268PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 0ra
Func calladdi $sp,$sp, -4sw $s0,0($sp)
add $t0,$a0,$a1add $t1,$a2,$a3sub $s0,$t0,$t1add $v0,$s0,$zero
lw $s0, 0($sp)
addi $sp,$sp,4
jr $ra
9
jal 0
9
-4
0
1
3
1
5
272PC
命令デコーダ
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理
0
28
60
64sp 72ra
初期状態と比較すると、 s0 の値は保存されているが t0 および t1 の値が変わっている。
関数から関数を呼ぶ場合 $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
例:再帰呼び出し 次の関数を考える。
n=2 で呼ぶ場合の動作
int fact (int n){ if(n<1) return (1); else return (n*fact(n-1));}
fact(2){ return(2*fact(1){ return (1*fact(0){ return 1; }) })}
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
068PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 0ra
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
068PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 0ra
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
04PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
08PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
012PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
016PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
2
0
0
0
0
032PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
032PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
036PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
04PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
08PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
012PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
016PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
1
0
0
0
0
032PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
0
0
032PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
0
0
036PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
0
0
00PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
124sp 40ra
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
0
0
04PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
124sp 40ra
40
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
0
0
08PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
124sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
1
0
012PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
124sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
0
0
0
0
1
0
016PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
124sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
0
0
0
1
0
020PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
124sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
0
0
0
1
0
024PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
0
0
0
1
0
028PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
0
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
0
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
0
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
044PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
132sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
048PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
052PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
056PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
1
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
2
0
0
1
0
040PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
2
0
0
1
0
044PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 40ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
2
0
0
1
0
044PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
140sp 72ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
2
0
0
1
0
048PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
1
2
0
0
1
0
052PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
2
2
0
0
1
0
052PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
2
2
0
0
1
0
056PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
2
2
0
0
1
0
072PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
040
1
40
2
72
7680
100
140
120
再帰呼び出しaddi $sp,$sp, -8sw $ra,4($sp)
sw $a0,0($sp)
slti $t0,$a0,1
beq $t0,$zero,32addi $v0,$zero,1addi $sp,$sp,8
jr $ra
addi $a0,$a0,-1 jal 0
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp,$sp,8
mul $v0,$a0,$v0jr $ra
jal 0
0
2
2
0
0
1
0
072PC
命令
メモリ
メモリバス
s0
v0
a0
a1
a2
a3
t0
t1
ALU
演算処理
制御処理28
60
148sp 72ra
040
1
40
2
72
7680
100
140
120
MIPS GCC で遊んでみる.file 1 "func.c".section .mdebug.abi32.previous.text.align 2.globl leaf_example.ent leaf_example
leaf_example:.frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0.mask 0x40000000,-8.fmask 0x00000000,0.set noreorder.set nomacro
addiu $sp,$sp,-16sw $fp,8($sp)move $fp,$spsw $4,16($fp)sw $5,20($fp)sw $6,24($fp)
sw $7,28($fp)lw $3,16($fp)lw $2,20($fp)nopaddu $4,$3,$2lw $3,24($fp)lw $2,28($fp)nopaddu $2,$3,$2subu $2,$4,$2sw $2,0($fp)lw $2,0($fp)move $sp,$fplw $fp,8($sp)addiu $sp,$sp,16j $31nop
.set macro
.set reorder
.end leaf_example
.size leaf_example, .-leaf_example
.ident "GCC: (GNU) 4.1.2"
最適化オプションを付けた場合
.file 1 "func.c"
.section .mdebug.abi32
.previous
.text
.align 2
.globl leaf_example
.ent leaf_exampleleaf_example:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
addu $4,$4,$5addu $2,$6,$7j $31subu $2,$4,$2
.set macro
.set reorder
.end leaf_example
.size leaf_example, .-leaf_example
.ident "GCC: (GNU) 4.1.2"
再帰呼び出し.file 1 "recursion.c".section .mdebug.abi32.previous.text.align 2.globl fact.ent fact
fact:.frame $fp,32,$31
# vars= 8, regs= 2/0, args= 16, gp= 0.mask 0xc0000000,-4.fmask 0x00000000,0.set noreorder.set nomacro
addiu $sp,$sp,-32sw $31,28($sp)sw $fp,24($sp)move $fp,$spsw $4,32($fp)
lw $2,32($fp)nopbgtz $2,$L2nop
li $2,1 # 0x1sw $2,16($fp)j $L4nop
$L2:lw $2,32($fp)nopaddiu $2,$2,-1move $4,$2jal factnop
move $3,$2lw $2,32($fp)nopmult $3,$2mflo $4sw $4,16($fp)
$L4:lw $2,16($fp)move $sp,$fplw $31,28($sp)lw $fp,24($sp)addiu $sp,$sp,32j $31nop
.set macro
.set reorder
.end fact
.size fact, .-fact
.ident "GCC: (GNU) 4.1.2"
.file 1 "recursion.c"
.section .mdebug.abi32
.previous
.text
.align 2
.globl fact
.ent factfact:
.frame $sp,24,$31# vars= 0, regs= 2/0, args= 16, gp= 0
.mask 0x80010000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-24sw $31,20($sp)sw $16,16($sp)bgtz $4,$L2move $16,$4
j $L4li $2,1 # 0x1
$L2:jal factaddiu $4,$4,-1
mult $16,$2mflo $2
$L4:lw $31,20($sp)lw $16,16($sp)j $31addiu $sp,$sp,24
.set macro
.set reorder
.end fact
.size fact, .-fact
.ident "GCC: (GNU) 4.1.2"
最適化オプションを付けた場合
$fp って何? フレームポインタという 関数内の変数だがレジスタに割り付け
られないものの格納に利用(ローカルなスタック) 配列 データ構造
フレームポインタの利用
高位アドレス
低位アドレス
$sp
ローカルな配列とデータ構
造
退避されたレジスタ
退避された戻りアドレス
退避された引数レジス
タ
$sp
関数呼び出し中 関数呼び出し後
$fp
関数呼び出し前
$fp=$spとして $spを保存$fp
$sp
$fp
$sp=$fpとして $spを復旧
ヒープの利用 動的に確保可能なメモリ領域 malloc や new で確保
予約済みテキスト
静的データ
$sp
$gp
PC
0
スタック
動的データ
テキストセグメント: MIPS の機械語コード静的データセグメント : 静的変数、定数、配列
アドレシング MIPS で使えるアドレシングモード
レジスタアドレシング : オペランドにレジスタを取る
ベース相対アドレシング : 命令中の定数とレジスタの和によってオペランドのアドレスを指定
即値アドレシング : 命令中の定数をオペランドとする
PC 相対アドレシング :PC と命令中の定数によってアドレスを指定
擬似直接アドレシング : 命令中の 26 ビットと PC の上位ビットを連結したものがアドレス
おわり