PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第36回]
●ON n GOSUB文(3)
今回もON n GOSUB文です。
[第33回]ではGOTO文の行き先として行番号だけではなくてラベルを指定することができることについて書きました。
同様にON n GOSUB文でも行き先にラベルを指定することができます。
今回はGOSUB文の行き先にラベルを使ったテストです。
普通は行番号だけとかラベルだけというような使い方が多いと思いますが今回はテストですから[第33回]と同じように行番号とラベルを混ぜたプログラムを作りました。
テストプログラムbsongosubt2.txtをロードしました。
PICBASICのテキストプログラムをロードするとそのテキストプログラムをもとにしてPICアセンブラソースプログラムファイルがコンバート作成されて最終的にPICマシン語コードファイルが作成されます。
LISTコマンドでBASICのテキストプログラムを表示しました。
GOSUB文の行き先は100、*abc、300、*xyzです。
今回はa=2を指定しましたからプログラムが正しく実行されればラベル*abcの行(200行)が実行されたあと30行に戻ってそこでブレークするはずです。
/runコマンドを実行しました。
さきほど作成されたマシン語コードがPICに書き込まれたあとそのマシン語プログラムが実行されて
*abc
end
と表示されたあとアドレス2050でブレークしました。
そのことを示す
break [2050]
の表示のあと
break before line#=100
と表示されて100行が表示されました。
マシン語プログラムのアドレス2050はもとのBASICプログラムでは100行の直前の位置(つまり30行の終わり)です。
PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000 ; 10 a=2 2000 020e movlw D'2' 2002 306e movwf a 2004 ; 20 on a gosub 100,*abc,300,*xyz 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 abc 2024 10f0 2026 1bef goto _ongosubend 2028 10f0 202a 43ec call _300 202c 10f0 202e 1bef goto _ongosubend 2030 10f0 2032 4fec call xyz 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 *abc:print "*abc":return 2068 abc 2068 2a0e movlw 2a 206a 16ec call 2c 206c 00f0 206e 610e movlw 61 2070 16ec call 2c 2072 00f0 2074 620e movlw 62 2076 16ec call 2c 2078 00f0 207a 630e movlw 63 207c 16ec call 2c 207e 00f0 2080 26ec call 4c 2082 00f0 2084 1200 return 2086 ; 300 print "300":return 2086 _300 2086 330e movlw 33 2088 16ec call 2c 208a 00f0 208c 300e movlw 30 208e 16ec call 2c 2090 00f0 2092 300e movlw 30 2094 16ec call 2c 2096 00f0 2098 26ec call 4c 209a 00f0 209c 1200 return 209e ; 400 *xyz:print "*xyz":return 209e xyz 209e 2a0e movlw 2a 20a0 16ec call 2c 20a2 00f0 20a4 780e movlw 78 20a6 16ec call 2c 20a8 00f0 20aa 790e movlw 79 20ac 16ec call 2c 20ae 00f0 20b0 7a0e movlw 7a 20b2 16ec call 2c 20b4 00f0 20b6 26ec call 4c 20b8 00f0 20ba 1200 return |
さきほどの画面で表示されたブレークアドレス2050はもとのBASICプログラムでは100行の先頭位置にあるマシン語コードのアドレスになっています。
その前の30行を実行した最後のアドレス(204C)にあるSTOP文に対応するマシン語命令CALL 24(STOP文のあとのブレーク処理をするためシステムルーチンをCALLしています)を実行したあとブレークしたのですが、CPUにはその次のアドレスが読み込まれたあとでブレークするのでブレークしたときは次のアドレス(2050)が表示されます。
PICBASICコンパイラ[第36回]
2023.6.13upload
前へ
次へ
ホームページトップへ戻る