[PP0906] 07. ロードとストア
今回は、メモリに対するアクセスを行うためのロードおよびストア命令を追加することにします。PP0906 では、ロードとストアに関して、二種類のアドレス指定方式(アドレッシングモード)を用意することにします。
| 命令 | ニーモニック | 命令長 | 意味 |
|---|---|---|---|
| 8 | LD | 2 | 直接アドレス指定方式によるロード |
| 9 | ST | 2 | 直接アドレス指定方式によるストア |
| 10 | LDIX | 2 | 指標アドレス指定方式によるロード |
| 11 | STIX | 2 | 指標アドレス指定方式によるストア |
これらの命令を使った簡単なプログラムを次に示します。
{
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 ワードで指定したアドレスを実効アドレスとします。
eaddr = memory[pc];
pc = pc + 1;
a = memory[eaddr];
break;
現在の PC が指すアドレス(命令の第 2 ワード)からアドレスを読み取ります。そして、いつものように PC をひとつ進めます。ここで読み取ったアドレスは実効アドレスですので、eaddr に格納しています。そして、アドレス eaddr の値を A に読み込んでいます。
直接アドレス指定方式のストアは、読み込みを書き込みに変更するだけでできます。
eaddr = memory[pc];
pc = pc + 1;
memory[eaddr] = a;
break;
次は、指標アドレス指定方式のロード命令である LDIX です。直接指定方式では、命令の第 2 ワードで指定したアドレスに X を加えた値を実効アドレスとします
eaddr = memory[pc] + x;
pc = pc + 1;
a = memory[eaddr];
break;
指標アドレス指定方式のストア命令である STIX も同じようにして作ることができます。
eaddr = memory[pc] + x;
pc = pc + 1;
memory[eaddr] = a;
break;
今回は、ロードおよびストア命令を追加したわけですが、直接アドレス指定方式と指標アドレス指定方式の作り方について解説しました。今後登場する命令でも、これらのアドレス指定方式を使うことがあると思いますので、これらの振る舞いや実現方法に付いてはしっかり覚えておいてください。
この記事のトラックバックURL:
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- C99関数・マクロ・前処理スクリプト集
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ベターCとしてのC++
- マイコン メモ
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- PP0906 - 初級者向け擬似プロセッサ
- [PP0906] 00. 擬似プロセッサ PP0906 を作る
- [PP0906] 01. 擬似プロセッサ PP0906 の仕様
- [PP0906] 02. 主記憶と制御装置
- [PP0906] 03. 何もしないプログラム
- [PP0906] 04. 即値のロードと出力
- [PP0906] 05. レジスタ間の転送
- [PP0906] 06. ニーモニックを使う
- [PP0906] 07. ロードとストア
- [PP0906] 08. ジャンプ
- [PP0906] 09. スタック操作
- [PP0906] 10. コールとリターン
- [PP0906] 11. インクリメントとデクリメント
- [PP0906] 12. 条件分岐
- [PP0906] 13. 加算と減算
- [PP0906] 14. 不正命令例外
- [PP0906] 15. まとめ
- PP0906 - 初級者向け擬似プロセッサ
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

