201
ソソソソソソソソソソソソソソソソ

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

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

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

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

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

アセンブリ言語 MIPS  アセンブリ言語による加算

add a, b, c 動作

a=b+c 減算

sub a, b, c 動作

a=b-c

オペランド

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

アセンブリ言語 MIPS  アセンブリ言語による加算

add a, b, c 動作

a=b+c 減算

sub a, b, c 動作

a=b-c

オペランドディスティネーション

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

アセンブリ言語 MIPS  アセンブリ言語による加算

add a, b, c 動作

a=b+c 減算

sub a, b, c 動作

a=b-c

オペランドソース

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

C からアセンブリ言語への変換

C コード

アセンブリコード

a=b+c;d=a-e;

add a,b,csub d,a,e

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

C からアセンブリ言語への変換

C コード

アセンブリコード

f=(g+h)-(i+j);

add t0,g,h# 一時変数 t0 に g+h を記憶add t1,i,j   # 一時変数 t1 に i+j を記憶sub f,t0,t1#f に t0 ー t1 を代入

実際は変数はレジスタに割り当てられる。

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

R 形式命令(復習) op: 命令の種類を表現。オペコード

( opcode )と呼ばれる。 rs: 第一ソースオペランドレジスタ。

$s0 、 $s1 、…、 $s7 rt: 第二ソースオペランドレジスタ。

$t0 、 $t1 、… $t7 rd: ディスティネーションレジスタ。 shamt: シフト量。 funct: ある op で表現される命令の機

能の区別をする表現。機能コードと呼ばれる。

op rs rt rd shamt funct

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

レジスタの利用 C コード

アセンブリコード

f=(g+h)-(i+j);

add $t0,$s1,$s2# 一時変数 t0 に g($s1)+h($s2) を記憶add $t1,$s3,$s4# 一時変数 t1 に i($s3)+j(S4) を記憶sub $s0,$t0,$t1#f($s0) に $t0 ー $t1 を代入

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

メモリにある値をオペランドとした演算

C コード

アセンブリコード

g=h+A[8];

lw $t0,8($s3)add $s1,$s2,$t0 #h は $s2 に格納

lw : 1 ワードをロードする命令この場合、 8+$s3 のアドレスをロードする今の例では 32bit を考えているので 1word は32bit

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

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

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

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

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

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

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

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

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

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

Page 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

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

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ベースレジスタ

オフセット

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

メモリのアドレス 通常、多くのアーキテクチャでは byte

つまり 8bit を単位としてアドレスを表現する。 今までの図はワードアドレスとしては正

しいがバイトアドレスとしては正しくない。 MIPS32 を仮定すると1word=32bit=4byte

先のアセンブリコードは本来以下のようになる。

プログラムカウンタもバイトアドレス表現の場合は 4 ずつ増える。

lw $t0,32($s3)add $s1,$s2,$t0 #h は $s2 に格納

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

バイトアドレス

PC

命令デコーダ

メモリ

メモリバス

r0

r1

r2

r3

r4

r5

r6

r7

ALU

演算処理

制御処理

0

31

63

3

28

60

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

ロードとストアが使用されるコード

C コード

アセンブリコードA[0]=h+A[8];

lw $t0,32($s3)add $t0,$s2,$t0 #h は $s2 に格納sw $t0,0($s3)

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

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

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

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

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

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

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

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

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

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

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

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

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

