PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第33回]
●ON n GOTO文(3)
今回もON n GOTO文です。
[第31回]および前回ではGOTO文の行き先として行番号を指定しましたが、ON n GOTO文でも普通のGOTO文と同様行き先にラベルを指定することができます。
今回はGOTO文の行き先にラベルを使ったテストです。
普通は行番号だけとかラベルだけというような使い方が多いと思いますが今回はテストですから行番号とラベルを混ぜたプログラムを作りました。
テストプログラムbsongotot2.txtをロードしました。
PICBASICのテキストプログラムをロードするとそのテキストプログラムをもとにしてPICアセンブラソースプログラムファイルがコンバート作成されて最終的にPICマシン語コードファイルが作成されます。
ここでひとこと。
前回を注意深くお読みいただいた方はPICBASICコンパイラの進行の様子がいつもと違っていることに気がつかれたかもしれません。
いつもはBASICのテキストプログラムをロードするとそこでPICBASICコンパイラが起動してBASICのテキストプログラムからPICアセンブラソースプログラムファイルがコンバート作成されてさらにPICアセンブラが起動してPICマシン語コードファイルが作成されるところまでが自動的に行なわれます。
ところが前回はその部分が/RUNコマンドが実行されたあとで行なわれた後さらにそこからPICマシン語プログラムコードがPICに書き込まれたあとそのマシン語プログラムが実行されました。
前回は先にロードされ実行されたBASICプログラムの一部を書き換えました(行番号10のa=3をa=5に書き換えました)。
PICBASICコンパイラはBASICテキストプログラムを監視していてそれが一部でも書き換えられたら再度最初からコンバート作業をやり直さなければならないというようにプログラムしてあります。
通常ならば/LOADコマンドの実行によってコンパイル作業が行なわれるのですが前回はそのあとでBASICテキストプログラムが書き換えられたのにそのまま/RUNコマンドが実行されたので、そこでまずコンパイル作業が再実行されてマシン語プログラムが再作成されたあとでいつものように/RUNのプロセスが実行されたのです。
今回の説明に戻ります。
LISTコマンドでBASICのテキストプログラムを表示しました。
GOTO文の行き先は100、*abc、300、*xyzです。
今回はa=2を指定しましたからプログラムが正しく実行されればラベル*abcの行(200行)が実行されてそこでブレークするはずです。
/runコマンドを実行しました。
さきほど作成されたマシン語コードがPICに書き込まれたあとそのマシン語プログラムが実行されて
*abc end
と表示されたあとアドレス20A6でブレークしました。
そのことを示す
break [20A6]
の表示のあと
break before line#=300
と表示されて300行が表示されました。
マシン語プログラムのアドレス20A6はもとのBASICプログラムでは300行の直前の位置(つまり200行の終わり)です。
PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000 ; 10 a=2 2000 020e movlw D'2' 2002 306e movwf a 2004 ; 20 on a goto 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 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 abc 201e 10f0 2020 53ef goto _300 2022 10f0 2024 69ef goto xyz 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 *abc:print "*abc end":stop 206e abc 206e 2a0e movlw 2a 2070 16ec call 2c 2072 00f0 2074 610e movlw 61 2076 16ec call 2c 2078 00f0 207a 620e movlw 62 207c 16ec call 2c 207e 00f0 2080 630e movlw 63 2082 16ec call 2c 2084 00f0 2086 200e movlw 20 2088 16ec call 2c 208a 00f0 208c 650e movlw 65 208e 16ec call 2c 2090 00f0 2092 6e0e movlw 6e 2094 16ec call 2c 2096 00f0 2098 640e movlw 64 209a 16ec call 2c 209c 00f0 209e 26ec call 4c 20a0 00f0 20a2 12ec call 24 20a4 00f0 20a6 ; 300 print "300end":stop 20a6 _300 20a6 330e movlw 33 20a8 16ec call 2c 20aa 00f0 20ac 300e movlw 30 20ae 16ec call 2c 20b0 00f0 20b2 300e movlw 30 20b4 16ec call 2c 20b6 00f0 20b8 650e movlw 65 20ba 16ec call 2c 20bc 00f0 20be 6e0e movlw 6e 20c0 16ec call 2c 20c2 00f0 20c4 640e movlw 64 20c6 16ec call 2c 20c8 00f0 20ca 26ec call 4c 20cc 00f0 20ce 12ec call 24 20d0 00f0 20d2 ; 400 *xyz:print "*xyz end":stop 20d2 xyz 20d2 2a0e movlw 2a 20d4 16ec call 2c 20d6 00f0 20d8 780e movlw 78 20da 16ec call 2c 20dc 00f0 20de 790e movlw 79 20e0 16ec call 2c 20e2 00f0 20e4 7a0e movlw 7a 20e6 16ec call 2c 20e8 00f0 20ea 200e movlw 20 20ec 16ec call 2c 20ee 00f0 20f0 650e movlw 65 20f2 16ec call 2c 20f4 00f0 20f6 6e0e movlw 6e 20f8 16ec call 2c 20fa 00f0 20fc 640e movlw 64 20fe 16ec call 2c 2100 00f0 2102 26ec call 4c 2104 00f0 2106 12ec call 24 2108 00f0 |
さきほどの画面で表示されたブレークアドレス20A6はもとのBASICプログラムでは300行の先頭位置にあるマシン語コードのアドレスになっています。
その前の200行を実行した最後のアドレス(20A2)にあるSTOP文に対応するマシン語命令CALL 24(STOP文のあとのブレーク処理をするためシステムルーチンをCALLしています)を実行したあとブレークしたのですが、CPUにはその次のアドレスが読み込まれたあとでブレークするのでブレークしたときは次のアドレス(20A6)が表示されます。
PICBASICコンパイラ[第33回]
2023.6.7upload
前へ
次へ
ホームページトップへ戻る