[PP0906] 13. 加算と減算

11. インクリメントとデクリメントでは、1 増やすまたは 1 減らすための命令を作りました。しかし、一般的には任意の値どうしを足したり、引いたりできる必要があります。今回は、そのための加算と減算の命令を追加していきます。

命令 ニーモニック 命令長 意味
25 ADD 1 アキュムレータにインデックスレジスタの値を加算し、結果をアキュムレータに格納する
26 SUB 1 アキュムレータからインデックスレジスタの値を減算し、結果をアキュムレータに格納する
27 ADDI 2 アキュムレータに即値を加算し、結果をアキュムレータに格納する

ここで、即値の減算命令がないことに着目してください。マイナスの即値をオペランドに指定すれば、それは減算と同じことになりますので、ADDI 命令で両方を兼ねることができます。そのため、SUBI 命令というのは作りません。

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

int program[] =
{
  LI, 1,
  LXI, 2,
  ADD,
  OUT,
 
  ADDI, 4,
  OUT,
 
  SUB,
  OUT,
  -1,
};

このプログラムでは、最初に 1 + 2 を求め、その結果に 4 を加え、さらにその結果から 2(インデックスレジスタの値)を引いています。期待する実行結果は次の通りです。

0x00000003(3)
0x00000007(7)
0x00000005(5)

では、実際に命令を追加していきます。まずは、ADD および SUB 命令からです。

case ADD:
  a = a + x;
  break;
case SUB:
  a = a - x;
  break;

ADD と SUB 命令は定義どおりにコーディングしただけですので、特に説明は必要ないでしょう。次は、ADDI 命令です。

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

これも、オペランドの即値を取り出す操作が増えただけで、特に説明するような部分はありません。

以上で、加算と減算命令を追加しました。ほかのアドレス指定方式にも対応するようにして、メモリ上の値を直接加減算できるようにするというのもひとつの手ですので、いろいろ試してみてもよいでしょう。

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

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