45
制御の流れ (分岐命令) (教科書3.5節)

制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

制御の流れ(分岐命令)

(教科書3.5節)

Page 2: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサの基本構成要素

レジスタ

PCデコーダ

・・・

プロセッサ

主記憶ALU

ALUで計算されるデータを記憶

プログラムの命令とデータを格納.

算術演算や論理演算を実行

命令レジスタ

PCの指す番地から取得した命令を保持

命令レジスタの内容(取得した命令)を解読

次に実行する命令の番地を記憶

PC: Program Counter

Page 3: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

命令の実行手順

・・・

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

アドレス 主記憶

0x00104

0x00108

0x0010c

実際には,各命令は2進表現でメモリに格納されている

レジスタ

0x00104

デコーダ

プロセッサ

ALU

PC

命令レジスタ

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

Page 4: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

命令の実行手順

レジスタ

0x00104

デコーダ

add $t0, $s1, $s2・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00104

PC

命令レジスタ

0x00108

0x0010c

PCの指す番地から取得した命令を保持 実行する命令の

アドレス

ALU

実際には,各命令は2進表現でメモリに格納されている

Page 5: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

命令の実行手順

レジスタ

0x00108

デコーダ

add $t0, $s1, $s2・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレスPC

命令レジスタ

0x00104

0x00108

0x0010c

次命令の取得にそなえてPCを更新

ALU

プロセッサ

実際には,各命令は2進表現でメモリに格納されている

Page 6: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

ALU

命令の実行手順

レジスタ

0x00108

デコーダ

add $t0, $s1, $s2・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

アドレスPC

命令レジスタ 主記憶

0x00104

0x00108

0x0010c取得した命令を解読(s1とs2を加算し,t0へ格納)

プロセッサ

実際には,各命令は2進表現でメモリに格納されている

Page 7: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

ALU

命令の実行手順

レジスタ

0x00108

デコーダ

add $t0, $s1, $s2・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

アドレスPC

命令レジスタ 主記憶

0x00104

0x00108

0x0010c加算

プロセッサ

実際には,各命令は2進表現でメモリに格納されている

Page 8: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

命令の実行手順

レジスタ

0x00108

デコーダ

sub $t1, $t0, $s3・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00104

0x00108

PC

命令レジスタ

0x0010c

PCの指す番地から取得した命令を保持 実行する命令の

アドレス

ALU

実際には,各命令は2進表現でメモリに格納されている

Page 9: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

命令の実行手順

レジスタ

0x0010c

デコーダ

sub $t1, $t0, $s3・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレスPC

命令レジスタ

0x00104

0x00108

0x0010cALU

次命令の取得にそなえてPCを更新

プロセッサ

実際には,各命令は2進表現でメモリに格納されている

Page 10: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

ALU

命令の実行手順

レジスタ

0x0010c

デコーダ

sub $t1, $t0, $s3・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

アドレスPC

命令レジスタ 主記憶

0x00104

0x00108

0x0010c取得した命令を解読(t0とs3を減算し,t1へ格納)

プロセッサ

実際には,各命令は2進表現でメモリに格納されている

Page 11: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

ALU

命令の実行手順

レジスタ

0x0010c

デコーダ

sub $t1, $t0, $s3・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

アドレスPC

命令レジスタ 主記憶

0x00104

0x00108

0x0010c減算

プロセッサ

実際には,各命令は2進表現でメモリに格納されている

Page 12: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

命令の実行手順

レジスタ

0x0010c

デコーダ

lw $t1, 320($s4)・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

add $t0, $s1, $s2

sub $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00104

0x00108

0x0010c

PC

命令レジスタ

PCの指す番地から取得した命令を保持 実行する命令の

アドレス

ALU

以降,繰り返し・・・

実際には,各命令は2進表現でメモリに格納されている

Page 13: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

逐次制御だけで十分なのか?

命令実行に関する基本動作主記憶に格納された命令を1個ずつ,順番に実行する(逐次制御)

全ての場合に対応できるのだろうか?

