応用技術者試験に合格するのを目標にITパスポートから基本情報技術者試験と段階を踏んで学習しています。
(ただのアウトプット記事となりますので悪しからず。)
前回は、CPUの構成をみてきました。
今回は機械語についてです。
CPUはプログラム言語を直接理解することはできないので、一度プログラミング言語を機械語に変換してから実行していくという流れで動きます。
①機械語命令の種類
命令の種類としては
- 転送命令
- 演算命令
- 比較演算命令
- シフト演算命令
- 分岐命令
などがあります。
②命令語の構成
機械語の命令はプロセッサの設計(アーキテクチャ)によって長さは異なりますが、命令(コード)部とオペランド部でできています。
- 命令部→命令の内容
- オペランド部→レジスタやメモリアドレスなど演算対象の情報
と2つに分けることができます。
ただし、命令の種類によってはオペランドがないものもあります。
(たとえば、CASLⅡのRPUSHやRET命令などがそうです。)
オペランド部はさらに3つに分けることができます。たとえば32ビットの場合ですと
- レジスタ部(3ビット)→処理対象のレジスタを指定
- アドレス修飾部(5ビット)→アドレス修飾の種別を指定
- アドレス定数部(16ビット)→処理対象のデータのアドレスを指定
で構成されています。
残りの命令コード部が8ビットで、合計32ビットとなります。
オペランド部のアドレス定数部には処理対象のデータの場所を指定するのですが、データがそのまま格納されているとは限りません。
アドレス修飾部にあるデータを使って、計算によりデータを格納する真のアドレスを求める方式もあります。
これをアドレス修飾(アドレス指定・アドレッシングモード)と呼びます。
③アドレス指定方式(アドレッシングモード)の種類
- 即値アドレス指定方式
- 直接アドレス指定方式
- 間接アドレス指定方式
- インデックス(指標)アドレス指定方式
- ベースアドレス指定方式
- (自己)相対アドレス指定方式
と6個ほどあるので紹介します。
①即値アドレス指定方式
オペラント部に対象データがそのまま入っている方式です。オペラント部に1と入っていたら、1をそのまま使います。メモリは参照しません。
②直接アドレス指定方式
オペラント部に書いてある値は有効アドレスです。
有効アドレスとは、メインメモリでのデータが格納されている番地(アドレス)のことです。
この値を参照し、メインメモリからデータを取得します。
③間接アドレス指定方式
間接アドレス指定方式では、オペラント部に書いてある値が、メインメモリの「有効アドレスのありか」となっています。つまり、メインメモリに2回アクセスすることになります。
例:オペラント部に10となっていたら、メインメモリの10を見てみる。そこに書いてあるデータが55だとすると55番のアドレスを参照します。そのデータが処理対象のデータとなります。
④インデックスアドレス指定方式
インデックスレジスタの値とオペラント部の値を加えて有効アドレスを計算します。
インデックスレジスタとは、連続したアドレスを扱う時に用いるレジスタです。
配列型(メモリ上の連続した領域にデータを並べる方式)の場合などに使われます。
⑤ベースアドレス指定方式
インデックス指定方式と似ていますが、インデックスレジスタではなくベースレジスタとオペラント部に書いてある値を加えて有効アドレスを計算します。
ベースレジスタとは、プログラムがメモリ上にロードされた先頭のアドレスを記憶しているレジスタです。
⑥(自己)相対アドレス指定方式
アドレス定数部の値+PC(プログラムカウンタ)の値
ベースレジスタを持たないコンピュータで利用されます。
プログラムのリロケータブル(再配置可能性)
なぜ相対アドレス指定のように面倒な指定をするかというと、どの位置にロードされても命令を変えなくて良いというメリットがあります。
たとえば1000〜2000番地にロードされるようなプログラムで絶対アドレス指定で1500番に飛ぶように指定されてるとします。
これがリロケータブルでない場合、プログラムが3000〜4000にロードされるとしたときにも同じように1500番に飛んでしまいます。
ですので、ロードされる番地の先頭から何番目に飛ぶ。というように指定する必要があります。
こんな感じでプログラムは制御上の理由で配置された位置がズレる場合があります。
そんな時でもプログラム(命令)を修正する必要がなくなることから相対アドレス指定方式が使われるそうです。
とは言っても実際に今よく使われて「仮想記憶」が普及する前のことらしいですが……。
今回の指定方式は物理的な記憶方式とのことですので、
仮想記憶については、また今度。
オススメの参考書
ITパスポート試験
基本情報技術者