PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第251回]
●新PICBS02(PIC18F45K50)LEDチカチカ(2)
当連載を最初からお読みいただいている方は理解されてみえると思いますが途中からお読みいただいた方は前回のBASICプログラムが本当にコンパイラによってPICのマシン語コードに翻訳されてそれがPIC18F45K50に書き込まれて実行されたということが今ひとつ実感できないのではと思います。
実際コマンドプロンプト画面を見ただけでは本当に「BASICからPICのマシン語に翻訳されているの?」と半信半疑のお方もいらっしゃるかと。
そこで今回はそのあたりをもう少し詳しく説明することにします。
PICBASICコンパイラは2段階で実行されますがそれは自動的に連続して行なわれます。
最初にBASICプログラムがPICアセンブラプログラムに翻訳されます。
次にそのPICアセンブラプログラムがPICアセンブラによってPICのマシン語命令コードに翻訳されます。
下は前回のBASICプログラム(ソースプログラム)です。
10 TRISD=0 20 PORTD=1 30 wait 0 32 wait 0 34 wait 0 36 wait 0 40 PORTD=2 50 wait 0 52 wait 0 54 wait 0 56 wait 0 60 goto 20 |
下はそのBASICプログラムがBASICコンパイラによって翻訳され生成されたPICアセンブラプログラムです。
; 10 TRISD=0
movlw D'0'
movwf R1c
movwf TRISD
; 20 PORTD=1
_20
movlw D'1'
movwf R1c
movwf PORTD
; 30 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 32 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 34 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 36 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 40 PORTD=2
movlw D'2'
movwf R1c
movwf PORTD
; 50 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 52 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 54 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 56 wait 0
movlw D'0'
movwf R1c
movwf waitcntr
call 38
decfsz waitcntr
bra $-6
nop
; 60 goto 20
goto _20
|
BASICプログラムが1行ごとにPICの命令に翻訳されています。
もとのBASICプログラム行はコメント行としてリスト中に埋め込まれていますからひとつのBASIC命令がどのようなPICの命令に翻訳されているかがわかるようになっています。
これを読むことでPICのマシン語命令の使い方の参考にしていただけると思います。
このプログラムファイルはもとのBASICプログラム名に拡張子ASMをつけたファイルとして保存されますからあとでメモ帳などのテキストエディタで見ることができます。
下はBASICコンパイラの中で生成されたASMファイル(上のファイル)が読み込まれて今度はPICアセンブラによってアセンブルされてPICのマシン語命令コードに翻訳される過程で生成されたアセンブルリストです。
2040 ; 10 TRISD=0 2040 000e movlw D'0' 2042 1c6e movwf R1c 2044 956e movwf TRISD 2046 ; 20 PORTD=1 2046 _20 2046 010e movlw D'1' 2048 1c6e movwf R1c 204a 836e movwf PORTD 204c ; 30 wait 0 204c 000e movlw D'0' 204e 1c6e movwf R1c 2050 306e movwf waitcntr 2052 1cec call 38 2054 00f0 2056 302e decfsz waitcntr 2058 fcd7 bra $-6 205a 0000 nop 205c ; 32 wait 0 205c 000e movlw D'0' 205e 1c6e movwf R1c 2060 306e movwf waitcntr 2062 1cec call 38 2064 00f0 2066 302e decfsz waitcntr 2068 fcd7 bra $-6 206a 0000 nop 206c ; 34 wait 0 206c 000e movlw D'0' 206e 1c6e movwf R1c 2070 306e movwf waitcntr 2072 1cec call 38 2074 00f0 2076 302e decfsz waitcntr 2078 fcd7 bra $-6 207a 0000 nop 207c ; 36 wait 0 207c 000e movlw D'0' 207e 1c6e movwf R1c 2080 306e movwf waitcntr 2082 1cec call 38 2084 00f0 2086 302e decfsz waitcntr 2088 fcd7 bra $-6 208a 0000 nop 208c ; 40 PORTD=2 208c 020e movlw D'2' 208e 1c6e movwf R1c 2090 836e movwf PORTD 2092 ; 50 wait 0 2092 000e movlw D'0' 2094 1c6e movwf R1c 2096 306e movwf waitcntr 2098 1cec call 38 209a 00f0 209c 302e decfsz waitcntr 209e fcd7 bra $-6 20a0 0000 nop 20a2 ; 52 wait 0 20a2 000e movlw D'0' 20a4 1c6e movwf R1c 20a6 306e movwf waitcntr 20a8 1cec call 38 20aa 00f0 20ac 302e decfsz waitcntr 20ae fcd7 bra $-6 20b0 0000 nop 20b2 ; 54 wait 0 20b2 000e movlw D'0' 20b4 1c6e movwf R1c 20b6 306e movwf waitcntr 20b8 1cec call 38 20ba 00f0 20bc 302e decfsz waitcntr 20be fcd7 bra $-6 20c0 0000 nop 20c2 ; 56 wait 0 20c2 000e movlw D'0' 20c4 1c6e movwf R1c 20c6 306e movwf waitcntr 20c8 1cec call 38 20ca 00f0 20cc 302e decfsz waitcntr 20ce fcd7 bra $-6 20d0 0000 nop 20d2 ; 60 goto 20 20d2 23ef goto _20 20d4 10f0 |
このファイルも拡張子LSTのファイルとして保存されます。
下は前回実行した作業のログです。
全体だと長くなるので終わり近くの部分をお見せします。
>list 10 TRISD=0 20 PORTD=1 30 wait 0 32 wait 0 34 wait 0 36 wait 0 40 PORTD=2 50 wait 0 52 wait 0 54 wait 0 56 wait 0 60 goto 20 >/save ledtest1.txt 12lines save ok >/run contmk=0,convmk=0,bswrmk=1 *convert* end of convert *** p18asm *** load ledtest1.asm objbfi=150 bytes 00 0E 1C 6E 95 6E 01 0E - 1C 6E 83 6E 00 0E 1C 6E 30 6E 1C EC 00 F0 30 2E - FC D7 00 00 00 0E 1C 6E 30 6E 1C EC 00 F0 30 2E - FC D7 00 00 00 0E 1C 6E 30 6E 1C EC 00 F0 30 2E - FC D7 00 00 00 0E 1C 6E 30 6E 1C EC 00 F0 30 2E - FC D7 00 00 02 0E 1C 6E 83 6E 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 00 00 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 00 00 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 00 00 00 0E 1C 6E 30 6E - 1C EC 00 F0 30 2E FC D7 00 00 23 EF 10 F0 save object file 150bytes save ok save list file *** end asm *** end objbfi=150 writing[00][0e][1c][6e][95][6e][01][0e][1c][6e][83][6e][00][0e][1c][6e][30][6e][ 1c][ec][00][f0][30][2e][fc][d7][00][00][00][0e][1c][6e].[30][6e][1c][ec][00][f0] [30][2e][fc][d7][00][00][00][0e][1c][6e][30][6e][1c][ec][00][f0][30][2e][fc][d7] [00][00][00][0e][1c][6e].[30][6e][1c][ec][00][f0][30][2e][fc][d7][00][00][02][0e ][1c][6e][83][6e][00][0e][1c][6e][30][6e][1c][ec][00][f0][30][2e][fc][d7].[00][0 0][00][0e][1c][6e][30][6e][1c][ec][00][f0][30][2e][fc][d7][00][00][00][0e][1c][6 e][30][6e][1c][ec][00][f0][30][2e][fc][d7].[00][00][00][0e][1c][6e][30][6e][1c][ ec][00][f0][30][2e][fc][d7][00][00][23][ef][10][f0][12][00][ff][ff][ff][ff][ff][ ff][ff][ff]. 160bytes written 1275,xa=80,x=00[6c][65][64][74][65][73][74][31][00][00][00][00][00][00][00][00][ 00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] filename=ledtest1 program started ^B 851,senddata end sin data=4 859,inbfend=4 break [090A] break in line#=76538 wait 0 >/exit リモート接続を終了しました logfile closed at Fri Oct 09 20:56:09 2026 |
PICアセンブラによって翻訳され生成されたPICマシン語コードがPIC18F45K50に送られるところがモニタされています。
PICBASICコンパイラ[第251回]
2026.10.10 upload
前へ
ホームページトップへ戻る