【ジャンプ命令の種類】
PIC18シリーズになって、これまでのジャンプ命令が2ワード命令に変更され
あらたに別に1ワードのジャンプ命令が追加されました。
これらをうまく使い分けることで、プログラムサイズを小さくしたり、実行速度を
早くすることができます。
このようなジャンプ命令は下表のようになっています。
表のように大きく3種類に分けられ、それぞれの大きな差は、ジャンプ先の
指定可能範囲です。
種別 命 令 実行サイクル数 ジャンプ先範囲 機能内容 1ワード BC n 条件不一致時は
1サイクル
条件一致時で
ジャンプする時は
2サイクルジャンプ先は
現アドレスに対し
-128以上+127以下条件成立時に相対近傍
にジャンプ。
条件不成立ならNOPBN n BNN n BNOV n BNZ n BOV n BZ n 1ワード BRA n 2サイクル ジャンプ先は現アドレス
-1024以上+1023以下相対近傍への
無条件ジャンプRCALL n 1kW以内にある
サブルーチン呼び出し2ワード CALL k 2サイクル ジャンプ先は0から1Mまで
アドレスは最下位は無く、
常時0がセットされる無条件のサブルーチン
呼び出しで全範囲への
ジャンプ可能GOTO k 無条件のジャンプ
全メモリ範囲へジャンプ可能1ワード RETURN 2サイクル スタックメモリに格納された
アドレスへジャンプする。
0から1Mまでサブルーチンからの
戻りジャンプで、全メモリ
範囲へジャンプ可能RETFIE RETLW
【使い分けと例】
上記のように、ジャンプ命令は、ジャンプ先に指定できるアドレス範囲で
3種類に大別されます。これらのジャンプ命令の使い分けは、基本的に
下記のようにすると効率よく使えます。
(1) モジュール間のジャンプ
GOTO か CALL
・モジュールのメモリ内配置を自由にしたい
・モジュールの規模が大きい
《例1》
この例では外部サブルーチンはCALL命令で呼び、
最初のモジュール呼び出しはGOTOでジャンプしています。
モジュール内部でのループのジャンプにはBRAを使っています。
(2) モジュール内のジャンプ
BRA か RCALL
・サーブルーチンからの子サブルーチン呼び出し
・スキップ命令とペアとなるジャンプ命令
(DECFSZ、INCFSZ、DCFSNZ、INFSNZなど)
《例2》
この例では、モジュール内の子サブルーチン呼び出しにはRCALL
を使い、スキップによるループには、BRA命令を使っています。
(3) ループ内のジャンプ
Bxx
・大小判定やゼロ判定でのループ内での分岐
《例3》
この例では、サブルーチン内の判定処理でBxx命令を使っています。