【ソースコードの書式】
PICシリーズのアセンブラで使われる命令の書式は下記となって
います。
ソースコードの各行は下記の基本フォーマットで書きます。
Label Mnemonic Operand Comment注1 Labelは行の先頭から始めること
注2 MnemonicでLabelが無い時は先頭に1個以上の
スペースが必要
注3 Commentはどこから始まっても良い
注4 1行は255文字以下
注5 それぞれの項は1個以上のスペースで分離する
注6 1行に複数のフォーマットを「,」で区切って書けるLabel
Labelは各行の先頭から始まっていなければなりません。
また含まれる文字は、アルファベットかアンダーバー(_)
で始まる英数字でなければならない。
Labelは32文字以下の長さまでで、大文字、小文字の
区別があります。ただし、大小文字の区別は環境設定
で無くすこともできます。Mnemonic
アセンブラー命令と指示命令(擬似命令)は、行の先頭
から1個以上のスペースが無ければならない。Labelが
ある場合は、Labelの次に1個以上のスペースかコロン(:)
が必要。Operand
OperandはMnemonicの次に1個以上のスペースかタブ
で分離される。また複数のOperandが必要な場合には
「,」で分離する。Comment
セミコロン(;)に続く文節は全てコメントとされる。
そしてアセンブルでは無視されオブジェクトには何も関係
が無い。文字定数としてセミコロンを使うことは問題無い。
【命令の書式】
ソースコードの中でも特に命令を書くときの書き方を説明し
ます。命令の中のOpernadには、下記のデータを書く必要
があります。
・ f: register file address
・ d: destination select(destとも書く)
・ b: bit address
・ k: literal
各々の書き方の詳細を説明します。
(1) f : register file address
register file addressとしては、7ビットの幅があるので00から
7Fまで、最大128個のレジスタが指定できます。
しかし、実際に存在するレジスタは、PICの種類によって異な
っています。
(例) PIC16F84の場合
address 00〜0C :システムレジスタ
address 0C〜4F :汎用レジスタ(68個)
このレジスタアドレスの指定には、アドレス数値を直接指定
するのでは、間違いも多く分かり難くなってしまうので、普通
は、EQU命令などでラベルを設定してラベルで指定します。
(例)
COUNTER EQU 0DH ;ラベル設定定義
−−−−−
INCR COUNTER, F ;ラベル使用
(2) d : destination select
これは命令を実行した結果をどこに格納するかを指定する
のですが、0か1の2通りだけの指定しかありません。
そして標準インクルードファイルでWとFとが定義されていて
下記となります。
W : d=0 でWregに結果を格納する
F : d=1 でfで指定しているレジスタに格納します。
(例)
DECF COUNTER, W COUNTER-1をWregに格納
(3) b : bit address
ビット位置を指定する3ビットのアドレスで1バイトのデータの
何ビット目かを指定できます。
このbの書き方には、直接数値を使って指定する方法と、別
に設定されたラベルを使って指定する方法の2通りが使われ
ています。
(例)
BSF PORTA,3 ポートAの4ビット目(0から数える)
RA3 EQU 3 ラベル設定定義
BCF PORTA,RA3 ラベルの使用
(4) k : Literal
直接固定の値を使用する場合に使います。1バイト(8ビット)
の幅があるので、
数値なら 0 〜 256
文字なら ASCIIコードが使用できます。
(例)
ADDLW 15 15を加算
MOVLW 'C' ASCII文字コード(3C)をWregへ
【標準インクルードファイルの内容】
file registerの中でも、システムで使用しているアドレス00から
0Cまでの範囲は毎回同じラベル設定になります。
そこでこれを出来るだけ便利に出来るように、MPLABなどの
アセンブラにはシステムの「標準インクルードファイル」として
あらかじめ定義ファイルが用意されています。
そこで、システムのレジスタを指定するときには、この標準で
設定されているラベルを書式で指定するのが楽です。
以下のリストが、この標準インクルードファイルで設定されて
いるラベルの一覧です。
;===============================================
;
; 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'
;----- EECON1 Bits --------------------------
EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'
;===============================================
;
; RAM Definition
;
;===============================================
__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'
;===============================================
;
; Configuration Bits
;
;===============================================
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'