lw $t0, 8 ($s4) add $t0, $t0, $s1add $t1, $s3, $s3add $t1, $t1, $t1add $t1, $t1, $s4lw $t1, 0 ($t1)add $t1, $t1, $s2sub $t1, $t0, $t1sw $t1, 320 ($s4)

A[80] = (g + A[2]) – (h + A[i]);

逐次制御で問題なし!

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

elsef = g – h;

???逐次制御だけでは対応できない!条件に応じて分岐する必要がある!

Page 14: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

MIPSの命令(一部)

命令区分 命令 例 意味

add add $s1, $s2, $s3 $s1 = $s2 + $s3

Subtract sub $s1, $s2, $s3 $s1 = $s2 – $s3

load word lw $s1, 100($s2) $s1に,メモリの[$s2+100]番地のワードデータを読込み

store word sw $s1, 100($s2) メモリの[$s2+100]番地に,$s1のワードデータを書込み

set on less than slt $s1, $s2, $s3 もし、$s2<$s3なら$s1=1, 以外なら$s1=0

jump j L Lにジャンプ無条件

ジャンプ jump register jr $s1 $s1の値が示すアドレスにジャンプ

branch on equal beq $s1, $s2, L もし、$s1==$s2ならLへ分岐条件分岐

データ転送

branch on not equal

bne $s1, $s2, L もし、$s1!=$s2ならLへ分岐

算術演算

$s1~$s3は汎用レジスタ

Page 15: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

ラベル名

ラベル名: 命令やデータが配置されている主記憶上の番地につけられた名前.

add $s0, $s0, $s1

addi $s4, $zero, 1

add $s1, $s1, $s0

sub $s0, $s0, $s4

bne $s0, $s4, L1

add $s0, $s0, $s1

addi $s4, $zero, 1

add $s1, $s1, $s0

sub $s0, $s0, $s4

bne $s0, $s4, 108番地

100

104

108

112

116

ラベル定義 ラベル参照

ラベル名はアセンブラによって実際の番地に変換される.

L1:

Page 16: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

条件分岐命令(1)

add $s1, $s2, $s3add $t0, $s1, $s4lw $t1, 8 ($s5)sub $t1, $t1, $t0

条件分岐命令がない場合

①②③④

add $s1, $s2, $s3beq $s1, $s6, GoToadd $t0, $s2, $s4sw $t0, 8 ($s5)

条件分岐命令がある場合

①②

③④

GoTo:add $s4, $t4, $t3sw $s4, 8 ($s5)

命令実行の流れ

②で分岐条件が成立した場合

分岐条件が不成立の場合

①②③④

Page 17: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

レジスタ$s0の値と$s1の値を比較して,同じであればラベルL1へ分岐(PCの値を設定)

レジスタ$s0の値と$s1の値を比較して,同じでなければラベルL1へ分岐(PCの値を設定)

例)

beq $s0, $s1, L1

bne $s0, $s1, L1

条件分岐命令(2)

$s0 = $s1Yes

No

次の命令 ラベルL1の番地

beq $s0, $s1, L1

$s0 ≠ $s1Yes

No

次の命令 ラベルL2の番地

bne $s0, $s1, L2

beq: Branch on EQual

bne: Branch on Not Equal

Page 18: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00104

デコーダ

・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00400

PC

命令レジスタ

0x00104

0x00108

0x0010c

実際には,各命令は2進表現でメモリに格納されている

ALU

lw $t1, 120($s4)

・・・

L1

Page 19: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00104

デコーダ

beq $t0, $s1, L1・・・

1.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00104

0x00400

PC

命令レジスタ

0x00108

0x0010c

実際には,各命令は2進表現でメモリに格納されている

PCの指す番地から取得した命令を保持 実行する命令の

アドレス

ALU

lw $t1, 120($s4)

・・・

L1

Page 20: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00108

デコーダ

beq $t0, $s1, L1・・・

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00400

PC

命令レジスタ

0x00104

0x00108

0x0010cALU

lw $t1, 120($s4)

