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


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第34回]



●ON n GOSUB文

また何日か間が空いてしまいました。
ここ数日新しい機能を追加する作業を行なっているのですがPICがなかなか思うように動いてくれなくて苦戦しておりました。
過去形で書きましたが実際にはまだ完全にクリアできたわけではありません。
でもまあなんとかなりそうなところまできましたので、数日ぶりのHPの更新です。

ここ何回かON n GOTO文について書きました。
ON n GOSUB文もそれに良く似た命令です。
nの値によって実行するGOSUB文を選択するところはON n GOTO文と同じです。
しかしON n GOSUB文には注意する点があります。
ON n GOTO文はnによって選択された行き先に分岐したらそのまま「行きっ放し」になってしまいますが、ON n GOSUB文は分岐した行き先での処理が終ったらON n GOSUB文の次の命令に戻ってくるという点です。
GOSUB文ですから行き先での処理の最後はRETURN命令で終ります。

ON n GOSUB文のテストプログラムをロードしました。

/LOAD BSONGOSUBT1
でBSONGOSUBT1.TXTファイルをロードしました。
ON n GOSUB文はON n GOTO文とほとんど同じ構造ですがコンパイルしてマシン語のコードに置き換えて16進コードで表示している部分がON n GOTO文よりもちょっと短くなっています。
ON n GOSUB文のマシン語プログラムが短いわけではなくて、テストのために組み込んだPRINT文を短くした結果そのようになっています。
BASICプログラムのテキストファイルをロードするとマシン語コードへのコンバート作業から最後のマシン語オブジェクトファイルの作成までが自動的に行なわれます。

LISTコマンドでBASICのソースプログラムを表示しました。

ON n GOTO文とほとんど同じプログラムです。
nの値としては変数aを使いa=3を設定しています。
aの値で選択されるGOSUB文の行き先の行番号は100、200、300、400の4通りです。
a=3ですから3番目の300行が実行されます。
/runコマンドを入力しました。
/runコマンドで今作成されたPICのマシン語プログラムがPICに書き込まれ、続いてそのマシン語プログラムが直ちに実行されます。
書き込み中を示すwriting...のあと
192bytes writtenで書き込みが完了したことを表示、そのあとすぐに
program startedでプログラムの実行が開始されます。
プログラムはデバッグ動作のためにWindowsパソコンにUSB接続したPICで行なわれます。
300行が実行された結果
300
と表示したあとRETURN文でもとのところに戻って30行が実行されて
end
と表示してSTOP文でブレークしてWindows(コマンドプロンプト)に制御が戻りました。
もとのプログラムはBASICですが実際に実行されているのはPICに書き込まれたマシン語コードなのでブレークしたポイントもマシン語のプログラムアドレスで表示されます。
アドレス2050でブレークしました。
そのアドレスはもとのBASICプログラムでは100行の直前の位置(つまり30行の終わり)です。
上のプログラムでは100〜400行のサブルーチンはどれも1行で終っていますがそれぞれ複数行になっても全く構いません。
ただしそれぞれのサブルーチンの終わりは必ずRETURN文でなければなりません。

PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000      ;    10 a=3
2000 030e     movlw D'3'
2002 306e     movwf a
2004      ;    20 on a gosub 100,200,300,400
2004 3050     movf a,w
2006 1c6e     movwf R1c
2008 1c06     decf R1c,f
200a 040e     movlw 4
200c 1c5c     subwf R1c,w
200e 13e2     bc $+28
2010 1c46     rlncf R1c,f
2012 1c46     rlncf R1c,f
2014 1c46     rlncf R1c,f
2016 2eec     call 5c
2018 00f0 
201a 28ec     call _100
201c 10f0 
201e 1bef     goto _ongosubend
2020 10f0 
2022 34ec     call _200
2024 10f0 
2026 1bef     goto _ongosubend
2028 10f0 
202a 40ec     call _300
202c 10f0 
202e 1bef     goto _ongosubend
2030 10f0 
2032 4cec     call _400
2034 10f0 
2036      _ongosubend
2036      ;    30 print "end":stop
2036 650e     movlw 65
2038 16ec     call 2c
203a 00f0 
203c 6e0e     movlw 6e
203e 16ec     call 2c
2040 00f0 
2042 640e     movlw 64
2044 16ec     call 2c
2046 00f0 
2048 26ec     call 4c
204a 00f0 
204c 12ec     call 24
204e 00f0 
2050      ;   100 print "100":return
2050      _100
2050 310e     movlw 31
2052 16ec     call 2c
2054 00f0 
2056 300e     movlw 30
2058 16ec     call 2c
205a 00f0 
205c 300e     movlw 30
205e 16ec     call 2c
2060 00f0 
2062 26ec     call 4c
2064 00f0 
2066 1200     return
2068      ;   200 print "200":return
2068      _200
2068 320e     movlw 32
206a 16ec     call 2c
206c 00f0 
206e 300e     movlw 30
2070 16ec     call 2c
2072 00f0 
2074 300e     movlw 30
2076 16ec     call 2c
2078 00f0 
207a 26ec     call 4c
207c 00f0 
207e 1200     return
2080      ;   300 print "300":return
2080      _300
2080 330e     movlw 33
2082 16ec     call 2c
2084 00f0 
2086 300e     movlw 30
2088 16ec     call 2c
208a 00f0 
208c 300e     movlw 30
208e 16ec     call 2c
2090 00f0 
2092 26ec     call 4c
2094 00f0 
2096 1200     return
2098      ;   400 print "400":return
2098      _400
2098 340e     movlw 34
209a 16ec     call 2c
209c 00f0 
209e 300e     movlw 30
20a0 16ec     call 2c
20a2 00f0 
20a4 300e     movlw 30
20a6 16ec     call 2c
20a8 00f0 
20aa 26ec     call 4c
20ac 00f0 
20ae 1200     return

さきほどの画面で表示されたブレークアドレス2050はもとのBASICプログラムでは100行の先頭位置にあるマシン語コードのアドレスになっています。
その前の30行を実行した最後のアドレス(204C)にあるSTOP文に対応するマシン語命令CALL 24(STOP文のあとのブレーク処理をするためシステムルーチンをCALLしています)を実行したあとブレークしたのですが、CPUにはその次のアドレスが読み込まれたあとでブレークするのでブレークしたときは次のアドレス(2050)が表示されます。

PICBASICコンパイラ[第34回]
2023.6.10upload

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