[PP0906] 07. ロードとストア

今回は、メモリに対するアクセスを行うためのロードおよびストア命令を追加することにします。PP0906 では、ロードとストアに関して、二種類のアドレス指定方式(アドレッシングモード)を用意することにします。

命令 ニーモニック 命令長 意味
8 LD 2 直接アドレス指定方式によるロード
9 ST 2 直接アドレス指定方式によるストア
10 LDIX 2 指標アドレス指定方式によるロード
11 STIX 2 指標アドレス指定方式によるストア

これらの命令を使った簡単なプログラムを次に示します。

int program[] =
{
  LI, 123,
  ST, 0x1000,
  LI, 456,
  OUT,
  LD, 0x1000,
  OUT,
 
  LI, 789,
  LXI, 1,
  STIX, 0x1000,
  LI, 321,
  OUT,
  LDIX, 0x1000,
  OUT,
 
  LXI, 0,
  LDIX, 0x1000,
  OUT,
  -1
};

ちょっと複雑になってきましたが、ひとつずつ追っていけばそれほど難しい内容ではありません。最初に、A に即値 123 をロードし、それを 0x1000 番地のメモリにストアしています。次に、A に即値 456 をロードして A の値を破壊してから、0x1000 番地のメモリの内容をロードしています。この時点で、A には先ほどストアした 123 が格納されるはずです。

今度は、A に即値 789 を、X に即値 1 をロードします。そして、0x1000 + X(0x1000 + 1 = 0x1001)番地のメモリにストアしています。次に、A に即値 321 をロードして A の値を破壊してから、0x1000 + X(0x1000 + 1 = 0x1001)番地のメモリの内容をロードしています。この時点で、A には先ほどストアした 789 が格納されるはずです。

最後に、X に即値 0 をロードし、0x1000 + X(0x1000 + 0 = 0x1000)番地のメモリからロードします。この時点で、A には最初にストアした 123 が格納されるはずです。

それでは命令を追加していきます。まずは、直接アドレス指定方式によるロード命令である LD からです。直接指定方式では、命令の第 2 ワードで指定したアドレスを実効アドレスとします。

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

現在の PC が指すアドレス(命令の第 2 ワード)からアドレスを読み取ります。そして、いつものように PC をひとつ進めます。ここで読み取ったアドレスは実効アドレスですので、eaddr に格納しています。そして、アドレス eaddr の値を A に読み込んでいます。

直接アドレス指定方式のストアは、読み込みを書き込みに変更するだけでできます。

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

次は、指標アドレス指定方式のロード命令である LDIX です。直接指定方式では、命令の第 2 ワードで指定したアドレスに X を加えた値を実効アドレスとします

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

指標アドレス指定方式のストア命令である STIX も同じようにして作ることができます。

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

今回は、ロードおよびストア命令を追加したわけですが、直接アドレス指定方式と指標アドレス指定方式の作り方について解説しました。今後登場する命令でも、これらのアドレス指定方式を使うことがあると思いますので、これらの振る舞いや実現方法に付いてはしっかり覚えておいてください。

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

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