・・・

L11.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

次命令の取得にそなえてPCを更新

実際には,各命令は2進表現でメモリに格納されている

Page 21: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00108

デコーダ

beq $t0, $s1, L1・・・

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00400

PC

命令レジスタ

0x00104

0x00108

0x0010cALU

lw $t1, 120($s4)

・・・

L11.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

取得した命令を解読(t0==s1ならL1へ分岐)

実際には,各命令は2進表現でメモリに格納されている

Page 22: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00108

デコーダ

beq $t0, $s1, L1・・・

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00400

PC

命令レジスタ

0x00104

0x00108

0x0010cALU

lw $t1, 120($s4)

・・・

L11.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

比較(結果は一致!)

実際には,各命令は2進表現でメモリに格納されている

Page 23: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00400

デコーダ

beq $t0, $s1, L1・・・

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00400

PC

命令レジスタ

0x00104

0x00108

0x0010cALU

lw $t1, 120($s4)

・・・

L11.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

分岐先アドレスに更新!

実際には,各命令は2進表現でメモリに格納されている

比較(結果は一致!)

Page 24: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

プロセッサ

条件分岐命令(3)

レジスタ

0x00400

デコーダ

lw $t1, 120($s4)・・・

beq $t0, $s1, L1

add $t1, $t0, $s3

lw $t1, 320($s4)

・・・

主記憶アドレス

0x00104

0x00108

0x0010c

0x00400

PC

命令レジスタ

ALU

lw $t1, 120($s4)

・・・

L11.命令の取得:PCが指すアドレスの値をメモリから命令レジスタへ取得.同時に,次命令の取得に備えてPCの値を更新(例えば+4)

2.命令の解読:命令レジスタの値をデコード

3.命令の実行:解読結果に従って実行

PCの指す番地から取得した命令を保持 実行する命令の

アドレス

実際には,各命令は2進表現でメモリに格納されている

Page 25: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

レジスタ$s1の値と$s2の値を比較して,$s1<$s2であれば$s0に値「1」を,そうでなければ値「0」を格納(分岐条件の設定に利用)

例)

条件分岐命令(4)

slt: Set on Less Than$s1 < $s2

Yes No

$s0 ← 1 $s0 ← 0

slt $s0, $s1, $s2

Page 26: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

無条件分岐命令(1)

add $s1, $s2, $s3add $t0, $s1, $s4lw $t1, 8 ($s5)sub $t1, $t1, $t0

分岐命令がない場合

①②③④

add $s1, $s2, $s3j GoToadd $t0, $s2, $s4sw $t0, 8 ($s5)

無条件分岐命令がある場合

①②

③④

GoTo:add $s4, $t4, $t3sw $s4, 8 ($s5)

命令実行の流れ

常に分岐先を実行

Page 27: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

常にラベルL1へ分岐(PCの値を設定)

常に$s0に格納されている番地へ分岐(PCの値を設定)

例)

無条件分岐命令(2)

j: Jump

jr: Jump Register

j L1

jr $s0

Page 28: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

アセンブリ言語プログラムを書いてみよう!

問題:以下,4つの場合に関して,slt命令,beq命令,または,bne命令を用いてアセンブリ言語プログラムを作成せよ.なお,常にゼロの値を保持するレジスタ($zero)を用いて良い.

①「$s0 < $s1」 ならラベルLへ分岐②「$s0 > $s1」 ならラベルLへ分岐③「$s0 <= $s1」 ならラベルLへ分岐④「$s0 >= $s1」 ならラベルLへ分岐

Page 29: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

アセンブリ言語プログラムを書いてみよう!

解答①

slt $t0, $s0, $s1bne $t0, $zero, L

$s0<$s1なら$t0←1,それ以外なら$t0←0

$t0≠$Zero(つまり$t0=1)ならLへ分岐

問題:以下,4つの場合に関して,slt命令,beq命令,または,bne命令を用いてアセンブリ言語プログラムを作成せよ.なお,常にゼロの値を保持するレジスタ($zero)を用いて良い.

