pic18汇编指令集.docx
《pic18汇编指令集.docx》由会员分享,可在线阅读,更多相关《pic18汇编指令集.docx(108页珍藏版)》请在冰豆网上搜索。
pic18汇编指令集
PIC指令
指令
指令說明
影響旗號
參考說明頁數
位元組運算指令(BYTE-ORIENTEDFILEREGISTEROPERATIONS)
ADDWF
f,d,a
將W與f做相加,並將結果放至W或f。
C,DC,Z,OV,N
7
ADDWFC
f,d,a
將W與C做相加,並將結果放至W或f。
C,DC,Z,OV,N
10
ANDWF
f,d,a
將W與f做AND運算,並將結果放至W或f。
Z,N
14
CLRF
f,a
將f內的值都清為0。
Z
31
COMF
f,d,a
將f內的值取補數,並將結果放至W或f。
Z,N
33
CPFSEQ
f,a
若f與W的值相等,則跳過下一個指令。
無
35
CPFSGT
f,a
若f大於W,則跳過下一個指令。
無
36
CPFSLT
f,a
若f小於W,則跳過下一個指令。
無
37
DECF
f,d,a
將f內的值減1,並將結果放至W或f。
C,DC,Z,OV,N
40
DECFSZ
f,d,a
將f內的值減1,若為0則跳過下一個指令,並將結果放至W或f。
無
43
DCFSNZ
f,d,a
將f內的值減1,若不為0則跳過下一個指令,並將結果放至W或f。
無
45
INCF
f,d,a
將f內的值加1,並將結果放至W或f。
C,DC,Z,OV,N
48
INCFSZ
f,d,a
將f內的值加1,若為0則跳過下一個指令,並將結果放至W或f。
無
51
INFSNZ
f,d,a
將f內的值加1,若不為0則跳過下一個指令,並將結果放至W或f。
無
53
IORWF
f,d,a
將W與f做OR運算,並將結果放至W或f。
Z,N
57
MOVF
f,d,a
將f內的值搬到W或f。
Z,N
61
MOVFF
將
內的資料搬到
中。
無
63
MOVWF
f,a
將W內的值搬到f中。
無
66
MULWF
f,a
將W與f做相乘。
無
68
NEGF
f,a
將f內的值取2的補數。
C,DC,Z,OV,N
70
RLCF
f,d,a
將f內的值與C一起做左移動作,並將結果放至W或f。
C,Z,N
80
RLNCF
f,d,a
將f內的值做左移動作,並將結果放至W或f。
Z,N
82
RRCF
f,d,a
將f內的值與C一起做右移動作,並將結果放至W或f。
C,Z,N
84
RRNCF
f,d,a
將f內的值做右移動作,並將結果放至W或f。
Z,N
86
SETF
f,a
將f內的值設為0xFF。
無
88
SUBFWB
f,d,a
將W內的值減掉C及f,並將結果放至W或f。
C,DC,Z,OV,N
90
SUBWF
f,d,a
將W內的值減掉f,並將結果放至W或f。
C,DC,Z,OV,N
94
SUBWFB
f,d,a
將f內的值減掉W及C,並將結果放至W或f。
C,DC,Z,OV,N
96
SWAPF
f,d,a
將f內的值高4位元與低4位元對調,並將結果放至W或f。
無
98
TSTFSZ
f,a
測試f內的值是否等於0,若為0則跳過下一個指令。
無
105
XORWF
f,d,a
將W與f做XOR運算,並將結果放至W或f。
Z,N
108
位元運算指令(BIT-ORIENTEDFILEREGISTEROPERATIONS)
BCF
f,b,a
將f內某個位元(Bit)設定為0。
無
17
BSF
f,b,a
將f內某個位元(Bit)設定為1。
無
24
BTFSC
f,b,a
測試f內某個位元(Bit)的值是否等於0,若為0則跳過下一個指令。
無
25
BTFSS
f,b,a
測試f內某個位元(Bit)的值是否等於1,若為1則跳過下一個指令。
無
26
BTG
f,d,a
將f內某個位元(Bit)做NOT運算。
無
27
Note:
☞f表示暫存器。
☞d表示資料存放的地方,d=0表示存放在W累加器;d=1表示存放在f暫存器。
☞b表示暫存器的第b個位元。
☞k表示8位元常數。
☞a表示資料存放在那個記憶體位置,a=0表示放在目前的記憶體位置;a=1表示放在BSR暫存器內所指定的記憶體位置。
☞n表示程式記憶體的位址。
PIC18系列家族指令快速索引(續)
指令
指令說明
影響旗號
參考說明頁數
程式流程控制指令(CONTROLOPERATIONS)
BC
n
若C=1則跳到位址n去。
無
16
BN
n
若N=1則跳到位址n去。
無
18
BNC
n
若C=0則跳到位址n去。
無
19
BNN
n
若N=0則跳到位址n去。
無
20
BNOV
n
若OV=0則跳到位址n去。
無
21
BNZ
n
若Z=0則跳到位址n去。
無
22
BOV
n
若OV=1則跳到位址n去。
無
28
BRA
n
無條件跳到位址n去(
)。
無
23
BZ
n
若Z=1則跳到位址n去。
無
29
CALL
n,s
將下一個指令的PC值存到堆疊的最上層,並跳到位址n去(
)。
無
30
CLRWDT
將看門狗計時器清為0。
無
32
DAW
將W內的值做BCD調整。
無
38
GOTO
n
無條件跳到位址n去(
)。
無
47
NOP
空指令。
無
72
POP
將堆疊最上層的值取出來。
無
73
PUSH
將下一個指令的PC值存到堆疊的最上層。
無
74
RCALL
n
將下一個指令的PC值存到堆疊的最上層,並跳到位址n去(
)。
無
75
RESET
利用軟體將系統重置。
無
76
RETFIE
s
由中斷副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執行。
無
77
RETURN
s
由副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執行。
無
79
SLEEP
進入睡眠狀態。
無
89
Note:
☞f表示暫存器。
☞d表示資料存放的地方,d=0表示存放在W累加器;d=1表示存放在f暫存器。
☞b表示暫存器的第b個位元。
☞k表示8位元常數。
☞n表示程式記憶體的位址。
☞a表示資料存放在那個記憶體位置,a=0表示放在目前的記憶體位置;a=1表示放在BSR暫存器內所指定的記憶體位置。
PIC18系列家族指令快速索引(續)
指令
指令說明
影響旗號
參考說明頁數
立即常數定址(LITERALOPERATIONS)
ADDLW
k
將常數k與W做相加。
C,DC,Z,OV,N
4
ANDLW
k
將常數k與W做AND運算。
Z,N
12
IORLW
k
將常數k與W做OR運算。
Z,N
55
LFSR
f,k
將常數k(12-bit)搬到第f個FSR暫存器去(f=0~2)。
無
59
MOVLB
k
將常數k搬到BSR暫存器去。
無
64
MOVLW
k
將常數k搬到W去。
無
65
MULLW
k
將常數k與W做乘法運算。
無
67
RETLW
k
將堆疊最上層的值取出來放至PC中,並將W的值設為k(
),而主程式由目前PC值開始執行。
無
78
SUBLW
k
將常數k與W做減法。
C,DC,Z,OV,N
92
XORLW
k
將常數k與W做XOR運算。
Z,N
106
程式記憶體讀寫指令(DATAMEMORY<->PROGRAMMEMORYOPERATIONS)
TBLRD*
以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。
無
99
TBLRD*+
以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動加1。
無
99
TBLRD*-
以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動減1。
無
99
TBLRD+*
先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。
無
99
TBLWT*
以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。
無
102
TBLWT*+
以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動加1。
無
102
TBLWT*-
以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動減1。
無
102
TBLWT+*
先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。
無
102
Note:
☞f表示暫存器。
☞d表示資料存放的地方,d=0表示存放在W累加器;d=1表示存放在f暫存器。
☞b表示暫存器的第b個位元。
☞k表示8位元常數。
☞n表示程式記憶體的位址。
☞a表示資料存放在那個記憶體位置,a=0表示放在目前的記憶體位置;a=1表示放在BSR暫存器內所指定的記憶體位置。
指令名稱:
ADDLW
原意:
ADDliteraltoW
語法:
[label]ADDLWk
運算元:
運算說明:
(W)+K->W
影響旗標:
N,OV,C,DC,Z
指令說明:
W累加器中的值與k值相加,並將運算結果放回W累加器中。
類別:
立即常數定址法。
組別:
數學運算加法指令。
範例一:
ADDLW0x11;將0x11的值與W累加器相加,結果放回W累加器中。
執行前:
W=0x1F;假設執行前W累加器的值為0x1F。
N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。
執行後:
W=0x30;執行後W累加器的值為0x30。
N=OV=C=0,DC=1;半進位旗標等於1,因為低四位元相加之後有進位的情形發生,因此半進位旗標DC等於1其餘旗標狀態不變。
範例二:
ADDLW0x11;將0x11的值與W累加器相加,結果放回W累加器中。
執行前:
W=0x7F;假設執行前W累加器的值為0x7F。
N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。
執行後:
W=0x90;執行後W累加器的值為0x90。
N=OV=DC=1,Z=C=0;半進位旗標DC等於1,因為低四位元相加後有進位情形發生;溢位旗標OV等於1,因為兩數相加後第7個位元有進位情形發生;負號旗標N等於1,因為兩數相加後結果大於127,因為使用2的補數作運算,所以結果大於127便算是負號。
範例三:
ADDLW0x11;將0x11的值與W累加器相加,結果放回W累加器中。
執行前:
W=0x9F;假設執行前W累加器的值為0x9F。
N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。
執行後:
W=0xB0;執行後W累加器的值為0xB0。
N=DC=1,OV=Z=C=0;半進位旗標DC等於1,因為低四位元相加後有進位情形發生;負號旗標N等於1,因為使用2的補數作運算,因此兩數相加後結果大於127,N等於1。
範例二與範例三之不同是在於範例二在相加前第七個位元為0,相加後第七個位元為1,因此溢位旗標OV等於1(根據Microchip的定義),而範例三不同的是在相加前第七個位元為1,相加後第七個位元為1,因此溢位旗標OV不變,依然是等於0。
範例四:
ADDLW0x01;將0x01的值與W累加器相加,結果放回W累加器中。
執行前:
W=0xFF;假設執行前W累加器的值為0xFF。
N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。
執行後:
W=0x00;執行後W累加器的值為0x00,因為累加器為8bits的暫存器,因此相加後結果超過255(0xFF)便會歸0。
N=OV=0,C=DC=Z=1;由於兩數相加後結果超過255(0xFF),因此進位旗標C會被設定為1;又相加後W累加器的值為0x00,因此零位旗標Z會被設定為1;又由於低四位元相加後有進位情形發生,因此半進位旗標DC被設定為1。
指令名稱:
ADDWF
原意:
ADDWtof
語法:
[label]ADDWFf,d,a
運算元:
運算說明:
(W)+(f)->dest
影響旗標:
N,OV,C,DC,Z
指令說明:
W累加器中的值與f暫存器中的值相加,並將運算結果放回’d’所指定的暫存器中。
若d=0,則運算後的結果放到W累加器中;若d=1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W(表W累加器);若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F(表暫存器)。
若a=0,則運算後的結果放到目前RAM的位址中;若a=1,則運算後的結果放到BSR暫存器所指定的RAM位址中。
類別:
資料轉移指令。
組別:
數學運算加法指令。
範例一:
ADDWFREG,0,0;將暫存器(REG)的值與W累加器的值相加,結果放回W累加器中。
執行前:
W=0x11;假設執行前W累加器的值為0x11。
REG=0x0F;假設執行前REG暫存器的值為0x0F。
N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。
執行後:
W=0x20
REG=0x0F
N=OV=C=Z=0,DC=1
Ø結果放回W累加器中。
範例二:
ADDWFREG,W,0
執行前:
W=0x17
REG=0xC2
N=OV=C=DC=Z=0
執行後:
W=0xD9
REG=0xC2
N=OV=C=DC=Z=0
Ø結果放回W累加器中。
範例三:
ADDWFREG,F,1(ifBSR=0x01)
執行前:
W=0x17
REG=0xC2
N=OV=C=DC=Z=0
執行後:
W=0x17
REG=0xC2
RAM位址100=0xD9
N=OV=C=DC=Z=0
Ø結果放在BSR暫存器所指定的位址中。
範例四:
ADDWFREG,W
執行前:
W=0x17
REG=0xC2
N=OV=C=DC=Z=0
執行後:
W=0xD9
REG=0xC2
N=OV=C=DC=Z=0
Ø結果放回W累加器中。
範例五:
ADDWFREG,F
執行前:
W=0x01
REG=0x10
N=OV=C=DC=Z=0
執行後:
W=0x01
REG=0x11
N=OV=C=DC=Z=0
Ø結果放回暫存器中。
指令名稱:
ADDWFC
原意:
ADDWandCarrybittof
語法:
[label]ADDWFCf,d,a
運算元:
運算說明:
(W)+(f)+(c)->dest
影響旗標:
N,OV,C,DC,Z
指令說明:
W累加器中的值與f暫存器中的值與進位旗標三者相加,並將運算結果放回’d’所指定的暫存器中。
若d=0,則運算後的結果放到W累加器中;若d=1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W(表W累加器);若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F(表暫存器)。
若a=0,則運算後的結果放到f所指定的暫存器中;若a=1為不存在狀態。
類別:
資料轉移指令。
組別:
數學運算加法指令。
範例一:
ADDWFCREG,0,1
執行前:
W=0x4D
REG=0x02
Carry=1
N=OV=DC=Z=0
執行後:
W=0x50
REG=0x02
Carry=0
N=OV=DC=Z=0
Ø結果放回W累加器中,進位旗標C=0。
範例二:
ADDWFCREG,F,0
執行前:
W=0x4D
REG=0x02
Carry=1
N=OV=DC=Z=0
執行後:
W=0x4D
REG=0x50
Carry=0
N=OV=DC=Z=0
Ø結果放回暫存器中,進位旗標C=0。
指令名稱:
ANDLW
原意:
ANDliteralwithW
語法:
[label]ANDLWk
運算元:
運算說明:
(W).AND.k->W
影響旗標:
N,Z
指令說明:
W累加器中的值與k值做邏輯的AND運算,並將運算結果放回W累加器中。
類別:
立即常數定址法。
組別:
邏輯運算AND指令。
範例一:
ANDLW0x5F
執行前:
W=0xA3=10100011
N=Z=0
執行後:
W=0x03
N=Z=0
範例二:
ANDLW0x00
執行前:
W=0x5F=01011111
N=Z=0
執行後:
W=0x00
N=0;Z=1
指令名稱:
ANDWF
原意:
ANDWwithf
語法:
[label]ANDWFf,d,a
運算元:
運算說明:
(W).AND.(f)->dest
影響旗標:
N,Z
指令說明:
W累加器中的值與f暫存器中的值做邏輯AND運算,並將運算結果放回’d’所指定的暫存器中。
若d=0,則運算後的結果放到W累加器中;若d=1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W(表W累加器);若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F(表暫存器)。
若a=0,則運算後的結果放到f所指定的暫存器中;若a=1不存在(系統預設值)。
類別:
邏輯運算指令。
組別:
邏輯運算AND指令。
範例一:
ANDWFREG,0,0
執行前:
W=0x17
REG=0xC2
N=Z=0
執行後:
W=0x02
REG=0xC2
N=Z=0
Ø結果放回W累加器中。
範例二:
ANDWFREG,F
執行前:
W=0x01
REG=0xFF
N=Z=0
執行後:
W=0x01
REG=0x01
N=Z=0
Ø結果放回暫存器中。
指令名稱:
BC
原意:
BranchifCarry
語法:
[label]BClabelname
運算元:
運算說明:
Ifcarrybitis‘1’,jumptolabelname.
影響旗標:
無
指令說明:
當狀態暫存器中的進位旗標C等於1時,就跳到指定的位址。
類別:
程式流程控制指令。
組別:
比較跳躍指令。
範例一:
HereBCLab1;若是進位旗標C等於1就跳到Lab1的位址,若是進位旗標C不等於1則程式往下執行。
執行前:
PC=在目前Here的位址
C=1
執行後:
PC=跳到Lab1的位址
C=1
指令名稱:
BCF
原意:
BitClearf
語法:
[label]BCFf,b
運算元:
運算說明:
0->f
影響旗標:
無
指令說明:
將暫存器中的某一個位元清除為0。
類別:
位元定址指令。
組別:
單一位元清除指令。
範例一:
BCFREG,2;將REG暫存器的第2個位元清除為0。
執行前:
REG=11111111=0xFF;REG暫存器的值為0xFF。
執行後:
REG=11111011=0xFB;將REG暫存器的第2個位元清除為0,從右邊算起為第0個位元、第1個位元、第2個位元,以下依此類推。
指令名稱:
BN
原意:
BranchifNegative
語法:
[label]BNLabelname
運算元:
運算說明:
Ifnegativebitis‘1’,jumptolabelname.
影響旗標:
無
指令說明:
當狀態暫存器中的負號旗標N等於1時,就跳到指定的位址。
類別:
程式流程控制指令。
組別:
比較跳躍指令。
範例一:
HereBNLab1;若是負號旗標N等於1就跳到Lab1的位址,若是負號旗標N不等於1則程式往下執行。
執行前:
PC=在目前Here的位址
N=1
執行後:
PC=跳到Lab1的位址
N=1
指令名稱:
BNC
原意:
BranchifNotCarry
語法:
[label]BNClabelname
運算元:
運算說明:
Ifcarrybitis‘0’,jumptolabelname.
影響旗標:
無
指令說明:
當狀態暫存器中的進位旗標C等於0時,就跳到指定的位址。
類別:
程式流程控制指令。
組別:
比較跳躍指令。
範例一:
HereBCLab1;若是進位旗標C等於0就跳到Lab1的位址,若是進位旗標C不等於0則程式往下執行。
執行前:
PC=在目前Here的位址
C=0
執行後:
PC=跳到Lab1的位址
C=0
指令名稱:
BNN
原意:
Bran