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


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

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