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

Preview:

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 の上位ビットを連結したものがアドレス

おわり

Recommended