ソフトウェア基礎技術研修

制御の流れ(分岐命令)
小テスト問題
小テスト問題:制御の流れ(分岐命令)
以下に示すC言語プログラムをMIPSアセンブリ言語に変換せ
よ.ただし,
 配列Aは100語(1語は32ビット)からなり,その開始アドレス(ベースアドレ
ス)はレジスタ$s5に格納されているとする
 各変数のレジスタ割当は下表とする
 バイトアドレスのビッグ・エンディアン方式を前提とする
 レジスタ$t0~$t7やゼロレジスタ($zero)は自由に使用して良い
変数名
レジスタ
if (i >= j)
f = g + h;
else
f = g – h;
A[i] = f + f;
f
$s0
g
$s1
h
$s2
i
$s3
j
$s4
A[ ]の先頭アドレス
$s5
九州大学工学部電気情報工学科
解答例
i>=j
if (i >= j)
f = g + h;
else
f = g – h;
A[i] = f + f;
Yes
No
f=g-h
A[i] = f + f
f=g+h
変数名
レジスタ
f
$s0
g
$s1
h
$s2
i
$s3
j
$s4
A[ ]の先頭アドレス
$s5
九州大学工学部電気情報工学科
解答例
slt
bne
$t0, $s3, $s4
# i<jなら$t0←1,i>=jなら$t0←0 if (i >= j)
$t0, $zero, ELSE # $t0≠0ならELSEへ分岐
f = g + h;
add
j
$s0, $s1, $s2
L1
#f=g+h
# L1へジャンプ
ELSE:
sub
$s0, $s1, $s2
#f=g–h
L1:
add
add
add
add
sw
$t1, $s0, $s0
$t2, $s3, $s3
$t2, $t2, $t2
$t2, $t2, $s5
$t1, 0 ($t2)
#
#
#
#
#
f + f を計算
i×2
i×4
A[i]のアドレス
A[i]へ格納
else
f = g – h;
A[i] = f + f;
変数名
レジスタ
f
$s0
g
$s1
h
$s2
i
$s3
j
$s4
A[ ]の先頭アドレス
$s5
九州大学工学部電気情報工学科
解答例
slt
bne
$t0, $s3, $s4
# i<jなら$t0←1,i>=jなら$t0←0 if (i >= j)
$t0, $zero, ELSE # $t0≠0ならELSEへ分岐
f = g + h;
add
j
else
f = g – h;
A[i] = f + f;
$s0, $s1, $s2
#f=g+h
L1
# L1へジャンプ
分岐条件の判定
ELSE: 条件不成立ならELSEへ分岐
sub
$s0, $s1, $s2
#f=g–h
L1:
add
add
add
add
sw
$t1, $s0, $s0
$t2, $s3, $s3
$t2, $t2, $t2
$t2, $t2, $s5
$t1, 0 ($t2)
#
#
#
#
#
f + f を計算
i×2
i×4
A[i]のアドレス
A[i]へ格納
変数名
レジスタ
f
$s0
g
$s1
h
$s2
i
$s3
j
$s4
A[ ]の先頭アドレス
$s5
九州大学工学部電気情報工学科
解答例
slt
bne
$t0, $s3, $s4
# i<jなら$t0←1,i>=jなら$t0←0 if (i >= j)
$t0, $zero, ELSE # $t0≠0ならELSEへ分岐
f = g + h;
add
j
$s0, $s1, $s2
L1
else
f = g – h;
A[i] = f + f;
#f=g+h
# L1へジャンプ
ELSE:
sub
$s0, $s1, $s2
#f=g–h
Ifパート(条件成立側)の実行
実行終了後,Elseパートを実行し
L1:
ないようジャンプ
add $t1, $s0, $s0
# f + f を計算
add $t2, $s3, $s3
# i×2
add $t2, $t2, $t2
# i×4
add $t2, $t2, $s5
# A[i]のアドレス
sw
$t1, 0 ($t2)
# A[i]へ格納
変数名
レジスタ
f
$s0
g
$s1
h
$s2
i
$s3
j
$s4
A[ ]の先頭アドレス
$s5
九州大学工学部電気情報工学科
解答例
slt
bne
$t0, $s3, $s4
# i<jなら$t0←1,i>=jなら$t0←0 if (i >= j)
$t0, $zero, ELSE # $t0≠0ならELSEへ分岐
f = g + h;
add
j
$s0, $s1, $s2
L1
#f=g+h
# L1へジャンプ
ELSE:
sub
$s0, $s1, $s2
#f=g–h
else
f = g – h;
A[i] = f + f;
変数名
レジスタ
f
$s0
L1:
g
add $t1, $s0, $s0
# f + f を計算
h
add $t2, $s3, $s3
# i×2
Elseパート(条件不成立側)の実行
add $t2, $t2, $t2
# i×4
i
ラベルL1以降はIf文の条件に関係なく
add $t2, $t2, $s5
# A[i]のアドレス
j
必ず実行されるため,Ifパートにある最
sw
$t1, 0 ($t2)
# A[i]へ格納
後のジャンプ命令は不要
A[ ]の先頭アドレス
$s1
$s2
$s3
$s4
$s5
九州大学工学部電気情報工学科
解答例
slt
$t0, $s3, $s4
# i<jなら$t0←1,i>=jなら$t0←0 if (i >= j)
= f +ELSE
f の実行
bne $t0,A[i]
$zero,
# $t0≠0ならELSEへ分岐
f = g + h;
 f + f を計算し,$t1へ格納
else
 iを4倍にしてA[i]へのオフセットを得る
add $s0, $s1, $s2
#f=g+h
f = g – h;
j (バイトアドレスである事に注意)
L1
# L1へジャンプ
 A[ ]の先頭アドレスとオフセットを加え
A[i] = f + f;
てA[i]のアドレスを求め$t2に格納
ELSE:
 $t1の値(つまりf + f)をメモリにストア
変数名
レジスタ
sub
$s0, $s1, $s2
#f=g–h
L1:
add
add
add
add
sw
$t1, $s0, $s0
$t2, $s3, $s3
$t2, $t2, $t2
$t2, $t2, $s5
$t1, 0 ($t2)
#
#
#
#
#
f + f を計算
i×2
i×4
A[i]のアドレス
A[i]へ格納
f
$s0
g
$s1
h
$s2
i
$s3
j
$s4
A[ ]の先頭アドレス
$s5
九州大学工学部電気情報工学科
 Created by Koji Inoue, 2005 (R1.00)
九州大学工学部電気情報工学科