[PP0906] 06. ニーモニックを使う
前回、命令数が増えてきたこともあり、命令を数値のまま扱うのが辛くなってきたと書きました。実際その通りで、もう少し命令を扱いやすくするために、何らかの工夫が必要になります。そこで、単なる数値に過ぎなかった各命令に、もう少し分かりやすい名前を付けることにします。この名前のことをニーモニックといいます。
これまでに出てきた命令にニーモニックを与え、下記の表のようにまとめてみました。
| 命令 | ニーモニック | 命令長 | 意味 |
|---|---|---|---|
| 0 | NOP | 1 | 何もしない |
| 1 | LI | 2 | アキュムレータに即値をロードする |
| 2 | LXI | 2 | インデックスレジスタに即値をロードする |
| 3 | OUT | 1 | アキュムレータの値を出力する |
| 4 | MOVAX | 1 | インデックスレジスタの値をアキュムレータに転送 |
| 5 | MOVXA | 1 | アキュムレータの値をインデックスレジスタに転送 |
| 6 | MOVSX | 1 | インデックスレジスタの値をスタックポインタに転送 |
| 7 | MOVXS | 1 | スタックポインタの値をインデックスレジスタに転送 |
ニーモニックの付けかたについては好みもありますし、これが一番よいというわけでもありませんが、とりあえずこのようにしたいと思います。これらのニーモニックをマクロとして定義しておけば、C 言語で書く場合でもニーモニックを使うことができるようになります。次のマクロ定義をソースファイルの最初のあたり(ヘッダをインクルードした直後あたりがよいでしょう)に追加してください。以後、命令を追加していくたびに、このマクロ定義も増やしていく必要があります。
#define NOP 0
#define LI 1
#define LXI 2
#define OUT 3
#define MOVAX 4
#define MOVXA 5
#define MOVSX 6
#define MOVXS 7
#define LI 1
#define LXI 2
#define OUT 3
#define MOVAX 4
#define MOVXA 5
#define MOVSX 6
#define MOVXS 7
ニーモニックを使って、前回のプログラムを書き直すと次のようになります。
int program[] =
{
LXI, 123, /* X ← 123 */
MOVAX, /* A ← X */
OUT, /* Aの値を出力 */
LI, 456, /* A ← 456 */
MOVXA, /* X ← A */
MOVAX, /* A ← X */
OUT, /* Aの値を出力 */
-1
};
{
LXI, 123, /* X ← 123 */
MOVAX, /* A ← X */
OUT, /* Aの値を出力 */
LI, 456, /* A ← 456 */
MOVXA, /* X ← A */
MOVAX, /* A ← X */
OUT, /* Aの値を出力 */
-1
};
このように、あまりにも非人間的な機械語の命令にニーモニックを与えることで、多少なりとも人間が扱いやすくなるように工夫することが、アセンブリ言語の出発点です。ここでは、アセンブラというアセンブリ言語を機械語に翻訳するための専用プログラムを用意するのではなく、単なる C 言語のマクロを使ってニーモニックを書けるようにしただけですので、本格的なアセンブラに比べると非力ですが、それでも無いよりはずっとましです。
この記事のトラックバックURL:
http://www.kijineko.co.jp/trackback/520
ブックナビゲーション
- 技術情報
- 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 - 初級者向け擬似プロセッサ
- 象の卵を探して...
- 車輪の再発明
- 過去の情報

