2025.8.21
前へ
次へ
ホームページトップへ戻る


超ローコストPICWRITERの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第323回]



●PIC18アセンブラ(2)BR命令

BR命令はPIC16ではただの相対ジャンプ命令で機能的にはGOTO命令のミニ版というに過ぎません。
しかしPIC18ではそこに条件判断機能が加わっています。


[出典]Microchip Technology Inc. PIC18F14K50 Data Sheet

BCからBZまで8種あります。
BRAだけは無条件ジャンプ命令です。
PIC16アセンブラではGOTOと同じ無条件ジャンプ命令のみでしたのであえて使う必要はないだろうということで形ばかりの機能として$+、$−による相対ジャンプのみでラベルによるジャンプ機能は使わないこととしました。
しかしPIC18アセンブラでGOTOで代用できるのはBRAだけでその他は条件付のジャンプ命令です。
勿論これもBITテスト命令などと組み合わせればGOTO命令を使って同等の機能とすることができますがそれではおそらくアセンブラとしては手抜きのそしりを免れないでありましょう。

下はPIC18F2450用のプログラムをMPLABでアセンブルした結果作成されたリストファイルの一部です。



501行アドレス2B6にBZがあります。
looptop1へのジャンプ命令です。
前回書きましたようにPIC18のCPU内部の動作は16ビット単位になっています。
マシン語コードもワード(16ビット)を意識したコードです。
しかしなぜかアセンブルリストはバイト単位なのでリストの解読が実に面倒です。
アドレス2B6のbz looptop1を実行する時点でPC(プログラムカウンタ)は次の命令アドレス2B8になっています。
ここからラベルlooptop1で示されるアドレス2B4にジャンプすることになります。
アドレス2B4にはmovf rbfcntr,fがあってそれはbz looptop1のひとつ前の命令です。
ワード単位で考えれば1つ前の命令アドレスなのでPCの値を−1すればよいように思いますがPCの値はすでに次の命令位置に進んでいますからここはPCの値を−2することになります。
マシン語的にはこの計算はちょっと面倒です。
まず2B4−2B8を計算します。
−4になります。
これはバイト単位ですからワードに直すためにこれを2で割って−2を得ます。
bz looptop1のマシン語コードを見るとFEがあります。
8ビットの数として見るとFEは254ですけれど符号付きの数として見れば−2になります。

もうひとつ511行アドレス2C6にBC命令があります。
bc comreadです。
comreadは命令単位で数えれば2つ先にあります。
アドレス2CCのmovlw 38です。
2ステップ先ですからPC+2にしたいところですがPCはすでに+1されていますからPIC16ならここは+1するところです。
しかしPIC18ではここが面倒です。
次の命令はgoto命令です。
PIC18ではgoto命令は2ワード32ビットに拡張されています。
ソースリストで見れば2ステップ先なのですがマシン語コードでは3ステップ先になります。
PCは+1されていますからここではPCに+2する計算になります。
アドレスの計算は2CC−2C8=4ですがそれをワード単位に直すために2で割ると結果は+2になります。
bc comreadのマシン語コードを見ると02があります。
何とも面倒ですがそれはアセンブラとしての内部での計算処理なのでこのリストのようにラベルを使えばユーザーはこんな面倒なことを意識する必要はありません。

ところが私としてはここで大いに悩むことになってしまいました。
PIC16アセンブラではちょいと手抜きをしてここを$+、$−で済ましてしまいました。
PIC18アセンブラでもそうして逃げてしまうつもりだったのですけれど。
下は上と同じソースプログラムをPIC18アセンブラ用に一部を書き直してそれをPIC18アセンブラにかけた結果出力されたリストファイルの一部です。



ラベルを使わないで$+、$−で表記するとこうなります。
$は現在の命令位置を示します。
アセンブラの作法としてアドレスは8ビットで示しますからlooptop1へのジャンプは現在位置(PCの値ではなくてこの命令のあるアドレス位置)からのジャンプなのでここは2B4−2B6=−2になります。
マシン語コードはたまたまFEになりますがこれはたまたま一致しただけです。
アドレス2C6のbc命令の$部分は2CC−2C6=+6になります。
うーん。
やっぱり手抜きは駄目か。
$による表記はマシン語コードレベルで考えることになりますからマイナスで計算する場合とか間にGOTOのように2ワード(32ビット、4バイト)の命令が入ってくるとほぼお手上げになってしまいます。
うむむむむむ。
記録的な猛暑ですけれど。
ここはもう一汗かかなければならないようです。

超ローコストPICWRITERの製作[第323回]
2025.8.21 upload

前へ
次へ
ホームページトップへ戻る