条件判定 (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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

条件判定 (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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

アドレス

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

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)

アドレス

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

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

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

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

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

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

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

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

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

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

ループから脱出

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

関数呼び出し 関数実行の手順

関数からアクセス可能な場所に引数を置く 関数に制御を移す 関数に必要なメモリ資源の確保 処理の実行 呼び出し元からアクセス可能な場所に結果を

置く 制御を元に戻す 

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

関数呼び出し用レジスタ 引数用レジスタ

$a0-$a3 返り値用レジスタ

$v0-$v1 アドレス退避用レジスタ

$ra

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

関数専用命令 ジャンプ & リンク命令  jal

$ra に PC+4 を退避して指定のアドレスを PC にセットする

関数から戻る時には  jr  命令を用いる。

jr $ra;

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

関数の呼び出し C コード int leaf_example(int g,int h,int i,int j){ int f; f=(g+h)-(i+j); return f}

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

関数の呼び出し 引数を受け取る

$a* 返り値を返す

$v* レジスタを関数呼び出し前の状況に戻

す スタックに退避

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

関数の呼び出し アセンブリコード

leaf_example:addi $sp,$sp, -12# スタックに3つスペース確保sw $t1,8($sp) # 関数で $t1 を使うのであらかじめ退避sw $t0,4($sp)# 同じく $t0 を退避sw $s0,0($sp)# 同様add $t0,$a0,$a1#$a0=g $a1=hadd $t1,$a2,$a3#$a2=i $a3=jsub $s0,$t0,$t1add $v0,$s0,$zero#f を返す $zero は 0

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

関数の呼び出し アセンブリコード

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   # 呼び出し元に戻る

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

より多くのレジスタが必要な場合

スタックの利用 スタック :LIFO(Last In First Out) の待ち

行列 スタックポインタ $sp で指定

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

プッシュ

高位アドレス

低位アドレス

$sp

1$sp

21

$sp

1  をプッシュ 2  をプッシュ

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

ポップ

高位アドレス

低位アドレス

$sp

1$sp

21

$sp

1  をポップ 2  をポップ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

呼び出し元に戻る 

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

関数の呼び出し 退避

復旧

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 を復旧しなくてもよいことにする

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

関数の呼び出し アセンブリコード

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   # 呼び出し元に戻る

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 の値が変わっている。

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

関数から関数を呼ぶ場合 $ra の保存をどうするか? 引数レジスタは? 返り値レジスタは?

全てスタックに入れる

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

例:再帰呼び出し 次の関数を考える。

アセンブリコード

int fact (int n){ if(n<1) return (1); else return (n*fact(n-1));}

fact: addi $sp,$sp,-8# スタックに 2 語分スペースを確保 sw $ra,4($sp) #$ra を退避 sw $a0,0($sp) # 引数 $a0 を退避 slti $t0,$a0,1 # n<1 かどうかチェック beq $t0,$zero,L1 # n が 1 以上なら L1 に飛ぶ addi $v0,$zero,1 # 戻り値レジスタに 1 をセット addi $sp,$sp,8 # スタックポインタを戻す# ここに処理が来る場合、 $a0 と  $ra は変わっていないので# 値の復旧は省略。jr $ra # 呼び出し元に制御を移す

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

例:再帰呼び出しfact: addi $sp,$sp,-8# スタックに 2 語分スペースを確保 sw $ra,4($sp) #$ra を退避 sw $a0,0($sp) # 引数 $a0 を退避 slti $t0,$a0,1 # n<1 かどうかチェック beq $t0,$zero,L1 # n が 1 以上なら L1 に飛ぶ addi $v0,$zero,1 # 戻り値レジスタに 1 をセット addi $sp,$sp,8 # スタックポインタを戻す# ここに処理が来る場合、 $a0 と  $ra は変わっていないので# 値の復旧は省略。jr $ra # 呼び出し元に制御を移すL1: addi $a0,$a0,-1 # n-1 を計算し引数レジスタにセット jal fact # 関数 fact を呼び出し lw $a0,0($sp) # 引数 n を復元 lw $ra,4($sp) # 戻りアドレスを復元 addi $sp,$sp,8 # スタックポインタを戻す mul $v0,$a0,$v0 # n*fact(n-1) を計算 jr $ra # 呼び出し元に return

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

例:再帰呼び出し 次の関数を考える。

n=2 で呼ぶ場合の動作

int fact (int n){ if(n<1) return (1); else return (n*fact(n-1));}

fact(2){ return(2*fact(1){ return (1*fact(0){ return 1; }) })}

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

再帰呼び出し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

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

MIPS   GCC  で遊んでみる.file 1 "func.c".section .mdebug.abi32.previous.text.align 2.globl leaf_example.ent leaf_example

leaf_example:.frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0.mask 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)

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

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"

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

最適化オプションを付けた場合

.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"

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

再帰呼び出し.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"

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

.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"

最適化オプションを付けた場合

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

$fp って何? フレームポインタという 関数内の変数だがレジスタに割り付け

られないものの格納に利用(ローカルなスタック) 配列 データ構造

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

フレームポインタの利用

高位アドレス

低位アドレス

$sp

ローカルな配列とデータ構

退避されたレジスタ

退避された戻りアドレス

退避された引数レジス

$sp

関数呼び出し中 関数呼び出し後

$fp

関数呼び出し前

$fp=$spとして $spを保存$fp

$sp

$fp

$sp=$fpとして $spを復旧

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

ヒープの利用 動的に確保可能なメモリ領域 malloc や  new  で確保

予約済みテキスト

静的データ

$sp

$gp

PC

0

スタック

動的データ

テキストセグメント: MIPS の機械語コード静的データセグメント : 静的変数、定数、配列

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

アドレシング MIPS で使えるアドレシングモード

レジスタアドレシング : オペランドにレジスタを取る

ベース相対アドレシング : 命令中の定数とレジスタの和によってオペランドのアドレスを指定

即値アドレシング : 命令中の定数をオペランドとする

PC 相対アドレシング :PC と命令中の定数によってアドレスを指定

擬似直接アドレシング : 命令中の 26 ビットと PC の上位ビットを連結したものがアドレス

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

おわり