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
© Copyright 2024 ExpyDoc