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


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

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