コンピュータアーキテクチャI課題と解答例(第5回)

2015.11.4
コンピュータアーキテクチャI 課題と解答例 (第 5 回)
1. 講義ノート 3 の演習 6 から演習 10 までをやってください.
• 演習 6:
add
$t1, $s4, $s4 #i*2
add
add
$t1, $t1, $t1 #i*4: オフセットを求める.
$t1, $s3, $t1 #A[i] のアドレスを求める.
lw
add
$t0, 0($t1)
#A[i] の値をレジスタにロード
$s1, $s2, $t0 #g=h+A[i]
演習 6 で i を 4 倍するのは,バイトオフセットを求めるためである.3 行目で A[i] の格納ア
ドレスが求められる.
(C 言語で言うところの&A[i] を求めることに相当.
)4 行目では,$t1
をベースレジスタとして,メモリからデータをロードする.$t1 は A[i] のアドレスを持って
いるので,オフセットは 0 でよい.
• 演習 7:
add
$t0, $s1, $s2
add は (0,32), $t0 は 8,$s1, $s2 はそれぞれ 17,18 である.いずれも 10 進数.よって,
6
5
5
5
5
6
0
17
18
8
0
32
となる.これを 2 進数で表記して,
6
5
5
5
5
6
000000
10001
10010
01000
00000
100000
を得る.これを 32 ビットの 16 進数で表せば,下記を得る.
0X02324020
• 演習 8:
lw
$t0, 1200($t1)
lw は 35, $t0, $t1 はそれぞれ 8,9 である.いずれも 10 進数.よって,
6
5
5
16
35
9
8
1200
となる.これを 2 進数で表記して,
6
5
5
16
100011
01001
01000
0000010010110000
を得る.これを 32 ビットの 16 進数で表せば,下記を得る.
0X8D2804B0
1
• 演習 9:
lw
$t2, 1200($t1)
#A[300] をロード
add
sw
$t2, $s2, $t2
$t2, 1200($t1)
#h+A[300]
#結果を A[300] にストア
機械語表現 (16 進数表現)
0X8D4A04B0
0X024A5020
0XAD4A04B0
• 演習 10:
下図のようになります.
SW命令の流れ
レジスタファイル
命令メモリ
データメモリ
ALU
Ladr
Radr
選択
PC
命令解読
制御信号
課題 2 教科書の問題 2.6 の前半 (2.6.1 - 2.6.3) をやってください.
問題 2.6.1
a.
f= -g + h + B[1];
コンパイル結果は,
sub $t0, $s2, $s1
lw $t1, 4($s7)
#t0=h-g
#t1=B[1]
add $s0, $t0, $t1
#f=-g+h+B[1]
となる.
b.
f= A[B[g]+1];
コンパイル結果は,
sll $t0, $s1, 2
add $t0, $t0, $s7
lw $t1, 0($t0)
#t0=g*4
#&B[g]
#t1=B[g]
addi $t1, $t1, 1
#t1=B[g]+1
2
sll
add
lw
$t1, $t1, 2
$t1, $s6, $t1
$s0, 0($t1)
#t1=(B[g]+1)*4
#&A[B[g]+1]
#f=A[B[g]+1]
となる.
問題 2.6.2
a. は 3 命令,b. は 7 命令.
問題 2.6.3
a. は 6 個であるが,次のようにコンパイルすれば 5 個で済む.
lw
$t0, 4($s7)
sub $t0, $t0, $s1
add $s0, $t0, $s2
#t0=B[1]
#t0=t0-g
#f=-g+h+B[1]
b. は 6 個であるが,次のようにコンパイルすれば 5 個で済む.
sll $t0, $s1, 2
add $t0, $t0, $s7
#t0=g*4
#&B[g]
lw $t0, 0($t0)
addi $t0, $t0, 1
#t0=B[g]
#t0=B[g]+1
sll $t0, $t0, 2
add $t0, $s6, $t0
lw $s0, 0($t0)
#t0=(B[g]+1)*4
#&A[B[g]+1]
#f=A[B[g]+1]
3