PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第31回]
●ON n GOTO文
また何日か間が空いてしまいました。
今回のテーマ、ON n GOTO文のところがなかなかに手間で苦戦しておりました。
ちょっと前のところで書きましたようにPICBASICコンパイラとしては大体はできあがっていたのですが、考えるところがあってそれを全部壊してしまって最初からもう一度再構築する作業をしております。
ON n GOTO文も一度はちゃんと働くところまでできていたのですがそれも全部壊して再構築したらうまく動かなくなってしまいました。
この部分は結構面倒なことをやっていたところで、全部壊したつもりでもあちこちに断片が残っていてそれが邪魔をしていました。
毎度のことなのですが土曜も日曜も早朝から取り組んで作業した結果やっと元通りに働くようになりました。
ON n GOTO文は複数のGOTO文を併記して、その何番目を実行するかを n で指定する文です。
いつものようにテストプログラムをロードしました。
/LOAD BSONGOTOT1
でBSONGOTOT1.TXTファイルをロードしました。
簡単なサンプルプログラムなのですが、やっていることは結構複雑なのでマシン語コードに変換するとご覧の通りそれなりのサイズのプログラムになります。
16進コードの表示部分がいつもよりも多いので最初の部分がスクロールして見えなくなっています。
BASICプログラムのテキストファイルをロードするといつものようにマシン語コードへのコンバート作業から最後のマシン語オブジェクトファイルの作成までが自動的に行なわれます。
結果的にBASICのソースプログラムを表示するのは手順としては逆になってしまいます。
LISTコマンドでロードしたBASICのソースプログラムを表示しました。
動作確認のテストですので例としてa=3を設定しています。
aの値で選択されるGOTO文の行き先の行番号は100、200、300、400の4通りです。
a=3ですから3番目の300行が実行されます。
/runコマンドを入力しました。
/runコマンドで今作成されたPICのマシン語プログラムがPICに書き込まれ、続いてそのマシン語プログラムが直ちに実行されます。
書き込み中を示すwriting...のあと
256bytes writtenで書き込みが完了したことを表示、そのあとすぐに
program startedでプログラムの実行が開始されます。
プログラムはデバッグ動作のためにWindowsパソコンにUSB接続したPICで行なわれます。
300行が実行された結果
300end
と表示されたあとSTOP文でブレークしてWindows(コマンドプロンプト)に制御が戻りました。
もとのプログラムはBASICですが実際に実行されているのはPICに書き込まれたマシン語コードなのでブレークしたポイントもマシン語のプログラムアドレスで表示されます。
アドレス20C6でブレークしました。
そのアドレスはもとのBASICプログラムでは400行の直前の位置(つまり300行の終わり)です。
PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000 ; 10 a=3 2000 030e movlw D'3' 2002 306e movwf a 2004 ; 20 on a goto 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 0ce2 bc $+1a 2010 1c46 rlncf R1c,f 2012 1c46 rlncf R1c,f 2014 2eec call 5c 2016 00f0 2018 21ef goto _100 201a 10f0 201c 37ef goto _200 201e 10f0 2020 4def goto _300 2022 10f0 2024 63ef goto _400 2026 10f0 2028 ; 30 print "end":stop 2028 650e movlw 65 202a 16ec call 2c 202c 00f0 202e 6e0e movlw 6e 2030 16ec call 2c 2032 00f0 2034 640e movlw 64 2036 16ec call 2c 2038 00f0 203a 26ec call 4c 203c 00f0 203e 12ec call 24 2040 00f0 2042 ; 100 print "100end":stop 2042 _100 2042 310e movlw 31 2044 16ec call 2c 2046 00f0 2048 300e movlw 30 204a 16ec call 2c 204c 00f0 204e 300e movlw 30 2050 16ec call 2c 2052 00f0 2054 650e movlw 65 2056 16ec call 2c 2058 00f0 205a 6e0e movlw 6e 205c 16ec call 2c 205e 00f0 2060 640e movlw 64 2062 16ec call 2c 2064 00f0 2066 26ec call 4c 2068 00f0 206a 12ec call 24 206c 00f0 206e ; 200 print "200end":stop 206e _200 206e 320e movlw 32 2070 16ec call 2c 2072 00f0 2074 300e movlw 30 2076 16ec call 2c 2078 00f0 207a 300e movlw 30 207c 16ec call 2c 207e 00f0 2080 650e movlw 65 2082 16ec call 2c 2084 00f0 2086 6e0e movlw 6e 2088 16ec call 2c 208a 00f0 208c 640e movlw 64 208e 16ec call 2c 2090 00f0 2092 26ec call 4c 2094 00f0 2096 12ec call 24 2098 00f0 209a ; 300 print "300end":stop 209a _300 209a 330e movlw 33 209c 16ec call 2c 209e 00f0 20a0 300e movlw 30 20a2 16ec call 2c 20a4 00f0 20a6 300e movlw 30 20a8 16ec call 2c 20aa 00f0 20ac 650e movlw 65 20ae 16ec call 2c 20b0 00f0 20b2 6e0e movlw 6e 20b4 16ec call 2c 20b6 00f0 20b8 640e movlw 64 20ba 16ec call 2c 20bc 00f0 20be 26ec call 4c 20c0 00f0 20c2 12ec call 24 20c4 00f0 20c6 ; 400 print "400end":stop 20c6 _400 20c6 340e movlw 34 20c8 16ec call 2c 20ca 00f0 20cc 300e movlw 30 20ce 16ec call 2c 20d0 00f0 20d2 300e movlw 30 20d4 16ec call 2c 20d6 00f0 20d8 650e movlw 65 20da 16ec call 2c 20dc 00f0 20de 6e0e movlw 6e 20e0 16ec call 2c 20e2 00f0 20e4 640e movlw 64 20e6 16ec call 2c 20e8 00f0 20ea 26ec call 4c 20ec 00f0 20ee 12ec call 24 20f0 00f0 |
さきほどの画面で表示されたブレークアドレス20C6はもとのBASICプログラムでは400行の先頭位置にあるマシン語コードのアドレスになっています。
その前の300行を実行した最後のアドレス(20C2)にあるSTOP文に対応するマシン語命令CALL 24(STOP文のあとのブレーク処理をするためシステムルーチンをCALLしています)を実行したあとブレークしたのですが、CPUにはその次のアドレスが読み込まれたあとでブレークするのでブレークしたときは次のアドレス(20C6)が表示されます。
PICBASICコンパイラ[第31回]
2023.6.4upload
前へ
次へ
ホームページトップへ戻る