①「$s0 < $s1」 ならラベルLへ分岐②「$s0 > $s1」 ならラベルLへ分岐③「$s0 <= $s1」 ならラベルLへ分岐④「$s0 >= $s1」 ならラベルLへ分岐

解答②

slt $t0, $s1, $s0bne $t0, $zero, L

$t0≠$Zero(つまり$t0=1)ならLへ分岐

$s1<$s0なら$t0←1,それ以外なら$t0←0

Page 30: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

アセンブリ言語プログラムを書いてみよう!

解答③

slt $t0, $s1, $s0beq $t0, $zero, L

$s1<$s0なら$t0←1,それ以外なら$t0←0

$t0=$Zero(つまり$t0=0)ならLへ分岐

問題:以下,4つの場合に関して,slt命令,beq命令,または,bne命令を用いてアセンブリ言語プログラムを作成せよ.なお,常にゼロの値を保持するレジスタ($zero)を用いて良い.

①「$s0 < $s1」 ならラベルLへ分岐②「$s0 > $s1」 ならラベルLへ分岐③「$s0 <= $s1」 ならラベルLへ分岐④「$s0 >= $s1」 ならラベルLへ分岐

解答④slt $t0, $s0, $s1beq $t0, $zero, L

$s0<$s1なら$t0←1,それ以外なら$t0←0

$t0=$Zero(つまり$t0=0 )ならLへ分岐

⇒$s0>$s1でない

⇒$s0<$s1でない

Page 31: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の goto 文

ラベル名で指定するところに飛ぶ.

goto L100;

...

L100: xxxx

j L100

L100: xxxx

Page 32: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の if 文(1)

式の値が真(0以外の整数)ならば else の前を実行する.式の値が偽(0)ならば else の後を実行する.文が複数ある場合は中括弧でくくる.

if (式) if (式) {文; 文;

else ... 文; }

else {文;...

}

式の値が偽のときに特にすることがなければ,else 以降は省略してもよい.

省略可能

Page 33: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の if 文(2)

if (i == j) goto L1;

f = g + h;

L1: f = f – i;

beq $s3, $s4, L1

add $s0, $s1, $s2

L1: sub $s0, $s0, $s3

変数名 レジスタ

f $s0

g $s1

h $s2

i $s3

j $s4

Page 34: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の if 文(3)

if (i == j)

f = g + h;

else

f = g – h;

bne $s3, $s4, ELSE

add $s0, $s1, $s2

j EXIT

ELSE: sub $s0, $s1, $s2

EXIT: …

変数名 レジスタ

f $s0

g $s1

h $s2

i $s3

j $s4

Page 35: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の while 文(1)

1. 条件式を評価する.

2. 条件式の値が真(0以外の整数)ならば文または中括弧の中を実行する.偽(0)ならば文または中括弧の中を実行せずに次に進む(=ループを終了する).

3. 文または中括弧の中を実行した後は 1. に戻る.

while (条件式) while (条件式) {

文; 文;

...

}

条件式が「真」の間,繰り返し実行される

Page 36: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の while 文(2)

while (save[i] == k)

i = i + j;

WHILE: add $t0, $s3, $s3

add $t0, $t0, $t0

add $t0, $t0, $s6

lw $t1, 0($t0)

bne $t1, $s5, EXIT

add $s3, $s3, $s4

j WHILE

EXIT: …

save[i] の番地 = $s6 + $s3 * 4

変数名 レジスタ

i $s3

j $s4

k $s5

save[] 先頭番地 $s6

Page 37: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の switch 文(1)

式の値と同じ値の case のところに飛ぶ.該当する case がない場合は default のところに飛ぶ.

switch (式) {

case 値1:

...

case 値2:

...

case 値3:

...

default:

...

}

default 以降は不要ならば省略してもよい.

省略可能

式=値1のとき

式=値2のとき

式=値3のとき

式=その他の値のとき

Page 38: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の switch 文(2)

通常,switch 文の各 case のあとには break 文を入れる.

