[PP0906] 05. レジスタ間の転送

前回はレジスタ(アキュムレータとインデックスレジスタ)に即値をロードする命令と、アキュムレータの値を出力する命令について解説しました。インデックスレジスタの値を出力する命令がなかったのですが、インデックスレジスタというのはそもそもそういうものです。ただ、インデックスレジスタの値を出力する何らかの方法が欲しいのも事実です。そこで、アキュムレータ経由で出力できるようにします。そのために必要なのがレジスタ間の転送命令です。

レジスタ間の転送命令として、次の四つを定義します。

命令 意味
4 インデックスレジスタの値をアキュムレータに転送
5 アキュムレータの値をインデックスレジスタに転送
6 インデックスレジスタの値をスタックポインタに転送
7 スタックポインタの値をインデックスレジスタに転送

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

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

各命令を作った後、上のプログラムを実行すると次のような出力結果になるはずです。

0x0000007b(123)
0x000001c8(456)

それでは命令を作っていきましょう。まずは、命令(4)のインデックスレジスタからアキュムレータへの転送命令です。

case 4:
  a = x;
  break;

x の値を a にコピーするだけですので簡単です。同じ要領で他の三つの命令も追加します。

case 5:
  x = a;
  break;
case 6:
  sp = x;
  break;
case 7:
  x = sp;
  break;

これまでは、命令を表す数値(機械語に相当)を直接書いてきました。しかし、命令の種類も増えてきましたので、そろそろ辛くなってきました。次回は、この問題を解消する方法について解説します。

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

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