[PP0906] 04. 即値のロードと出力
前回までは、とりあえず主記憶上の命令を実行させるところまで作りました。しかし、ウンともスンともいいませんので、これでは正しく動作しているかどうかわかりませんし、正しく動作していたとしても、面白くも何ともありません。そこで、今回はウン、スンぐらいはいうようにしてみましょう。
今回追加する命令は、次の三つです。
| 命令 | 意味 |
|---|---|
| 1 | アキュムレータに即値をロードする |
| 2 | インデックスレジスタに即値をロードする |
| 3 | アキュムレータの値を出力する |
まずは、これらの命令を使って簡単なプログラムを作ってみます。
{
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 を次のように追加してください。
a = memory[pc];
pc = pc + 1;
break;
即値をロードする命令は、2 ワード命令ですので、2 ワード目を読み取ることで即値を得ることができます。したがって、命令フェッチと同じ方法で即値を読み取ればよいことになります。ただし、読み取った値は、命令レジスタではなく A(アキュムレータ)に格納しています。一種のフェッチですので、PC を進めることを忘れないでください。
インデックスレジスタに即値をロードする命令(2)も同じように作ることができます。
x = memory[pc];
pc = pc + 1;
break;
次に、出力を行う命令(3)を作ります。本物のプロセッサであれば、出力といえば出力ポートに対して行うわけですが、今回は擬似プロセッサですので、標準出力に対して出力することにします。その際、便利なように、16 進数と 10 進数を併記するようにします。
printf("0x%08x(%d)\n", a, a);
break;
ここまでできれば、コンパイルして実行してみてください。今回は X にロードした値を出力する方法を示しませんでしたが、後々 X に代入した値を使う命令が出てきますので、今回は取り扱わないことにします。必要なら、各自で X の値を出力するための拡張命令を作っていただくのもよいでしょう。
この記事のトラックバック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 - 初級者向け擬似プロセッサ
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

