制御の流れ（分岐命令）（教科書3.5節）

プロセッサの基本構成要素
PCの指す番地から取得した命令を保持次に実行する命
令の番地を記憶プロセッサ
命令レジスタ
PC
デコーダ

ALU

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

レジスタ

・
・
・

命令レジスタの内容（取得した命令）を解読プログラムの命
令とデータを格納．

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

PC: Program Counter

九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタ

アドレス
PC
0x00104

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順

PCの指す番地から取得した命令を保持プロセッサ

命令レジスタ
add $t0, $s1, $s2

実行する命令の
アドレス

アドレス

PC
0x00104

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタ
add $t0, $s1, $s2

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

アドレスPC
0x00108

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタ
add $t0, $s1, $s2

アドレスPC
0x00108

デコーダ
ALU
取得した命令を解読（s1とs2を加算し，t0へ格納）

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタ
add $t0, $s1, $s2

アドレスPC
0x00108

デコーダ
加算

ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順

PCの指す番地から取得した命令を保持プロセッサ

命令レジスタsub $t1, $t0, $s3

実行する命令の
アドレス

アドレス

PC
0x00108

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタsub $t1, $t0, $s3

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

アドレスPC
0x0010c

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタsub $t1, $t0, $s3

アドレスPC
0x0010c

デコーダ
ALU
取得した命令を解読（t0とs3を減算し，t1へ格納）

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順
プロセッサ
命令レジスタsub $t1, $t0, $s3

アドレスPC
0x0010c

デコーダ
減算

ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）

主記憶

・・・
0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

命令の実行手順

PCの指す番地から取得した命令を保持プロセッサ

命令レジスタlw $t1, 320($s4)

実行する命令のアドレス

PC
0x0010c

・・・

デコーダ
ALU

主記憶

アドレス

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）0x00104

add $t0, $s1, $s2

0x00108

sub $t1, $t0, $s3

0x0010c

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

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

2.命令の解読：命令レジスタの値をデコード
3.命令の実行：解読結果に従って実行

以降，繰り返し・・・
九州大学工学部電気情報工学科（2006年度）

逐次制御だけで十分なのか？
z 命令実行に関する基本動作
z 主記憶に格納された命令を１個ずつ，順番に実行する（逐次制御）

z 全ての場合に対応できるのだろうか？
A[80] = (g + A[2]) – (h + A[i]);lw $t0, 8 ($s4)
add $t0, $t0, $s1
add $t1, $s3, $s3
add $t1, $t1, $t1
add $t1, $t1, $s4
lw $t1, 0 ($t1)
add $t1, $t1, $s2
sub $t1, $t0, $t1
sw $t1, 320 ($s4)

逐次制御で問題なし！

if (i == j)
f = g + h;else
f = g – h;???
逐次制御だけでは対応できない！
条件に応じて分岐する必要がある！
九州大学工学部電気情報工学科（2006年度）

ＭＩＰＳの命令（一部）命令

命令区分
算術演算 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 wordsw $s1, 100($s2)

メモリの[$s2+100]番地に，$s1のワードデータを書込み

beq $s1, $s2, L

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

branch on not
equal

bne $s1, $s2, L

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

set on less thanslt $s1, $s2, $s3

もし、$s2<$s3なら$s1=1, 以外なら
$s1=0

jump

jL

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

条件分岐 branch on equal

無条件
ジャンプ

例

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

九州大学工学部電気情報工学科（2006年度）

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

add$s0, $s0, $s1

add$s0, $s0, $s1

104

addi

$s4, $zero, 1

addi$s4, $zero, 1

108

add

$s1, $s1, $s0

add$s1, $s1, $s0

112

sub

$s0, $s0, $s4

sub$s0, $s0, $s4

116

bne

$s0, $s4, 108番地

bne$s0, $s4, L1

L1:

ラベル定義

ラベル参照

ラベル名はアセンブラによって実際の番地に変換される．
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（1）
条件分岐命令がない場合①②③④

add $s1, $s2, $s3
add $t0, $s1, $s4
lw $t1, 8 ($s5)
sub $t1, $t1, $t0

