[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
};
{
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)
0x000001c8(456)
それでは命令を作っていきましょう。まずは、命令(4)のインデックスレジスタからアキュムレータへの転送命令です。
case 4:
a = x;
break;
a = x;
break;
x の値を a にコピーするだけですので簡単です。同じ要領で他の三つの命令も追加します。
case 5:
x = a;
break;
case 6:
sp = x;
break;
case 7:
x = sp;
break;
x = a;
break;
case 6:
sp = x;
break;
case 7:
x = sp;
break;
これまでは、命令を表す数値(機械語に相当)を直接書いてきました。しかし、命令の種類も増えてきましたので、そろそろ辛くなってきました。次回は、この問題を解消する方法について解説します。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/519
ブックナビゲーション
- 技術情報
- 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 - 初級者向け擬似プロセッサ
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

