PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第58回]
●変数の共有(グローバル変数)
また数日ホームページの更新が出来ませんでした。
このところかなり大変な作業にはまってしまって難儀をしています。
やっと少しずつほぐれてきていますので近日中にそのあれこれについて書くことができると思います。
[第55回]で「PICアセンブラ in BASIC」のサンプルプログラムを使って説明をしました。
サンプルプログラムをあまり短くて簡単なものにしてしまったので、いずれ別のサンプルプログラムを作りますと書きました。
たまたま現在作業中のプログラムで簡単なテストプログラムを作って確認をしてみたいことが出てきました。
ちょうどよい機会ですのでそれをサンプルプログラムにして追加の機能説明をすることにしました。
下が今回作ったサンプルプログラムです。
10 abc=$10:xyz=$20 20 asm 30 movlw 50 40 subwf abc 50 btfsc STATUS,0 60 goto *jp1 70 incf xyz 80 goto *end 90 *jp1 100 decf xyz 110 *end 120 endasm 130 print abc,xyz |
短いプログラムですがちょっと見には何をやっているかよくわかりませんでしょう。
これだけを見て何をやっているかが理解できた方はPICアセンブラに相当経験がある方だと思います。
20 asm の次の行から 120 endasm の前の行までがPICアセンブラプログラムです。
BASICは先頭の10行と最後の130行だけです。
10行で変数abcとxyzに値を設定しています。
abcには16進数の10(10進数の16)を、xyzには16進数の20(10進数の32)を設定しています。
そして130行でその2つの変数の値を画面に表示します。
なんのこっちゃという感じですが。
40行で「BASICの変数」の「abc」を使っています。
そして70行と100行では同じく「BASICの変数」の「xyz」を使っています。
ここが今回の説明のキモです。
asmとendasmで囲まれた部分はいうなれば塀の中です。
途中で勝手に塀を乗り越えて外に出たり中に入ったりすることはできません。
asmが入口でendasmが出口です。
ですけれど。
変数については塀の内と外で共通に使うことができます。
まあ差し入れのようなものです。
塀の中からは親分から子分への指示を書いた手紙などが渡されます。
余りよい例えではありませんね。
でもまあ例えて言えばそういうことです。
つまり外のBASIC文と中のPICマシン語プログラムでは同じ変数名を使って値の受け渡しをすることができます。
これってちょいとすごいことなのではありませんか?
BASICプログラムで書いたほうがよいところとPICアセンブラで記述したほうがよいところがあればそれぞれを自由に書き分けて、かつその両者で使う変数は共通にすることができるのです。
もっともメインはBASICなので変数の定義はBASICでしか行なえません。
PICアセンブラではBASICで定義した変数をそのまま使うことができますがPICアセンブラ(asm〜endasmの中)では変数の定義はできません。
つまり変数はすべてグローバル変数でローカルな変数は扱えません。
上のBASIC、アセンブラの複合プログラムをコンパイルするとPICアセンブラソースプログラムとそれにPICマシン語コードを追加表記したアセンブラリストファイルが生成されます。
こちらがPICアセンブラソースプログラムです。
; 10 abc=$10:xyz=$20 movlw 10 movwf abc movlw 20 movwf xyz ; 20 asm ; 30 movlw 50 movlw 50 ; 40 subwf abc subwf abc ; 50 btfsc STATUS,0 btfsc STATUS,0 ; 60 goto *jp1 goto *jp1 ; 70 incf xyz incf xyz ; 80 goto *end goto *end ; 90 *jp1 jp1 ; 100 decf xyz decf xyz ; 110 *end end ; 120 endasm ; 130 print abc,xyz movf abc,w call 28 call 50 movf xyz,w call 28 call 4c |
そしてこちらがPICアセンブラプログラムリストです。
2040 ; 10 abc=$10:xyz=$20 2040 100e movlw 10 2042 306e movwf abc 2044 200e movlw 20 2046 316e movwf xyz 2048 ; 20 asm 2048 ; 30 movlw 50 2048 500e movlw 50 204a ; 40 subwf abc 204a 305e subwf abc 204c ; 50 btfsc STATUS,0 204c f0b0 btfsc STATUS,0 204e ; 60 goto *jp1 204e 2cef goto *jp1 2050 10f0 2052 ; 70 incf xyz 2052 312a incf xyz 2054 ; 80 goto *end 2054 2def goto *end 2056 10f0 2058 ; 90 *jp1 2058 jp1 2058 ; 100 decf xyz 2058 3106 decf xyz 205a ; 110 *end 205a end 205a ; 120 endasm 205a ; 130 print abc,xyz 205a 3050 movf abc,w 205c 14ec call 28 205e 00f0 2060 28ec call 50 2062 00f0 2064 3150 movf xyz,w 2066 14ec call 28 2068 00f0 206a 26ec call 4c 206c 00f0 |
BASICで定義した変数のabcはPICのレジスタアドレス30に、xyzは31になっています。
そしてasm〜endasmの中で使われている変数abc、xyzもレジスタアドレス30と31になっています。
BASIC文もコンパイルされてPICのマシン語プログラムに変換されますがそこで与えられるPIC内部のレジスタアドレスとasm〜endasmの中のPICアセンブラで使われるレジスタアドレスには同じアドレスが割り当てられます。
まあ最終的にすべてPICのマシン語コードになりますから当たり前といえば当たり前なのですけれど。
ブログラムを実行した結果です。
プログラムを実行するとabcの値はC0になりxyzの値は21になりました。
本日も時間がありません。
何をやっているのかということと、このプログラムの目的は?ということについては次回に説明します。
PICBASICコンパイラ[第58回]
2023.7.30upload
前へ
次へ
ホームページトップへ戻る