命令実行の流れ条件分岐命令がある場合① add $s1, $s2, $s3 ①② beq $s1, $s6, GoTo ②
add $t0, $s2, $s4 ③
sw $t0, 8 ($s5)④

GoTo:③ add $s4, $t4, $t3④ sw $s4, 8 ($s5)②で分岐条件が成立
した場合

分岐条件が不成立の場合

九州大学工学部電気情報工学科（2006年度）

条件分岐命令（2）例）

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

beq$s0, $s1, L1$s0 = $s1

YesNo

beq: Branch on EQual

次の命令

bne $s0, $s1, L1

bne

ラベルL1の番地$s0, $s1, L2

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

bne: Branch on Not Equal

次の命令

Yes

No

ラベルL2の番地

九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）プロセッサ
命令レジスタ

アドレス
PC
0x00104

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・
0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）PCの指す番地から取得した命令を保持プロセッサ

命令レジスタbeq $t0, $s1, L1

実行する命令の
アドレス

アドレス

PC
0x00104

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・
0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）プロセッサ
命令レジスタbeq $t0, $s1, L1

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

アドレスPC
0x00108

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・
0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）プロセッサ
命令レジスタbeq $t0, $s1, L1

アドレス
PC
0x00108

デコーダ
取得した命令を解読
ALU（t0==s1ならL1へ分岐）

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・
0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）プロセッサ
命令レジスタbeq $t0, $s1, L1
比較
デコーダ（結果は一致！）

ALU

アドレス
PC
0x00108

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・
0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）プロセッサ
分岐先アドレスに更新！
命令レジスタアドレス
beq $t0, $s1, L1
PC
比較
デコーダ
（結果は一致！）ALU

0x00400

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・

0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（3）PCの指す番地から取得した命令を保持プロセッサ

命令レジスタlw $t1, 120($s4)

実行する命令の
アドレス

アドレス

PC
0x00400

デコーダ
ALU

レジスタ

1.命令の取得：PCが指すアドレスの値をメモリから命令レジスタへ取得．同時に，次命令の取得に備えてPCの値を更新（例えば＋4）2.命令の解読：命令レジスタの値をデコード

主記憶

・・・
0x00104

beq $t0, $s1, L10x00108

add $t1, $t0, $s3

0x0010c

lw $t1, 320($s4)

L1

・・・

0x00400

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

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

3.命令の実行：解読結果に従って実行
九州大学工学部電気情報工学科（2006年度）

条件分岐命令（4）例）

slt $s0, $s1, $s2
レジスタ$s1の値と$s2の値を比較して，$s1<$s2であれば$s0に値「1」を，そうでなければ値「0」を格納（分岐条件の設定に利用）
slt: Set on Less ThanYes$s0 ← 1$s1 < $s2No$s0 ← 0九州大学工学部電気情報工学科（2006年度）

無条件分岐命令（1）
分岐命令がない場合①②③④

add $s1, $s2, $s3
add $t0, $s1, $s4
lw $t1, 8 ($s5)
sub $t1, $t1, $t0

命令実行の流れ無条件分岐命令がある場合① add $s1, $s2, $s3② j GoTo
add $t0, $s2, $s4
sw $t0, 8 ($s5)

GoTo:③ add $s4, $t4, $t3④ sw $s4, 8 ($s5)

常に分岐先を実行
九州大学工学部電気情報工学科（2006年度）

無条件分岐命令（2）例）j L1
常にラベルL1へ分岐（PCの値を設定）
j: Jumpjr $s0
常に$s0に格納されている番地
へ分岐（PCの値を設定）
jr: Jump Register
九州大学工学部電気情報工学科（2006年度）

アセンブリ言語プログラムを書いてみよう！
問題：以下，4つの場合に関して，slt命令，beq命令，または，
bne命令を用いてアセンブリ言語プログラムを作成せよ．なお，常にゼロの値を保持するレジスタ（$zero）を用いて良い．
①「$s0 < $s1」 ならラベルLへ分岐②「$s0 > $s1」 ならラベルLへ分岐③「$s0 <= $s1」 ならラベルLへ分岐④「$s0 >= $s1」 ならラベルLへ分岐

