計算機の基本原理を味わおう4 - CPUとメモリの密接な関係を体感しよう
CPUの各動作を実装す前に、考えておかねばならない事があります。それは、メモリレイアウトです。現実のCPUはレジスタと呼ばれる色々なデータを持っていますが、この連載で考察の対象となる最小計算機にはありません。そこで、メモリを有効に利用する必要があります。
まず必要なのは、0と1を格納する部分です。比較移動命令しかないので、0と1はメモリ内に特別に用意します。定数0が常に確保されているゼロレジスタがあるCPUがあります。それと同じ原理で、メモリ内に定数の0と1を用意します。
もう一つ必要な特別なデータは比較フラグです。普通のCPUはフラグレジスタを持っていますが、この連載ではあえて持たせていません。何故ならば、連載のコンセプトが「最小計算機」であり、実際のOSとBIOSがメモリを上手く利用している様を、疑似体験してもらうために、比較フラグ(事実上は実行フラグ)をメモリ内に用意します。
この連載を考えたときは、実はプラグラムカウンターさえも、メモリ内に確保することを検討しました。このアイデアは面白いのですが、比較移動命令しか使わないのに、インクリメント命令が必要になるような事をするのは自己矛盾です。また、ビットマシンでバイト単位のデータである、プログラムカウンタを扱うのはハードルが高いです。最後の理由は、プログラムカウンタは、計算機の重要な概念だからです。いくら最小計算機と言っても、削ってい良いものと悪いものがあります。それらの理由で、フラグレジスタは持たせず、プログラムカウンタだけ持たせることに決めました。
話が脱線したので戻します。これらの定数は・・・
cmov 100, 0 //100番地に0(0番地に用意されている定数0)を代入
cmov 100, 1 //100番地に1(1番地に用意されている定数1)を代入
という具合に使用します。例でわかると思いますが、CPUの各動作を実装す前に、考えておかねばならない事があります。それは、メモリレイアウトです。既存のCPUはレジスタと呼ばれる色々なデータを持っていますが、この連載で考察の対象となる最小計算機にはありません。そこで、メモリを有効に利用する必要があります。まず必要なのは、0と1を格納する部分です。比較移動命令しかないので、0と1はメモリ内に特別に用意します。定数0が常に確保されているゼロレジスタがあるCPUがあります。それと同じ原理で、メモリ内に定数の0と1を用意します。
もう一つ必要な特別なデータは「比較フラグ」です。普通のCPUはフラグレジスタを持っていますが、この連載ではあえて持たせていません。何故ならば、コンセプトが「最小計算機」であり、実際のOSとBIOSがメモリを上手く利用している様を、疑似体験してもらうために、比較フラグ(事実上は実行フラグ)をメモリ内に用意します。
この連載を考えたときは、実はプラグラムカウンターさえも、メモリ内に確保することを検討しました。このアイデアは面白いのですが、比較移動命令しか使わないのに、インクリメント命令が必要になるような事をするのは自己矛盾です。また、ビットマシンでバイト単位のデータである、プログラムカウンタを扱うのはハードルが高いです。最後の理由は、プログラムカウンタは、計算機の重要な概念だからです。いくら最小計算機と言っても、削ってい良いものと悪いものがあります。それらの理由で、フラグレジスタは持たせず、プログラムカウンタだけ持たせることに決めました。
話しが脱線したので戻します。これらの定数は・・・
cmov 100, 0 //100番地に0(0番地に用意されている定数0)を代入
cmov 100, 1 //100番地に1(1番地に用意されている定数1)を代入
という具合に使用します。例でわかると思いますが、定数を確保する場所と値は、0番目に0、1番目に1と決定します。これは可読性とBIOSのメモリレイアウトを考えた上での決定です。メモリレイアウトを考えるついでに、比較移動命令の約束事も考えます。比較移動命令は、メモリ内に、宛先(8ビット)と送信元(8ビット)を順番に並べます。なお、番地が低い側が下位の値になります。例えば、7を格納したい場合は、11100000となります。普通の値の書き方とは逆なことに注意してください。この値の置き方を、リトルエンディアン方式といいます。Intel製のCPUは基本的にこのリトルエンディアン方式です。覚えておいて損はありません。
このビットマシンでは、比較移動命令は宛先に特別な値を設定します。0ならばプログラムカウンタ、1ならばCPUの動作終了です。比較移動命令でCPUの動作を停止させるのはちょっと違和感がありますが、これは実装上の都合です。計算機の概念とは関係がありません。
今回はこれでお終いです。CPUとメモリレイアウトは密室な関係があります。そのことを覚えておけば、実際のアセンブラプログラミングをする能力やバイナリ解析をする力も上がります。ひいては、プログラミング力も上がります。ぜひ、メモリレイアウトを考える習慣を身につけましょう。