コンピュータアーキテクチャI講義ノート (3) 1 第2章

2015.10.28
コンピュータアーキテクチャI 講義ノート (3)
1
第2章
今週からしばらくは,皆さんに人間コンパイラになっていただく.その理由は,命令セットアー
キテクチャに親しんでもらうこと(すなわち,アセンブリ言語あるいは機械語に親しんでもらうこ
と)と,コンパイラがどんなことをやっているかの感覚をつかんでもらうためである.さらに言
えば,自分でプロセッサを設計するという観点から命令セットアーキテクチャを眺めていただきた
い,という期待をこめている.
この章を終わるころには C のプログラムのかなりの部分がハンドコンパイルできるようになる
だろう.次章以降では,プロセッサの設計を行うが,そのプロセッサが実行できる命令は,まさに
この章で出てくる命令である.このことからも,この章の重要性が理解できるであろう.
C などの高水準言語間には類似性がある.したがって,1つの言語を覚えれば,他の言語はその
親類とみてよく,他の言語を覚えることは難しくない.言語設計の立場からもハードウェア設計の
立場からも,性能を最大化しながらコストを最小化するような言語/ハードウェアの開発が目標で
ある.これは,とりもなおさず性能を最大化しながらコストを最小化する命令セットを設計するこ
とが重要であることを示している.
ここでは,MIPS(という名前のプロセッサ)の命令セットアーキテクチャを学ぶ1 .
まず,アセンブリ言語の例を示す.
----------------------------------------------------------------add a,b,c
#変数 b と c を加えた結果を変数 a に代入(格納)する.
----------------------------------------------------------------sub a,b,c
#変数 b から c を引いた結果を変数 a に代入(格納)する.
----------------------------------------------------------------これは,加算命令と減算命令をあらわすアセンブリ言語である.最初の部分をオペレーション
(操作)といい,a,b,c の部分をオペランドという.”,”で区切って 3 つのオペランドがあり,左か
ら順に第 1 オペランド,第 2 オペランド,第 3 オペランドという.したがって,上記の命令は,第
2 オペランドの内容に(から)第 3 オペランドの内容を加えて(引いて)結果を第 1 オペランドに
格納するということを示している.”#”から右は,コメントである.このように,アセンブリ言語
は,操作とそれにかかわるオペランドという形で表現される.
オペランドをもう少し詳しく説明する.演算するデータは,基本的にはメモリに格納されてい
る.したがって,上記の例では,オペランドはメモリの番地を表していると考えるのが妥当である.
しかしながら,データはレジスタと呼ばれる高速記憶装置に格納されていることもある.その場合
は,オペランドはレジスタの番号を表していると考えるべきである.また,演算データを直接オペ
ランドに書きたいこともある.その場合は演算データそのものを表していると考えるべきである.
このように,オペランドは演算対象となるデータのありかを示している.したがって,これらを区
別できる書き方(規則)を考えなければならない.少なくとも上記の表現では,a,b,c は抽象的に
変数と言っているだけで,そのありかがどこかということは何もいっていない.
(実は,多くのアセ
1 性能を現す尺度に
MIPS(Million instructions per second) というのがありますので,それと混同しないこと.
1
ンブリ言語の規則では,上記のように書くとメモリの番地を表すということになっている.
)した
がって,以下では,その規則を述べつつ,アセンブリ言語を紹介していく.
教科書の例 a=b+c+d+e を求めるアセンブリプログラム
add a,b,c
#変数 b と c を加えて和を a に格納する.
add a,a,d
add a,a,e
#変数 a と d を加えて和を a に格納する.
#変数 a と e を加えて和を a に格納する.
この命令列は,この順番に実行することを前提としている.したがって,3 番目の命令まで実行
してはじめて a に結果が得られる.
蛇足:2 番目と 3 番目の命令では,a が 2 箇所に出てきて,これは数学なら a=a+d あるいは
a=a+e となるからおかしいのではないかと思うかも知れないが,そうではない.C 言語の代入文
a=a+d; は,=の左の変数が left value(すなわち,アドレス)を表し,右の変数が right value(す
なわち,値)を表す.アセンブリ言語の場合は,いずれの変数もアドレスを表す.図 1 参照.した
がって,add a,a,d は,アドレス a のメモリ(あるいはレジスタ)内容を読み出し,また,アドレ
ス d のメモリ(あるいはレジスタ)内容を読み出し,それらを加算して結果をメモリ(あるいはレ
ジスタ)のアドレス a に書き込むということを意味している.
(この場合,演算前の a の値は,演
算後には新しい値が上書きされるので,消失する.
)
メモリ
番地
変数
a
b
c
0
1
2
3
4
5
6
7
8
9
10
内容
97
114
99
104
105
116
101
99
116
117
114
101
変数aが2番地,変数bが6番地,変数cが9番地に
割り当てられているものとする.
変数aのleft valueは2である.また,
right valueは99である.
a=b+cにおいては,bのright valueとcのright
valueが加えられ,aのleft valueの番地に
結果が格納される.その結果,aのright valueは
218になる.
クイズ: このメモリの内容を解読してみよう.
ヒント ASCII
図 1: メモリ
オペランド数を固定すれば,ハードウェアの単純性を保つことができる.
設計原則1 単純性は規則性につながる.
変数はメモリに割り当てられているとして,以下の演習を行え.
(教科書は見ないこと)
[演習 1]C のプログラム部分
a= b+c;
d= a-e;
をコンパイルせよ.
[演習 2]C のプログラム部分
2
Register File
Register File
Radr
Radr
Ladr
Rdata
Rdata
Ladr
Operation
Unit
Wadr
Wadr
Ldata
Ldata
Wdata
Wdata
図 3: 簡単な演算機構
図 2: レジスタファイル
f=(g+h)-(i+j);
をコンパイルせよ.
(ヒント,括弧の演算結果を保存しておく中間変数を利用する.
)
さて,ここで次の設計原理を述べておく.
設計原則2 小さければ小さいほど高速になる.
レジスタファイルはレジスタの集まりである.レジスタファイルは,図 2 のように構成される.
すなわち,2 つのデータ読み出しと 1 つのデータ書き込みができる.より具体的には,Radr と Ladr
で読み出すレジスタの番号を与えると Rdata と Ldata にデータが出力される.また,Wadr に書
き込むレジスタの番号を与え,Wdata に書き込むデータを与えると,そのデータが書き込まれる2 .
レジスタファイルと演算器を図 3 のようにつなげば,簡単な演算機構が出来上がる.
レジスタファイルの3つのアドレスは,実は,3 オペランドを意識したものである.MIPS では
レジスタファイルは32個の32ビットレジスタから構成されている.したがって,オペランドあ
たり 5 ビットあればどのレジスタかを指定できる.32 個のレジスタに名前をつけよう.レジスタ
の名前は$で始まるという約束にする.ここでは,C の変数用に$s0,$s1,…を使用し,一時的な変数
のために$t0,$t1,…を使用する.具体的に何番目のレジスタが$s0 かということは,ここでは問わ
ない.どれかに割り当てられているものとする.ただ注意しておくことは異なる名前のレジスタが
同じレジスタに割り当てられることはないということである.
さて,では演習.
[演習3]C のプログラム部分
f = (g+h) - (i+j);
をコンパイルせよ.ただし,f,g,h,i,j はそれぞれ$s0,$s1,$s2,$s3,$s4 に割り当てられているものと
する.
実際は,データは,最初はメモリにあるから,メモリからレジスタに持ってくるということをし
なければならない.それを行うのがロード命令である.4 バイトのデータをメモリからレジスタに
ロードする命令を lw (load word) と書く.
ロード命令ではメモリのアドレスを指定しなければならない.次のように書く.
lw $t0,8($s3)
この意味は,$s3 の内容に 8 を加えたものをメモリアドレスとし,そのメモリアドレスにあるデー
タを$t0 に持ってくるというものである.ここで,$s3 のところにくるレジスタはベースレジスタと
2 正確には,そのように制御する制御信号により,読み書きが行われる.
3
呼ばれる.また,ベースレジスタの隣に書く数字をオフセットと呼ぶ.この書き方は,メモリにあ
る配列データをロードするときに便利な書き方である.すなわち,配列の先頭アドレスをベースレ
ジスタに入れておき,配列の添え字をオフセットとするのである.
メモリはバイトアドレスである.したがって,ワード単位のアクセスを行うには,4 の倍数のオ
フセットを加える.演習で見てみよう.
[演習 4]C のプログラム部分
g = h + A[8];
をコンパイルせよ.ただし,g,h は$s1,$s2 に割り付けられており,配列 A の先頭アドレス(これ
をベースアドレスともいう)は$s3 に入っているものとする.
ロードとは逆にレジスタのデータをメモリに格納する命令をストア命令という.4 バイトのデー
タをレジスタからメモリにストアする命令を sw (store word) と書く.
sw $t0, 48($s3)
この意味は,レジスタ$t0 の内容を$s3 の内容に 48 を加えたメモリアドレスに格納するというもの
である.次の演習で lw と sw の使用法を再確認しよう.
[演習 5]C のプログラム部分
A[12] = h + A[8];
をコンパイルせよ.ただし,h は$s2 に割り当てられているものとし,配列 A のベースアドレスは
$s3 に入っているものとする.
今度は,配列の添え字が定数ではなく変数の場合を考えてみよう.
[演習 6]C のプログラム部分
g = h + A[i];
をコンパイルせよ.ただし,g,h,i はそれぞれ,$s1,$s2,$s4 に割り当てられており,A のベースア
ドレスは$s3 に入っているものとする.
さて,命令がコンピュータ内でどのように構成されているかを見てみよう.MIPS では,どの命
令も 32 ビットで構成されている.
今までに出てきた命令は,2つのカテゴリに分けられる.1つは,add や sub のようにオペラ
ンドが3つあり,そのいずれもがレジスタを対象とする命令であり,もう1つは,lw や sw のよう
に,オペランドが2つあり,一方がレジスタ,他方がメモリを対象とする命令である.前者を R 形
式の命令,後者を I 形式の命令と呼ぶ.
R 形式の命令は6つのフィールドから構成されている.
6
5
5
5
5
6
op
rs
rt
rd
shtamt
funct
op: 命令の基本操作
rs: 第1ソースオペランド
4
rt: 第2ソースオペランド
rd: 結果格納オペランド
shtamt: シフト量
funct: 機能コード
具体的に,add $t0, $s1, $s2 という命令がどうなるか見てみよう.ここで,レジスタ$t0 か
ら$t7 の番号は 8 から 15 と定められており,レジスタ$s0 から$s7 の番号は 16 から 23 と定められ
ている.詳しくは,p109 の図 2.14 を見てください.また,命令コードは,op と funct の組で構成
され,add が (0,32), sub が (0,34) である.
[演習 7] フィールドに数値を入れて見よう.10 進数と 2 進数で表記してください.
I 形式の命令は4つのフィールドから構成されている.
6
5
5
16
op
rs
rt
address
op: 命令の基本操作
rs: オペランドレジスタ
rt: オペランドレジスタ
address: オフセットなどを記述する
rs と rt はオペランドレジスタと一般的に書いたが,その使われ方は,命令に依存する.LW 命
令と,SW 命令について示すと以下のようになる.
LW rt, address(rs)
SW rt, address(rs)
具体的に,lw $t0, 1200($t1) という命令がどうなるか見てみよう.ここで,命令コード (op)
は,lw が 35, sw が 43 である.
[演習 8] フィールドに数値を入れてみよう.10 進数と 2 進数で表記してください.
このように,命令を数値で表記したものを機械語という.
[演習 9]C のプログラム部分
A[300]= h + A[300];
をコンパイルし,アセンブリ言語と機械語の両方であらわせ.なお,h は$s2 に割り当てられてお
り,A のベースアドレスは$t1 に割り当てられているものとする.
5
2
ここまでのまとめ
ここまでにやってきた命令を実行できる計算機構成を見てみます.図 4 がそれです.詳しい話は,
5 章でしますが,ここでは,概要を示します.これによって,命令がどのように実行されるかがよ
くわかります.具体的に,R形式の命令が実行される様子を図 5 に示します.また,LW 命令が実
行される様子を図 6 に示します.SW 命令については各自で考えてください.
典型的な構成
レジスタファイル
命令メモリ
データメモリ
ALU
Ladr
Radr
PC
選択
選択
Wadr
命令解読
制御信号
図 4: 典型的な構成
R形式命令の流れ
レジスタファイル
命令メモリ
PC
データメモリ
ALU
Ladr
Radr
選択
選択
Wadr
命令解読
制御信号
図 5: R形式命令の流れ
LW命令の流れ
レジスタファイル
命令メモリ
データメモリ
ALU
Ladr
PC
選択
Wadr
命令解読
制御信号
図 6: LW命令の流れ
[演習 10]SW 命令の流れを記述せよ.
3
宿題
次回は,p.61 から p.82 まで読んでくること.
6
選択