[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,
};
{
LI, 1,
LXI, 2,
ADD,
OUT,
ADDI, 4,
OUT,
SUB,
OUT,
-1,
};
このプログラムでは、最初に 1 + 2 を求め、その結果に 4 を加え、さらにその結果から 2(インデックスレジスタの値)を引いています。期待する実行結果は次の通りです。
0x00000003(3)
0x00000007(7)
0x00000005(5)
0x00000007(7)
0x00000005(5)
では、実際に命令を追加していきます。まずは、ADD および SUB 命令からです。
case ADD:
a = a + x;
break;
case SUB:
a = a - x;
break;
a = a + x;
break;
case SUB:
a = a - x;
break;
ADD と SUB 命令は定義どおりにコーディングしただけですので、特に説明は必要ないでしょう。次は、ADDI 命令です。
case ADDI:
a = a + memory[pc];
pc = pc + 1;
break;
a = a + memory[pc];
pc = pc + 1;
break;
これも、オペランドの即値を取り出す操作が増えただけで、特に説明するような部分はありません。
以上で、加算と減算命令を追加しました。ほかのアドレス指定方式にも対応するようにして、メモリ上の値を直接加減算できるようにするというのもひとつの手ですので、いろいろ試してみてもよいでしょう。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/528
ブックナビゲーション
- 技術情報
- 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 - 初級者向け擬似プロセッサ
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

