さて,コンピュータに必要な機械語の命令には, 具体的にどんなものが必要であろうか。 本章で今まで述べてきたように,大きく分けて三つのカテゴリーが必要である。 さらに各カテゴリーに属する代表的な命令を, 図 8.3に記述した。 ただし,必ずしもこのすべてが必要ではないし, これ以外の命令があっても大きな問題がある訳でもない。 あくまでも,命令セットの一例であると理解して欲しいが, 本書ではこれらの命令をセットとして持つコンピュータを前提とする。
実際の機械語命令は,命令コード(instruction code)と呼ばれる2進表現されたものであり, 基本的には外部メモリーに置かれ,CPUはこれを順に読み取りながら, 作業を実行していくことになる。 命令コードもコードの一種であり, 厳密には第6章のコードの説明に含めるべきであったかもしれないが, 説明の都合上本章で行う。
命令コードのデータ幅は,本書ではメモリーの幅が16bitであることから,
基本的には16bitの整数倍とする。
それも可能な限り16bitとし,やむをえない場合のみメモリー2語分,
つまり32bitとしたい。
実は,データ処理部を制御するにはもっと多くのビット数の制御線が必要である。
しかし,レジスタの指定等,オプションが異なるものをすべて異なる命令と見ても,
その総数は
種類もないのである。
したがって適切なるコーディング,つまりビット割り当てを行えば,
上記の条件を満たすことは可能なのである。
これらの命令のうちで,移動命令やジャンプ命令は, メモリー上の16bitのアドレスを指定する必要があるので, どうやっても命令幅16bitでは収容できず,32bitを使うことにする。 その他の命令は16bitに収容することを試みよう。 オプションであるレジスタの選択やシフト量の指定は, それぞれ4bitずつ必要であるので, オプションの多いものは,命令そのものに使えるビット数は少ない。 一方,オプションの少ないものは,命令そのものに使えるビット数は多い。 そこで次のような戦略でコーディングの割り当てを考えることとする。
オプション(レジスタ指定など)の多い命令から順に並べ, 3オプションあるものは命令の区別に4bitを用い, 2オプションあるものは命令の区別に8bitを用い, 1オプションあるものは命令の区別に12bitを用い, 0オプションあるものは命令の区別に16bitを用いればよい。 アドレス指定をするものは,前述のように,32bit幅を必要とするが, アドレス指定の16bitを除く部分の16bitについては, 通常の同じような手法を適用する。 こうして得られた命令コード割り当ての一例を,図 8.4に示す。 なお,将来の拡張性を考慮し,ところどころ余裕を持たせて割り当てを行った。
命令を実行する際には,まずメモリーから命令をもらってくるフェッチ(fetch) 8.1と呼ぶ作業が必要である。 これは次のようにして行う。
信号(メモリーに読み込みをしたいことを伝える)を1にする。
例えば,条件ジャンプは次のようにして実行される。 条件ジャンプ命令では,どのフラグを見てジャンプすべきか, ジャンプする場合には何番地へジャンプするかの指示がある。 ここでは,ジャンプ先の情報はメモリー上, 次のアドレスに記載されているものとする。
他の命令もおおよそこれらの例のようにして実行される。