ジャンプ命令の使い方


【ジャンプ命令の種類】

 PIC18シリーズになって、これまでのジャンプ命令が2ワード命令に変更され
あらたに別に1ワードのジャンプ命令が追加されました。
これらをうまく使い分けることで、プログラムサイズを小さくしたり、実行速度を
早くすることができます。
 このようなジャンプ命令は下表のようになっています。
表のように大きく3種類に分けられ、それぞれの大きな差は、ジャンプ先の
指定可能範囲です。

種別 命 令 実行サイクル数 ジャンプ先範囲 機能内容
1ワード BC n 条件不一致時は
  1サイクル
条件一致時で
ジャンプする時は
  2サイクル
ジャンプ先は
現アドレスに対し
-128以上+127以下
条件成立時に相対近傍
にジャンプ。
条件不成立ならNOP
BN 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命令を使っています。









  トップページへ