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
前へ
次へ
ホームページトップへ戻る