switch 文の中括弧の中で break 文を実行すると,中括弧の残りの実行を打ち切り,switch 文の外に飛ぶ.

switch (式) {

case 値1:

...

break;

case 値2:

...

break;

default:

...

}

式=値1のとき

式=値2のとき

式=その他の値のとき

Page 39: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の switch 文(3)

switch (k) {

case 0:

f = i + j;

break;

case 1:

f = g + h;

break;

case 2:

f = g – h;

break;

case 3:

f = i – j;

break;

}

•kが「0」の場合•f=i+j;だけが実行される

•kが「1」の場合•f=g+h;だけが実行される

•kが「2」の場合•f=g-h;だけが実行される

•kが「3」の場合•f=i-j;だけが実行される

•kが「0,1,2,3以外の場合」•switch本体は実行されない

Page 40: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の switch 文(4)

k == 0

f ← i + j

k == 1

k == 2

k == 3

f ← g + h

f ← g – h

f ← i – j

No

No

No

Yes

Yes

Yes

Yes

No時間が

かかる!!

Page 41: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の switch 文(5)

k

L0: f ← i + j L1: f ← g + h L2: f ← g – h L3: f ← i – j

k == 0 k == 1 k == 2 k == 3

添え字 登録番地

0 L0

1 L1

2 L2

3 L3

表に登録されている番地に分岐.

Page 42: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の switch 文(6)

変数名 レジスタ

f $s0

g $s1

h $s2

i $s3

j $s4

k $s5

番地表先頭番地 $s6

定数4 $t2

slt $t3, $s5, $zero

bne $t3, $zero, EXIT

slt $t3, $s5, $t2

beq $t3, $zero, EXIT

add $t0, $s5, $s5

add $t0, $t0, $t0

add $t0, $s6, $t0

lw $t1, 0($t0)

jr $t1

L0: add $s0, $s3, $s4

j EXIT

L1: add $s0, $s1, $s2

j EXIT

L2: sub $s0, $s1, $s2

j EXIT

L3: sub $s0, $s3, $s4

EXIT: …

添え字 登録番地

0 L0

1 L1

2 L2

3 L3

$s6 →

範囲検査

多岐分岐

Page 43: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の for 文(1)

1. 初期化式を評価する.

2. 条件式の値が真(0以外の整数)ならば文または中括弧の中を実行する.偽(0)ならば文または中括弧の中を実行せずに次に進む(=ループを終了する).

3. 文または中括弧の中を実行した後は,更新式を評価し,2. に戻る.

for (初期化式; 条件式; 更新式) for (初期化式; 条件式; 更新式) {

文; 文;

...

}

条件式が「真」の間,繰り返し実行される

Page 44: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の for 文(2)

for (i = 0, j = 15; i < j; i++, j--) {

tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

a[0]

a[1]

a[2]

a[14]

a[15]

i

j

Page 45: 制御の流れ (分岐命令)ocw.kyushu-u.ac.jp/menu/faculty/09/4/7.pdf · 九州大学工学部電気情報工学科(2006年度) プロセッサの基本構成要素 レジスタ

九州大学工学部電気情報工学科(2006年度)

コード例: C言語の for 文(3)

変数名 レジスタ

i $s0

j $s1

tmp $s2

a[] 先頭番地 $s3

定数15 $t4

定数1 $t5

add $s0, $zero, $zero

add $s1, $t4, $zero

FOR: slt $t0, $s0, $s1

beq $t0, $zero, EXIT

add $t1, $s0, $s0

add $t1, $t1, $t1

add $t1, $s3, $t1

lw $s2, 0($t1)

add $t2, $s1, $s1

add $t2, $t2, $t2

add $t2, $s3, $t2

lw $t3, 0($t2)

sw $t3, 0($t1)

sw $s2, 0($t2)

add $s0, $s0, $t5

sub $s1, $s1, $t5

j FOR

EXIT: …

初期化式

条件式

更新式

tmp = a[i]

a[i] = a[j]

a[j] = tmp