「天文屋のためのマイコン入門」転送命令続き
前回転送命令の設計をしました。もう一度出してみましょう。
これを見ると、数値をデータメモリ(レジスタファイル)に転送(つまり書き込み)することだけができないのがわかります。
数値をデータメモリに書き込むためには、ワークレジスタを仲介させて、2回命令で書き込みます。たとえば、数値12をデータメモリの60番地に書き込みたい場合は、
MOVLW 12 12->W
MOVWF 60 W->F(60番地)
となります。
命令コストを下げるため、数->Fの転送を禁じたのに、2命令使ってしまうなら、結局は同じではないか。と思うかもしれません。
しかし、それでも、これの方が処理が早いのです。マイコンというのは、次から次へと命令を処理していきます。一つの命令を解析している間にも次の命令の読み込みに取り掛かっています。したがって、各命令のコストが一定していた方が処理がしやすいのです。
さて、数値をメモリに書き込むだけで2命令必要なわけですが、確かに面倒であり、プログラムサイズ的にも増えてしまいます。せめて、メモリの初期化など0を書き込むことはよくあるので、それだけでも一命令でできないかと思うでしょう。
これを解決するには、メモリを0クリアする命令を作ればよいのです。つまり数値を転送する命令ではなく、メモリをクリアする命令です。
メモリクリアと0を転送するとはまったく同じことですが、転送する数は0しか許されません。したがって、付帯情報にわざわざ0と指定する必要はなく、命令コストも増えません。
よって、次の2命令をこの転送命令グループに加えることにします。
ちなみに、
CLRW
と
MOVLW 0
は、動作的にはまったく同じです。命令コストもまったく同じです。本来必要ない命令ですが、良く見るとフラグ(そのうち説明)の変化だけ異なっています。フラグを変化させたくない場合はMOVLWを使えということでしょうか。いずれにしても上級者編で、初心者は同じものと考えて差し支えありません。
| 固定リンク
コメント