【PICの命令の書き方】
命令を書くときの基本フォーマットは下記とします。
Label Mnemonic Operand Comment
(1) Label
Labelは行の先頭から始まる記号で、ジャンプ命令の飛び先指定
などに使います。必要無いときには、無くて構いません。
Labelは各行の先頭から始まっていなければなりません。
また含まれる文字は、アルファベットかアンダーバー(_)
で始まる英数字でなければならない。
Labelは32文字以下の長さまでで、大文字、小文字の
区別があります。ただし、大小文字の区別は環境設定
で無くすこともできます。
(2) Mnemonic
Mnemonicは命令の記号そのもの。Commentはセミコロン( ; )を頭
につけあとは何でも書けます。
アセンブラー命令と指示命令(擬似命令)は、行の先頭
から1個以上のスペースが無ければならない。Labelが
ある場合は、Labelの次に1個以上のスペースかコロン(:)
が必要。
(3)Operand
Operandには下記があります。
d: 実行結果の格納をWreg(0の時)にするか、レジスタファイル
(1の時)にするかを指定します。
f: レジスタファイル内のf番地のレジスタを指す。
k: 定数で0〜255の値。(1バイト)
b: ビット位置を示し、最下位を0、最上位を7とする。
OperandはMnemonicの次に1個以上のスペースかタブ
で分離される。また複数のOperandが必要な場合には
「,」で分離する。
(4) Comment
セミコロン(;)に続く文節は全てコメントとされる。
そしてアセンブルでは無視されオブジェクトには何も関係が無い。
文字定数としてセミコロンを使うことは問題無い。
【見やすい書き方】
普通はプログラムを見やすくするために、アドレスなど数値で表現
しなければならないところを記号で表現します。
この変換を行うのは、アセンブラというプログラムの役割で、他にも
見易くするための多くの機能を持っています。
これらの中に記号に数値を割り振る、EQUとかSETとかいう擬似命令
が用意されていますので、これを使って記号で数値が表せる様に
最初に定義しておきます。
これら擬似命令の詳細は、MPASMの使い方を参照して下さい。
特に、Openrandの中に書く記号には特別の記号が用意されています。
d:
判りやすく W か F で書きます。
f:
あらかじめ定義されていたり、自分でEQU擬似命令で定義します。
例
MOVWF DATA1,W
GOTO INPUT
k:
定数も数字では判り難いので、記号を割り当てます。
例
BCF PORTA,LED1
MOVWF PORTA
b:
これも判りやすくするため記号で書きます。
例
BTFSS STATUS,C
BSF STATUS,RP0
さらに詳細は、PICの命令の書き方を参照して下さい。
【システム定義ラベル】
これらの記号の中には、あらかじめアセンブラで定められているものが
あります。それをシステム定義ラベルと呼びますが、それらを使うのが
早道です。
これを知るには、MPLABなどの中に含まれているインクルードファイル
と呼ばれるファイルを印刷してみるのが手っ取り早い方法です。
例えば「P16f84.inc」などのファイルをメモ帳などで印刷します。
下記はこのインクルードファイルの一部ですが、レジスタの定義が色々
されています。
プログラムを書くときに、最初にこのファイルを使うことを宣言しておけば、
下記で指定されているラベルは、敢えて宣言しなくても使うことができます。
;===============================================
;
; Register Definitions
;
;===============================================
W EQU H'0000'
F EQU H'0001'
;----- Register Files-------------------------
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'
;----- STATUS Bits --------------------------
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
;----- INTCON Bits --------------------------
GIE EQU H'0007'
EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'
;----- OPTION Bits --------------------------
NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'