next up previous contents index
Next: 蓄積プログラム方式 Up: プログラム Previous: 高水準プログラム言語における分岐/ジャンプ   Contents   Index

機械語の命令セットと命令の実行

さて,コンピュータに必要な機械語の命令には, 具体的にどんなものが必要であろうか。 本章で今まで述べてきたように,大きく分けて三つのカテゴリーが必要である。 さらに各カテゴリーに属する代表的な命令を, 図 8.3に記述した。 ただし,必ずしもこのすべてが必要ではないし, これ以外の命令があっても大きな問題がある訳でもない。 あくまでも,命令セットの一例であると理解して欲しいが, 本書ではこれらの命令をセットとして持つコンピュータを前提とする。

Figure 8.3: 命令セットの例(Reg.はレジスタの略)

実際の機械語命令は,命令コード(instruction code)と呼ばれる2進表現されたものであり, 基本的には外部メモリーに置かれ,CPUはこれを順に読み取りながら, 作業を実行していくことになる。 命令コードもコードの一種であり, 厳密には第6章のコードの説明に含めるべきであったかもしれないが, 説明の都合上本章で行う。

命令コードのデータ幅は,本書ではメモリーの幅が16bitであることから, 基本的には16bitの整数倍とする。 それも可能な限り16bitとし,やむをえない場合のみメモリー2語分, つまり32bitとしたい。 実は,データ処理部を制御するにはもっと多くのビット数の制御線が必要である。 しかし,レジスタの指定等,オプションが異なるものをすべて異なる命令と見ても, その総数は$2^{16}=65536$種類もないのである。 したがって適切なるコーディング,つまりビット割り当てを行えば, 上記の条件を満たすことは可能なのである。

これらの命令のうちで,移動命令やジャンプ命令は, メモリー上の16bitのアドレスを指定する必要があるので, どうやっても命令幅16bitでは収容できず,32bitを使うことにする。 その他の命令は16bitに収容することを試みよう。 オプションであるレジスタの選択やシフト量の指定は, それぞれ4bitずつ必要であるので, オプションの多いものは,命令そのものに使えるビット数は少ない。 一方,オプションの少ないものは,命令そのものに使えるビット数は多い。 そこで次のような戦略でコーディングの割り当てを考えることとする。

オプション(レジスタ指定など)の多い命令から順に並べ, 3オプションあるものは命令の区別に4bitを用い, 2オプションあるものは命令の区別に8bitを用い, 1オプションあるものは命令の区別に12bitを用い, 0オプションあるものは命令の区別に16bitを用いればよい。 アドレス指定をするものは,前述のように,32bit幅を必要とするが, アドレス指定の16bitを除く部分の16bitについては, 通常の同じような手法を適用する。 こうして得られた命令コード割り当ての一例を,図 8.4に示す。 なお,将来の拡張性を考慮し,ところどころ余裕を持たせて割り当てを行った。

Figure 8.4: 命令コードの例(括弧内は対応レジスタや数を4bitで表したもの)
\begin{figure}\centering
\begin{tabular}{\vert l\vert cccc\vert}
\hline
命令 &...
...
{\tt HLT} & 1111 & 1111 & 1111 & 1111 \\
\hline
\end{tabular}
\end{figure}

命令を実行する際には,まずメモリーから命令をもらってくるフェッチ(fetch) 8.1と呼ぶ作業が必要である。 これは次のようにして行う。

  1. メモリー上で次の命令が入っているアドレスを記憶している プログラムカウンタ(program counter)またはPCと呼ばれるレジスタ (本書では普通のレジスタの一つを利用する)の内容を, CPU内部のデータバスを経由してアドレスバスに流す。 同時に$ReadMemory$信号(メモリーに読み込みをしたいことを伝える)を1にする。
  2. $MemoryEnable$信号(メモリーがデータをデータバスに載せたことを CPUに伝える)が1になるのを待ち,1になったら次のステップへ移動する。
  3. データバス上のデータを命令レジスタ(instruction register) またはIRと呼ばれるレジスタ(本書では普通のレジスタの一つを利用する) へ入れる。
  4. ほとんどの場合,次の命令はメモリー上の次のアドレスに入っているので, あらかじめ,PCの値を1増やしておく。
  5. ここでいったん終了し,メモリーの実行ステップへ移動する。
このフェッチの作業によりメモリー上の命令を持ってきて, それに引き続き命令レジスタ上の命令を実行することになる。

例えば,条件ジャンプは次のようにして実行される。 条件ジャンプ命令では,どのフラグを見てジャンプすべきか, ジャンプする場合には何番地へジャンプするかの指示がある。 ここでは,ジャンプ先の情報はメモリー上, 次のアドレスに記載されているものとする。

  1. フラグを見て条件不成立ならば,PCを1増やして,フェッチの作業に戻る。
  2. 条件成立ならば,フェッチの作業と同じような手法で, メモリー上の次のアドレスの命令をPCに取り込む。
  3. フェッチの作業に戻る。

他の命令もおおよそこれらの例のようにして実行される。


next up previous contents index
Next: 蓄積プログラム方式 Up: プログラム Previous: 高水準プログラム言語における分岐/ジャンプ   Contents   Index
Yoichi OKABE 2008-03-29