[PP0906] 04. 即値のロードと出力

前回までは、とりあえず主記憶上の命令を実行させるところまで作りました。しかし、ウンともスンともいいませんので、これでは正しく動作しているかどうかわかりませんし、正しく動作していたとしても、面白くも何ともありません。そこで、今回はウン、スンぐらいはいうようにしてみましょう。

今回追加する命令は、次の三つです。

命令 意味
1 アキュムレータに即値をロードする
2 インデックスレジスタに即値をロードする
3 アキュムレータの値を出力する

まずは、これらの命令を使って簡単なプログラムを作ってみます。

int program[] =
{
  1, 123, /* A ← 123 */
  2, 456, /* X ← 456 */
  3,      /* Aの値を出力 */
  -1
};

コメントにも書いたように、A(アキュムレータ)に 123 を、X(インデックスレジスタ)に 456 をそれぞれ代入します。そして、A の値を出力します。命令 1 と 2 は、即値のオペランドを取りますので、2 ワード命令になります(1 行に 2 ワード並べて書いています)。

それではアキュムレータに即値をロードする命令(1)から追加してみましょう。デコーダである switch 文に case 1 を次のように追加してください。

case 1:
  a = memory[pc];
  pc = pc + 1;
  break;

即値をロードする命令は、2 ワード命令ですので、2 ワード目を読み取ることで即値を得ることができます。したがって、命令フェッチと同じ方法で即値を読み取ればよいことになります。ただし、読み取った値は、命令レジスタではなく A(アキュムレータ)に格納しています。一種のフェッチですので、PC を進めることを忘れないでください。

インデックスレジスタに即値をロードする命令(2)も同じように作ることができます。

case 2:
  x = memory[pc];
  pc = pc + 1;
  break;

次に、出力を行う命令(3)を作ります。本物のプロセッサであれば、出力といえば出力ポートに対して行うわけですが、今回は擬似プロセッサですので、標準出力に対して出力することにします。その際、便利なように、16 進数と 10 進数を併記するようにします。

case 3:
  printf("0x%08x(%d)\n", a, a);
  break;

ここまでできれば、コンパイルして実行してみてください。今回は X にロードした値を出力する方法を示しませんでしたが、後々 X に代入した値を使う命令が出てきますので、今回は取り扱わないことにします。必要なら、各自で X の値を出力するための拡張命令を作っていただくのもよいでしょう。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/518
このエントリーを含むはてなブックマーク