記事「数を数える」で BRA と言う命令について別の記事で説明すると書きました。 BRA を含むジャンプ命令について説明します。 <PICデバイス=18F1320>
ジャンプ命令やサブルーチンコールは、ジャンプ先の範囲、ジャンプの条件、ワード数、によって分類して使い分けるのが良いと思います。
ワード数 命令 ジャンプ先(n)の範囲 ジャンプの条件等
--------------------------------------
BC n
BN n
BNN n
1 BNOV n -128以上+127以下 条件成立時に極近傍にジャンプ
BNZ n
BOV n
BZ n
--------------------------------------
1 BRA n -1024以上+1023以下 無条件に近傍にジャンプ
RCALL n 無条件に近傍のサブルーチンコール
--------------------------------------
2 CALL k 全領域 無条件にサブルーチンコール
GOTO k 無条件にジャンプ
--------------------------------------
以下の命令は条件成立時にスキップする命令ですが、ジャンプ先固定の条件ジャンプと考えることが出来ると思います。 (ニーモニックだけ列記します。)
CPFSEQ , CPFSGT , CPFSLT , DECFSZ , DCFSNZ , INCFSZ , INFSNZ ,
TSTFSZ , BTFSC , BTFSS
今のところ、このブログでは一つのソースファイルにプログラムを書いていますが、プログラムの機能毎にソースファイルを分けるのが一般的ですし、当ブログでもPICデバイスに実装するプログラムはファイルを切り分けて紹介する予定です。 機能ごとにファイルを切り分けられた小さなソースリストの方が、必要な部分に集中して作業を進められて作業が楽になります。 一方で一つのソースファイルを変更した結果、他のプログラムの機能に影響を与えないように簡単な工夫をする必要があります。 効率良くプログラムを書く為に、基本的には次のように考えています。
<<< 全領域 のジャンプとコール >>>
どこでも安心して使えますが、2ワードを要することから近傍へのジャンプには使わないように工夫します。 具体的には他のソースファイル(のラベル)にジャンプしたりサブルーチンコールする場合に使います。
<<< -1024以上+1023以下 のジャンプとコール >>>
1kワードと広い範囲をカバーしますが、プログラムを書き進むうちに間にあるプログラムサイズが増大して、突然ジャンプ可能な範囲を超えてしまうかも知れません。 念の為にも一つのソースファイルの中で使うようにします。
<<< -128以上+127以下 のジャンプ >>>
一つのソースファイルの中で使うのが原則だと思います。 隣接のラベルなど狭い範囲にジャンプするように心がけます。
例として「間接アドレッシング」に示したソースリストの中にある BZ 命令を GOTO に変えてみます。
上図の30,31行目は (reg0)の値が0なら hotz にジャンプするプログラムですが、プログラムを書いているうちに hotz の相対距離が大きくなって +127ワードを超えないとも限りません。 GOTO 命令を使えば安心です。
30、31行目をコメントアウトして、直後に下図のように5行(内2行はコメント行)を挿入しました。
BRA $+2*3 で、$は現在のプログラムカウンター値を意味します。 GOTO命令が2ワードなので、BRAと合わせて+3ワードにジャンプすると、37行目の MOVLW を実行すると言う訳です。
一連の記事のインデックスは 「とにかくビルド!」の末尾をご覧下さい。
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。
ジャンプ命令やサブルーチンコールは、ジャンプ先の範囲、ジャンプの条件、ワード数、によって分類して使い分けるのが良いと思います。
ワード数 命令 ジャンプ先(n)の範囲 ジャンプの条件等
--------------------------------------
BC n
BN n
BNN n
1 BNOV n -128以上+127以下 条件成立時に極近傍にジャンプ
BNZ n
BOV n
BZ n
--------------------------------------
1 BRA n -1024以上+1023以下 無条件に近傍にジャンプ
RCALL n 無条件に近傍のサブルーチンコール
--------------------------------------
2 CALL k 全領域 無条件にサブルーチンコール
GOTO k 無条件にジャンプ
--------------------------------------
以下の命令は条件成立時にスキップする命令ですが、ジャンプ先固定の条件ジャンプと考えることが出来ると思います。 (ニーモニックだけ列記します。)
CPFSEQ , CPFSGT , CPFSLT , DECFSZ , DCFSNZ , INCFSZ , INFSNZ ,
TSTFSZ , BTFSC , BTFSS
今のところ、このブログでは一つのソースファイルにプログラムを書いていますが、プログラムの機能毎にソースファイルを分けるのが一般的ですし、当ブログでもPICデバイスに実装するプログラムはファイルを切り分けて紹介する予定です。 機能ごとにファイルを切り分けられた小さなソースリストの方が、必要な部分に集中して作業を進められて作業が楽になります。 一方で一つのソースファイルを変更した結果、他のプログラムの機能に影響を与えないように簡単な工夫をする必要があります。 効率良くプログラムを書く為に、基本的には次のように考えています。
<<< 全領域 のジャンプとコール >>>
どこでも安心して使えますが、2ワードを要することから近傍へのジャンプには使わないように工夫します。 具体的には他のソースファイル(のラベル)にジャンプしたりサブルーチンコールする場合に使います。
<<< -1024以上+1023以下 のジャンプとコール >>>
1kワードと広い範囲をカバーしますが、プログラムを書き進むうちに間にあるプログラムサイズが増大して、突然ジャンプ可能な範囲を超えてしまうかも知れません。 念の為にも一つのソースファイルの中で使うようにします。
<<< -128以上+127以下 のジャンプ >>>
一つのソースファイルの中で使うのが原則だと思います。 隣接のラベルなど狭い範囲にジャンプするように心がけます。
例として「間接アドレッシング」に示したソースリストの中にある BZ 命令を GOTO に変えてみます。
上図の30,31行目は (reg0)の値が0なら hotz にジャンプするプログラムですが、プログラムを書いているうちに hotz の相対距離が大きくなって +127ワードを超えないとも限りません。 GOTO 命令を使えば安心です。
30、31行目をコメントアウトして、直後に下図のように5行(内2行はコメント行)を挿入しました。
BRA $+2*3 で、$は現在のプログラムカウンター値を意味します。 GOTO命令が2ワードなので、BRAと合わせて+3ワードにジャンプすると、37行目の MOVLW を実行すると言う訳です。
一連の記事のインデックスは 「とにかくビルド!」の末尾をご覧下さい。
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。