九州大学工学部電気情報工学科（2006年度）

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

解答①①「$s0 < $s1」 ならラベルLへ分岐②「$s0 > $s1」 ならラベルLへ分岐③「$s0 <= $s1」 ならラベルLへ分岐④「$s0 >= $s1」 ならラベルLへ分岐$s0<$s1なら$t0←1，
それ以外なら$t0←0

slt
bne

$t0, $s0, $s1$t0, $zero, L$t0≠$Zero（つまり$t0=1）
ならLへ分岐$s1<$s0なら$t0←1，
それ以外なら$t0←0

slt
bne

解答②

$t0, $s1, $s0$t0, $zero, L$t0≠$Zero（つまり$t0=1）
ならLへ分岐九州大学工学部電気情報工学科（2006年度）

アセンブリ言語プログラムを書いてみよう！
問題：以下，4つの場合に関して，slt命令，beq命令，または，
bne命令を用いてアセンブリ言語プログラムを作成せよ．なお，常にゼロの値を保持するレジスタ（$zero）を用いて良い．
①「$s0 < $s1」 ならラベルLへ分岐②「$s0 > $s1」 ならラベルLへ分岐③「$s0 <= $s1」 ならラベルLへ分岐 ⇒$s0>$s1でない④「$s0 >= $s1」 ならラベルLへ分岐 ⇒$s0<$s1でない
解答③$s1<$s0なら$t0←1，
それ以外なら$t0←0

slt
beq

$t0, $s1, $s0$t0, $zero, L$t0＝$Zero（つまり$t0=0）
ならLへ分岐$s0<$s1なら$t0←1，
それ以外なら$t0←0

slt
beq

$t0, $s0, $s1$t0, $zero, L

解答④$t0＝$Zero（つまり$t0=0 ）ならLへ分岐九州大学工学部電気情報工学科（2006年度）

コード例: C言語の goto 文
z ラベル名で指定するところに飛ぶ．

L100:

…
goto L100;
...
xxxx

L100:

j
…
xxxx

L100

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の if 文（１）z 式の値が真（０以外の整数）ならば else の前を実行する．式の値が偽（０）ならば else の後を実行する．文が複数ある場合は中括弧でくくる．
if (式)
文;
else
文;

省略可能

if (式) {文;...
}
else {
文;...
}

z 式の値が偽のときに特にすることがなければ，else 以降は省
略してもよい．
九州大学工学部電気情報工学科（2006年度）

コード例: C言語の if 文（２）
L1:

L1:

if (i == j) goto L1;
f = g + h;
f = f – i;

beq
add
sub

$s3, $s4, L1$s0, $s1, $s2$s0, $s0, $s3

変数名

レジスタ

f

$s0

g

$s1

h

$s2

i

$s3

j

$s4

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の if 文（３）if (i == j)
f = g + h;else
f = g – h;

ELSE:
EXIT:

bne
add
j
sub
…

$s3, $s4, ELSE
$s0, $s1, $s2
EXIT$s0, $s1, $s2

変数名

レジスタ

f

$s0

g

$s1

h

$s2

i

$s3

j

$s4

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の while 文（１）1. 条件式を評価する．
2. 条件式の値が真（０以外の整数）ならば文または中括弧の中を実行する．偽（０）ならば文または中括弧の中を実行せずに次に進む（＝ループを終了する）．
3. 文または中括弧の中を実行した後は 1. に戻る．
while (条件式)文;

while (条件式) {
文;
...
}

条件式が「真」の間，繰り返し実行される
九州大学工学部電気情報工学科（2006年度）

コード例: C言語の while 文（２）while (save[i] == k)i = i + j;save[i] の番地 = $s6 + $s3 * 4

WHILE:

EXIT:

add
add
add
lw
bne
add
j
…

