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

2014.11.12
コンピュータアーキテクチャI 課題解答例 (第 6 回)
1. 講義ノート 4 の演習 1∼演習 5 を行え.
演習 1:
or
and
$s3, $s4, $s5
$s2, $s3, $s6
#g=h|i
#f=g&j
xor
$s1, $s2, $s4
#e=f^h
sll
add
$t0, $s4, 2
$t0, $s3, $t0
#i*4
#&A[i]
lw
add
$t0, 0($t0)
$s1, $s2, $t0
#A[i]
#g=h+A[i]
$s1, $s2, 4
$s1, $s2, 6
#g=h*16
#g=h/64
演習 2:
演習 3:
sll
srl
演習 4:
bne
add
j
ELSE:
$s3, $s4, ELSE #if(i!=j) goto ELSE
$s0, $s1, $s2 #then clause
NEXT
sub
$s0, $s1, $s2
NEXT: ...
#else clause
演習 5:
LOOP:
sll
$t0, $s3, 2
#i*4
add
lw
bne
$t0, $s6, $t0
$t1, 0($t0)
$t1, $s5, EXIT
#address of save[i]
#load save[i]
#save[i]==k? branch if not.
add
j
$s3, $s3, $s4
LOOP
#i=i+j
EXIT:
.....
1
2. 講義ノート 4 の演習 6 を考え,検討結果を述べよ.
演習 6:解答例
100
104
slt
bne
$t0, $s5, $zero
#k<0?
$t0, $zero, ExCase #yes, then branch
108
10C
slt
beq
$t0, $s5, $t2
#k<4?
$t0, $zero, ExCase #no, then branch
110
114
118
sll
add
lw
$t0, $s5, 2
$t0, $t4, $t0
$t1, 0($t0)
#4*k
#top address of jump table + 4*k
#get branch address
11C
jr
case0:
$t1
#branch
120
add
124
j
case1:
$s0, $s3, $s4
ExCase
#f=i+j
#break
128
12C
add
j
$s0, $s1, $s2
ExCase
#f=g+h
#break
case2:
130
sub
134
j
$s0, $s1, $s2
ExCase
#f=g-h
#break
case3:
138
sub
$s0, $s3, $s4
#f=i-j
13C
j
ExCase
ExCase:
140
.....
#break
CaseTable:
200
204
208
dw
dw
dw
case0
case1
case2
#address of case0
#address of case1
#address of case2
20C
dw
case3
#address of case3
解説:上記プログラムで左端の数字はプログラムの格納されるメモリ番地である(一例です).
dw は define word の意味で,4 バイトのデータを定義する擬似命令.dw case0 で case0 ラベル
のアドレスが 4 バイトのデータとして定義される.上記の例では case0 ラベルのアドレスは 120 で
あるから,200 番地には 120 というデータが格納される.以下,204 番地には 128,208 番地には
130,20C 番地には 138 が格納される.
CaseTable ラベルのアドレスは 200 であるから,$t4 には 200 が入っている.
上記のプログラムで,k=2 として,すなわち,$s5 の値を 2 として,シミュレートしてください.
ちゃんと,case2 にたどり着きましたか?
2
3. 教科書の問題 2.18.1 と 2.18.2 を行え.
問題 2.18.1
下図のようになる.
i=0
i<10?
yes
a<10?
no
yes
no
D[a]=b+a
a+=b
a+=1
i++
Exit
Exit
(b)
(a)
問題 2.18.2
a.
addi
LOOP:
$t0, $zero, 0
#i=0
slti
bne
$t2, $t0, 10
#i<10?
$t2, $zero, EXIT #if i<10 then goto EXIT
add
addi
j
$s0, $s0, $s1
$t0, $t0, 1
LOOP
#a+=b
#i++
EXIT:
b.
LOOP:
slti
beq
$t2, $s0, 10
#i<10?
$t2, $zero, EXIT #if i>=10 then goto EXIT
add
sll
$t0, $s1, $s0
$t1, $s0, 2
#t0=b+a
#a*4
add
sw
addi
$t1, $t1, $s2
$t0, 0($t1)
$s0, $s0, 1
#&D[a]
#D[a]=b+a
#a+=1
j
EXIT:
LOOP
3