$t0, $s3, $s3$t0, $t0, $t0$t0, $t0, $s6$t1, 0($t0)$t1, $s5, EXIT
$s3, $s3, $s4
WHILE

変数名

レジスタ

i

$s3

j

$s4

k

$s5

save[] 先頭番地

$s6

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の switch 文（１）z 式の値と同じ値の case のところに飛ぶ．該当する case がな
い場合は default のところに飛ぶ．
switch (式) {case 値1:...
case 値2:...
case 値3:...
default:...
}

式=値1のとき
式=値2のとき
式=値3のとき
式=その他の値のとき
省略可能

z default 以降は不要ならば省略してもよい．
九州大学工学部電気情報工学科（2006年度）

コード例: C言語の switch 文（２）z 通常，switch 文の各 case のあとには break 文を入れる．
z switch 文の中括弧の中で break 文を実行すると，中括弧の残りの実行を打ち切り，switch 文の外に飛ぶ．
switch (式) {case 値1:...
break;
case 値2:...
break;
default:...
}

式=値1のとき

式=値2のとき

式=その他の値のとき

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の switch 文（３）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本体は実行されない

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の switch 文（４）k == 0

Yes

f←i+j

No

k == 1

Yes

f←g+h

No

k == 2

Yes

f←g–h

No

k == 3

時間が
かかる!!

No

Yes

f←i–j

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の switch 文（５）表に登録されている
番地に分岐．

添え字

登録番地

0

L0

1

L1

2

L2

3

L3

k

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

L0: f ← i + j

L1: f ← g + h

L2: f ← g – h

L3: f ← i – j

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の switch 文（６）
範囲検査

多岐分岐

L0:
L1:
L2:
L3:
EXIT:

slt
bne
slt
beq
add
add
add
lw
jr
add
j
add
j
sub
j
sub
…

$t3, $s5, $zero$t3, $zero, EXIT
$t3, $s5, $t2$t3, $zero, EXIT
$t0, $s5, $s5$t0, $t0, $t0$t0, $s6, $t0$t1, 0($t0)$t1$s0, $s3, $s4
EXIT$s0, $s1, $s2
EXIT
$s6 →
$s0, $s1, $s2
EXIT$s0, $s3, $s4

変数名

レジスタ

f

$s0

g

$s1

h

$s2

i

$s3

j

$s4

k

$s5

番地表先頭番地

$s6

定数4

$t2

添え字

登録番地

0

L0

1

L1

2

L2

3

L3

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の for 文（１）1. 初期化式を評価する．
2. 条件式の値が真（０以外の整数）ならば文または中括弧の中を実行する．偽（０）ならば文または中括弧の中を実行せずに次に進む（＝ループを終了する）．
3. 文または中括弧の中を実行した後は，更新式を評価し，2. に戻る．
for (初期化式; 条件式; 更新式)
文;

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

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

九州大学工学部電気情報工学科（2006年度）

コード例: C言語の for 文（２）for (i = 0, j = 15; i < j; i++, j--) {tmp = a[i];a[i] = a[j];a[j] = tmp;
}
i

j

a[0]
a[1]
a[2]

a[14]
a[15]
九州大学工学部電気情報工学科（2006年度）

コード例: C言語の for 文（３）初期化式
条件式 FOR:

tmp = a[i]a[i] = a[j]a[j] = tmp

更新式
EXIT:

add
add
slt
beq
add
add
add
lw
add
add
add
lw
sw
sw
add
sub
j
…

$s0, $zero, $zero$s1, $t4, $zero$t0, $s0, $s1$t0, $zero, EXIT
$t1, $s0, $s0$t1, $t1, $t1$t1, $s3, $t1$s2, 0($t1)$t2, $s1, $s1$t2, $t2, $t2$t2, $s3, $t2$t3, 0($t2)$t3, 0($t1)$s2, 0($t2)$s0, $s0, $t5$s1, $s1, $t5
FOR

変数名

レジスタ

i

$s0

j

$s1

tmp

$s2

a[] 先頭番地

$s3

定数15

$t4

定数1

$t5

九州大学工学部電気情報工学科（2006年度）