PIC指令
指令 | 指令說明 | 影響旗號(hào) | 參考說明頁數(shù) | |||
位元組運(yùn)算指令 (BYTE-ORIENTED FILE REGISTER OPERATIONS) | ||||||
ADDWF | f, d, a | 將W與f做相加,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 7 | ||
ADDWFC | f, d, a | 將W與C做相加,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 10 | ||
ANDWF | f, d, a | 將W與f做AND運(yùn)算,並將結(jié)果放至W或f。 | Z, N | 14 | ||
CLRF | f, a | 將f內(nèi)的值都清為0。 | Z | 31 | ||
COMF | f, d, a | 將f內(nèi)的值取補(bǔ)數(shù),並將結(jié)果放至W或f。 | Z, N | 33 | ||
CPFSEQ | f, a | 若f與W的值相等,則跳過下一個(gè)指令。 | 無 | 35 | ||
CPFSGT | f, a | 若f大於W,則跳過下一個(gè)指令。 | 無 | 36 | ||
CPFSLT | f, a | 若f小於W,則跳過下一個(gè)指令。 | 無 | 37 | ||
DECF | f, d, a | 將f內(nèi)的值減1,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 40 | ||
DECFSZ | f, d, a | 將f內(nèi)的值減1,若為0則跳過下一個(gè)指令,並將結(jié)果放至W或f。 | 無 | 43 | ||
DCFSNZ | f, d, a | 將f內(nèi)的值減1,若不為0則跳過下一個(gè)指令,並將結(jié)果放至W或f。 | 無 | 45 | ||
INCF | f, d, a | 將f內(nèi)的值加1,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 48 | ||
INCFSZ | f, d, a | 將f內(nèi)的值加1,若為0則跳過下一個(gè)指令,並將結(jié)果放至W或f。 | 無 | 51 | ||
INFSNZ | f, d, a | 將f內(nèi)的值加1,若不為0則跳過下一個(gè)指令,並將結(jié)果放至W或f。 | 無 | 53 | ||
IORWF | f, d, a | 將W與f做OR運(yùn)算,並將結(jié)果放至W或f。 | Z, N | 57 | ||
MOVF | f, d, a | 將f內(nèi)的值搬到W或f。 | Z, N | 61 | ||
MOVFF | | 將 | 無 | 63 | ||
MOVWF | f, a | 將W內(nèi)的值搬到f中。 | 無 | 66 | ||
MULWF | f, a | 將W與f做相乘。 | 無 | 68 | ||
NEGF | f, a | 將f內(nèi)的值取2的補(bǔ)數(shù)。 | C, DC, Z, OV, N | 70 | ||
RLCF | f, d, a | 將f內(nèi)的值與C一起做左移動(dòng)作,並將結(jié)果放至W或f。 | C, Z, N | 80 | ||
RLNCF | f, d, a | 將f內(nèi)的值做左移動(dòng)作,並將結(jié)果放至W或f。 | Z, N | 82 | ||
RRCF | f, d, a | 將f內(nèi)的值與C一起做右移動(dòng)作,並將結(jié)果放至W或f。 | C, Z, N | 84 | ||
RRNCF | f, d, a | 將f內(nèi)的值做右移動(dòng)作,並將結(jié)果放至W或f。 | Z, N | 86 | ||
SETF | f, a | 將f內(nèi)的值設(shè)為0xFF。 | 無 | 88 | ||
SUBFWB | f, d, a | 將W內(nèi)的值減掉C及f,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 90 | ||
SUBWF | f, d, a | 將W內(nèi)的值減掉f,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 94 | ||
SUBWFB | f, d, a | 將f內(nèi)的值減掉W及C,並將結(jié)果放至W或f。 | C, DC, Z, OV, N | 96 | ||
SWAPF | f, d, a | 將f內(nèi)的值高4位元與低4位元對(duì)調(diào),並將結(jié)果放至W或f。 | 無 | 98 | ||
TSTFSZ | f, a | 測(cè)試f內(nèi)的值是否等於0,若為0則跳過下一個(gè)指令。 | 無 | 105 | ||
XORWF | f, d, a | 將W與f做XOR運(yùn)算,並將結(jié)果放至W或f。 | Z, N | 108 | ||
位元運(yùn)算指令 (BIT-ORIENTED FILE REGISTER OPERATIONS) | ||||||
BCF | f, b, a | 將f內(nèi)某個(gè)位元 (Bit) 設(shè)定為0。 | 無 | 17 | ||
BSF | f, b, a | 將f內(nèi)某個(gè)位元 (Bit) 設(shè)定為1。 | 無 | 24 | ||
BTFSC | f, b, a | 測(cè)試f內(nèi)某個(gè)位元 (Bit) 的值是否等於0,若為0則跳過下一個(gè)指令。 | 無 | 25 | ||
BTFSS | f, b, a | 測(cè)試f內(nèi)某個(gè)位元 (Bit) 的值是否等於1,若為1則跳過下一個(gè)指令。 | 無 | 26 | ||
BTG | f, d, a | 將f內(nèi)某個(gè)位元 (Bit) 做NOT運(yùn)算。 | 無 | 27 | ||
Note: | Ff表示暫存器。 | Fd表示資料存放的地方,d = 0表示存放在W累加器;d = 1表示存放在f暫存器。 | ||||
Fb表示暫存器的第b個(gè)位元。 | ||||||
| Fk表示8位元常數(shù)。 | Fa表示資料存放在那個(gè)記憶體位置,a = 0表示放在目前的記憶體位置;a = 1表示放在BSR暫存器內(nèi)所指定的記憶體位置。 | ||||
Fn表示程式記憶體的位址。 | ||||||
PIC18系列家族指令快速索引 (續(xù))
指令 | 指令說明 | 影響旗號(hào) | 參考說明頁數(shù) | |||
程式流程控制指令 (CONTROL OPERATIONS) | ||||||
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 | 將下一個(gè)指令的PC值存到堆疊的最上層,並跳到位址n去 ( | 無 | 30 | ||
CLRWDT |
| 將看門狗計(jì)時(shí)器清為0。 | 無 | 32 | ||
DAW |
| 將W內(nèi)的值做BCD調(diào)整。 | 無 | 38 | ||
GOTO | n | 無條件跳到位址n去 ( | 無 | 47 | ||
NOP |
| 空指令。 | 無 | 72 | ||
POP |
| 將堆疊最上層的值取出來。 | 無 | 73 | ||
PUSH |
| 將下一個(gè)指令的PC值存到堆疊的最上層。 | 無 | 74 | ||
RCALL | n | 將下一個(gè)指令的PC值存到堆疊的最上層,並跳到位址n去 ( | 無 | 75 | ||
RESET |
| 利用軟體將系統(tǒng)重置。 | 無 | 76 | ||
RETFIE | s | 由中斷副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執(zhí)行。 | 無 | 77 | ||
RETURN | s | 由副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執(zhí)行。 | 無 | 79 | ||
SLEEP |
| 進(jìn)入睡眠狀態(tài)。 | 無 | 89 | ||
Note: | Ff表示暫存器。 | Fd表示資料存放的地方,d = 0表示存放在W累加器;d = 1表示存放在f暫存器。 | ||||
Fb表示暫存器的第b個(gè)位元。 | ||||||
| Fk表示8位元常數(shù)。 Fn表示程式記憶體的位址。 | Fa表示資料存放在那個(gè)記憶體位置,a = 0表示放在目前的記憶體位置;a = 1表示放在BSR暫存器內(nèi)所指定的記憶體位置。 | ||||
PIC18系列家族指令快速索引 (續(xù))
指令 | 指令說明 | 影響旗號(hào) | 參考說明頁數(shù) | |||
立即常數(shù)定址 (LITERAL OPERATIONS) | ||||||
ADDLW | k | 將常數(shù)k與W做相加。 | C, DC, Z, OV, N | 4 | ||
ANDLW | k | 將常數(shù)k與W做AND運(yùn)算。 | Z, N | 12 | ||
IORLW | k | 將常數(shù)k與W做OR運(yùn)算。 | Z, N | 55 | ||
LFSR | f, k | 將常數(shù)k (12-bit) 搬到第f個(gè)FSR暫存器去 (f = 0 ~ 2 ) 。 | 無 | 59 | ||
MOVLB | k | 將常數(shù)k搬到BSR暫存器去。 | 無 | 64 | ||
MOVLW | k | 將常數(shù)k搬到W去。 | 無 | 65 | ||
MULLW | k | 將常數(shù)k與W做乘法運(yùn)算。 | 無 | 67 | ||
RETLW | k | 將堆疊最上層的值取出來放至PC中,並將W的值設(shè)為k ( | 無 | 78 | ||
SUBLW | k | 將常數(shù)k與W做減法。 | C, DC, Z, OV, N | 92 | ||
XORLW | k | 將常數(shù)k與W做XOR運(yùn)算。 | Z, N | 106 | ||
程式記憶體讀寫指令 (DATA MEMORY <-> PROGRAM MEMORY OPERATIONS) | ||||||
TBLRD* |
| 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中。 | 無 | 99 | ||
TBLRD*+ |
| 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動(dòng)加1。 | 無 | 99 | ||
TBLRD*- |
| 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動(dòng)減1。 | 無 | 99 | ||
TBLRD+* |
| 先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中。 | 無 | 99 | ||
TBLWT* |
| 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中。 | 無 | 102 | ||
TBLWT*+ |
| 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動(dòng)加1。 | 無 | 102 | ||
TBLWT*- |
| 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動(dòng)減1。 | 無 | 102 | ||
TBLWT+* |
| 先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中。 | 無 | 102 | ||
Note: | Ff表示暫存器。 | Fd表示資料存放的地方,d = 0表示存放在W累加器;d = 1表示存放在f暫存器。 | ||||
Fb表示暫存器的第b個(gè)位元。 | ||||||
| Fk表示8位元常數(shù)。 Fn表示程式記憶體的位址。 | Fa表示資料存放在那個(gè)記憶體位置,a = 0表示放在目前的記憶體位置;a = 1表示放在BSR暫存器內(nèi)所指定的記憶體位置。 | ||||
指令名稱:ADDLW
原 意:ADD literal to W
語 法:[label] ADDLW k
運(yùn) 算 元:
運(yùn)算說明:(W) + K -> W
影響旗標(biāo):N, OV, C, DC, Z
指令說明:W累加器中的值與k值相加,並將運(yùn)算結(jié)果放回W累加器中。
類 別:立即常數(shù)定址法。
組 別:數(shù)學(xué)運(yùn)算加法指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
範(fàn)例二:
執(zhí)行前:
執(zhí)行後:
範(fàn)例三:
執(zhí)行前:
執(zhí)行後:
N = DC = 1,OV = Z = C = 0 ;半進(jìn)位旗標(biāo)DC等於1,因?yàn)榈退奈辉嗉俞嵊羞M(jìn)位情形發(fā)生;負(fù)號(hào)旗標(biāo)N等於1,因?yàn)槭褂?的補(bǔ)數(shù)作運(yùn)算,因此兩數(shù)相加後結(jié)果大於127,N等於1。範(fàn)例 二與範(fàn)例三之不同是在於範(fàn)例二在相加前第七個(gè)位元為0,相加後第七個(gè)位元為1,因此溢位旗標(biāo)OV等於1 (根據(jù)Microchip的定義) ,而範(fàn)例三不同的是在相加前第七個(gè)位元為1,相加後第七個(gè)位元為1,因此溢位旗標(biāo)OV不變,依然是等於0。
範(fàn)例四:
執(zhí)行前:
執(zhí)行後:
W = 0x00 ;執(zhí)行後W累加器的值為0x00,因?yàn)槔奂悠鳛? bits的暫存器,因此相加後結(jié)果超過255 (0xFF) 便會(huì)歸0。
N = OV = 0,C = DC = Z = 1 ;由於兩數(shù)相加後結(jié)果超過255 (0xFF) ,因此進(jìn)位旗標(biāo)C會(huì)被設(shè)定為1;又相加後W累加器的值為0x00,因此零位旗標(biāo)Z會(huì)被設(shè)定為1;又由於低四位元相加後有進(jìn)位情形發(fā)生,因此半進(jìn)位旗標(biāo)DC 被設(shè)定為1。
指令名稱:ADDWF
原 意:ADD W to f
語 法:[label] ADDWF f , d, a
運(yùn) 算 元:
運(yùn)算說明:(W) + (f) -> dest
影響旗標(biāo):N, OV, C, DC, Z
指 令說明:W累加器中的值與f暫存器中的值相加,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉(zhuǎn)移指令。
組 別:數(shù)學(xué)運(yùn)算加法指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
Ø結(jié)果放回W累加器中。
範(fàn)例二:
執(zhí)行前:
執(zhí)行後:
Ø結(jié)果放回W累加器中。
範(fàn)例三:
ADDWF REG, F, 1 (if BSR = 0x01)
執(zhí)行前:
執(zhí)行後:
RAM位址100 = 0xD9
N = OV = C = DC = Z = 0
Ø結(jié)果放在BSR暫存器所指定的位址中。
範(fàn)例四:
ADDWF REG, W
執(zhí)行前:
執(zhí)行後:
Ø結(jié)果放回W累加器中。
範(fàn)例五:
ADDWF REG, F
執(zhí)行前:
執(zhí)行後:
Ø結(jié)果放回暫存器中。
指令名稱:ADDWFC
原 意:ADD W and Carry bit to f
語 法:[label] ADDWFC f , d, a
運(yùn) 算 元:
運(yùn)算說明:(W) + (f) + (c) -> dest
影響旗標(biāo):N, OV, C, DC, Z
指 令說明:W累加器中的值與f暫存器中的值與進(jìn)位旗標(biāo)三者相加,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到f所指定的暫存器中;若a = 1為不存在狀態(tài)。
類 別:資料轉(zhuǎn)移指令。
組 別:數(shù)學(xué)運(yùn)算加法指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
Ø結(jié)果放回W累加器中,進(jìn)位旗標(biāo)C = 0。
範(fàn)例二:
執(zhí)行前:
執(zhí)行後:
Ø結(jié)果放回暫存器中,進(jìn)位旗標(biāo)C = 0。
指令名稱:ANDLW
原 意:AND literal with W
語 法:[label] ANDLW k
運(yùn) 算 元:
運(yùn)算說明:(W) .AND. k -> W
影響旗標(biāo):N, Z
指令說明:W累加器中的值與k值做邏輯的AND運(yùn)算,並將運(yùn)算結(jié)果放回W累加器中。
類 別:立即常數(shù)定址法。
組 別:邏輯運(yùn)算AND指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
W = 0x03
N = Z = 0
範(fàn)例二:
執(zhí)行前:
執(zhí)行後:
W = 0x00
指令名稱:ANDWF
原 意:AND W with f
語 法:[label] ANDWF f , d, a
運(yùn) 算 元:
運(yùn)算說明:(W) .AND. (f) -> dest
影響旗標(biāo):N, Z
指 令說明:W累加器中的值與f暫存器中的值做邏輯AND運(yùn)算,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到f所指定的暫存器中;若a = 1不存在 (系統(tǒng)預(yù)設(shè)值) 。
類 別:邏輯運(yùn)算指令。
組 別:邏輯運(yùn)算AND指令。
範(fàn)例一:
執(zhí)行前:
W = 0x17
執(zhí)行後:
W = 0x02
Ø結(jié)果放回W累加器中。
範(fàn)例二:
執(zhí)行前:
W = 0x01
執(zhí)行後:
W = 0x01
Ø結(jié)果放回暫存器中。
指令名稱:BC
原 意:Branch if Carry
語 法:[label] BC label name
運(yùn) 算 元:
運(yùn)算說明:If carry bit is ‘1’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的進(jìn)位旗標(biāo)C等於1時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
C = 1
指令名稱:BCF
原 意:Bit Clear f
語 法:[label] BCF f, b
運(yùn) 算 元:
運(yùn)算說明:0 -> f < b >
影響旗標(biāo):無
指令說明:將暫存器中的某一個(gè)位元清除為0。
類 別:位元定址指令。
組 別:?jiǎn)我晃辉宄噶睢?/p>
範(fàn)例一:
執(zhí)行前:
REG = 11111111 = 0xFF ;REG暫存器的值為0xFF。
執(zhí)行後:
REG = 11111011 = 0xFB ;將REG暫存器的第2個(gè)位元清除為0,從右邊算起為第0個(gè)位元、第1個(gè)位元、第2個(gè)位元,以下依此類推。
指令名稱:BN
原 意:Branch if Negative
語 法:[label] BN Label name
運(yùn) 算 元:
運(yùn)算說明:If negative bit is ‘1’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N等於1時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
N = 1
指令名稱:BNC
原 意:Branch if Not Carry
語 法:[label] BNC label name
運(yùn) 算 元:
運(yùn)算說明:If carry bit is ‘0’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的進(jìn)位旗標(biāo)C等於0時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
C = 0
指令名稱:BNN
原 意:Branch if Not Negative
語 法:[label] BNN Label name
運(yùn) 算 元:
運(yùn)算說明:If negative bit is ‘0’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N等於0時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
N = 0
指令名稱:BNOV
原 意:Branch if Not Overflow
語 法:[label] BNOV Label name
運(yùn) 算 元:
運(yùn)算說明:If overflow bit is ‘0’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的溢位旗標(biāo)OV等於0時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
OV = 0
指令名稱:BNZ
原 意:Branch if Not Zero
語 法:[label] BNZ Label name
運(yùn) 算 元:
運(yùn)算說明:If zero bit is ‘0’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的零位旗標(biāo)Z等於0時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
Z = 0
指令名稱:BRA
原 意:Unconditional Branch
語 法:[label] BRA Label name
運(yùn) 算 元:
運(yùn)算說明:Jump to label name.
影響旗標(biāo):無
指令說明:無條件跳躍至指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
指令名稱:BSF
原 意:Bit Set f
語 法:[label] BSF f, b
運(yùn) 算 元:
運(yùn)算說明:1 -> f < b >
影響旗標(biāo):無
指令說明:將暫存器中的某一個(gè)位元設(shè)定為1。
類 別:位元定址指令。
組 別:?jiǎn)我晃辉O(shè)定指令。
範(fàn)例一:
執(zhí)行前:
REG = 00000000 = 0x00 ;REG暫存器的值為0x00。
執(zhí)行後:
REG = 00000100 = 0x04 ;將REG暫存器的第2個(gè)位元設(shè)定為1,從右邊算起為第0個(gè)位元、第1個(gè)位元、第2個(gè)位元,以下依此類推。
指令名稱:BTFSC
原 意:Bit Test File, Skip if Clear
語 法:[label] BTFSC f, b
運(yùn) 算 元:
運(yùn)算說明:skip if (f < b >) = 0
影響旗標(biāo):無
指令說明:比較暫存器中的某一個(gè)位元是否為0,假設(shè)是0則跳過下一個(gè)指令,若是不為0則往下執(zhí)行。
類 別:程式流程控制指令。
組 別:?jiǎn)我晃辉容^指令。
範(fàn)例一:
Here2 ADDLW 0x03 ;為0則執(zhí)行Here2這行指令。
執(zhí)行前:
REG = 11110000 = 0xF0 ;REG暫存器的值為0xF0。
PC = 在目前Here的位址
執(zhí)行後:
REG = 11110000 = 0xF0 ;REG暫存器的值為0xF0。
PC = 在Here2的位址 ;由於REG暫存器的第2個(gè)位元為0,因此程式跳到Here2的位址。
指令名稱:BTFSS
原 意:Bit Test File, Skip if Set
語 法:[label] BTFSS f, b
運(yùn) 算 元:
運(yùn)算說明:skip if (f < b >) = 1
影響旗標(biāo):無
指令說明:比較暫存器中的某一個(gè)位元是否為1,假設(shè)是1則跳過下一個(gè)指令,若是不為1則往下執(zhí)行。
類 別:程式流程控制指令。
組 別:?jiǎn)我晃辉容^指令。
範(fàn)例一:
Here2 ADDLW 0x03 ;為1則執(zhí)行Here2這行指令。
執(zhí)行前:
REG = 11111111 = 0xFF ;REG暫存器的值為0xFF。
PC = 在目前Here的位址
執(zhí)行後:
REG = 11111111 = 0xFF ;REG暫存器的值為0xFF。
PC = 在Here2的位址 ;由於REG暫存器的第2個(gè)位元為1,因此程式跳到Here2的位址。
指令名稱:BTG
原 意:Bit Toggle f
語 法:[label] BTG f, b
運(yùn) 算 元:
運(yùn)算說明:
影響旗標(biāo):無
指令說明:將暫存器中的某一個(gè)位元取補(bǔ)數(shù)。
類 別:位元定址指令。
組 別:?jiǎn)我晃辉壿嬛噶睢?/p>
範(fàn)例一:
執(zhí)行前:
REG = 00000000 = 0x00 ;REG暫存器的值為0x00。
執(zhí)行後:
REG = 00000100 = 0x04 ;將REG暫存器的第2個(gè)位元取補(bǔ)數(shù),從右邊算起為第0個(gè)位元、第1個(gè)位元、第2個(gè)位元,以下依此類推。
指令名稱:BOV
原 意:Branch if Overflow
語 法:[label] BOV Label name
運(yùn) 算 元:
運(yùn)算說明:If overflow bit is ‘1’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的溢位旗標(biāo)OV等於1時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
OV = 1
指令名稱:BZ
原 意:Branch if Zero
語 法:[label] BZ Label name
運(yùn) 算 元:
運(yùn)算說明:If zero bit is ‘1’, jump to label name.
影響旗標(biāo):無
指令說明:當(dāng)狀態(tài)暫存器中的零位旗標(biāo)Z等於1時(shí),就跳到指定的位址。
類 別:程式流程控制指令。
組 別:比較跳躍指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
Z = 1
指令名稱:CALL
原 意:Subroutine Call
語 法:[label] CALL Label name
運(yùn) 算 元:
運(yùn)算說明:(PC) + 4 -> Stack, Label name- > PC
影響旗標(biāo):無
指令說明:呼叫副程式,呼叫的範(fàn)圍最大到2 Mbytes的記憶體範(fàn)圍。
類 別:程式流程控制指令。
組 別:呼叫副程式指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
PC = 跳到Lab1的位址
指令名稱:CLRF
原 意:Clear f
語 法:[label] CLRF f
運(yùn) 算 元:
運(yùn)算說明:0x00 -> f, Z ->1
影響旗標(biāo):Z
指令說明:將暫存器的值全部清除為0。
類 別:資料轉(zhuǎn)移指令。
組 別:位元組 (Byte) 清除指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
指令名稱:CLRWDT
原 意:Clear Watchdog Timer
語 法:[label] CLRWDT
運(yùn) 算 元:無
運(yùn)算說明:0x00 -> WDT, 0x00 -> WDT postscaler,
,
影響旗標(biāo):,
指令說明:將看門狗計(jì)時(shí)器的值全部清除為0。
類 別:程式流程控制指令。
組 別:清除指令。
範(fàn)例一:
執(zhí)行前:
執(zhí)行後:
WDT Postscaler = 0x00 ;看門狗後除器的值為0x00。
= 1 ;計(jì)時(shí)器溢位旗標(biāo)等於1。
= 1 ;電源下降旗標(biāo)等於1。
指令名稱:COMF
原 意:Complement f
語 法:[label] COMF f, d
運(yùn) 算 元:
運(yùn)算說明:
影響旗標(biāo):N, Z
指 令說明:將暫存器的值取1的補(bǔ)數(shù),並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:邏輯運(yùn)算指令。
組 別:邏輯運(yùn)算NOT指令。
範(fàn)例一:
執(zhí)行前:
W = 0x00 ;W累加器的值為0x00。
Z = N = 0 ;零位旗標(biāo)Z與負(fù)號(hào)旗標(biāo)N皆為0。
執(zhí)行後:
W = 0x80 ;W累加器的值為0x80。
Z = 0, N = 1 ;零位旗標(biāo)Z等於0,因?yàn)檫\(yùn)算結(jié)果不為0x00,而負(fù)號(hào)旗標(biāo)N為1,因?yàn)檫\(yùn)算結(jié)果後最高位元等於1。
範(fàn)例二:
執(zhí)行前:
W = 0x00 ;W累加器的值為0x00。
Z = N = 0 ;零位旗標(biāo)Z與負(fù)號(hào)旗標(biāo)N皆為0。
執(zhí)行後:
W = 0x00 ;W累加器的值為0x00。
Z = 1, N = 0 ;零位旗標(biāo)Z等於1,因?yàn)檫\(yùn)算結(jié)果為0x00,而負(fù)號(hào)旗標(biāo)N為0,因?yàn)檫\(yùn)算結(jié)果後最高位元不等於1。
指令名稱:CPFSEQ
原 意:Compare f with W, skip if f = W
語 法:[label] CPFSEQ f
運(yùn) 算 元:
運(yùn)算說明:(f) - (W), skip if (f) = (W)
影響旗標(biāo):無
指令說明:將暫存器的值與W累加器的值作比較,若是兩個(gè)值相等則跳過下一個(gè)指令,若大於或是小於則往下執(zhí)行。
類 別:程式流程控制指令。
組 別:比較指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x04 ;暫存器REG的值為0x04。
W = 0x04 ;W累加器的值為0x04。
PC = 在目前Lab的位址
執(zhí)行後:
PC = 在Here2的位址 ;暫存器REG的值與W累加器的值相等,因此執(zhí)行Here2這行指令。
指令名稱:CPFSGT
原 意:Compare f with W, skip if f > W
語 法:[label] CPFSGT f
運(yùn) 算 元:
運(yùn)算說明:(f) - (W), skip if (f) > (W)
影響旗標(biāo):無
指令說明:將暫存器的值與W累加器的值作比較,若是暫存器的值大於W累加器的值則跳過下一個(gè)指令,若小於或是等於則往下執(zhí)行。
類 別:程式流程控制指令。
組 別:比較指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x04 ;W累加器的值為0x04。
PC = 在目前Lab的位址
執(zhí)行後:
PC = 在Here2的位址 ;暫存器的值大於W累加器的值,因此執(zhí)行Here2這行指令。
指令名稱:CPFSLT
原 意:Compare f with W, skip if f < W
語 法:[label] CPFSLT f
運(yùn) 算 元:
運(yùn)算說明:(f) - (W), skip if (f) < (W)
影響旗標(biāo):無
指令說明:將暫存器的值與W累加器的值作比較,若是暫存器的值小於W累加器的值則跳過下一個(gè)指令,若大於或是等於則往下執(zhí)行。
類 別:程式流程控制指令。
組 別:比較指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執(zhí)行後:
PC = 在Here2的位址 ;暫存器的值小於W累加器的值,因此執(zhí)行Here2這行指令。
指令名稱:DAW
原 意:Decimal Adjust W Register
語 法:[label] DAW
運(yùn) 算 元:無
運(yùn)算說明:If (W < 3:0 >) > 9 or [DC = 1] then
(W < 3:0 >) + 6 -> W < 3:0 > ;
else
(W < 3:0 >) -> W < 3:0 > ;
If (W < 7:4 >) > 9 or [DC = 1] then
(W < 7:4 >) + 6 -> W < 7:4 > ;
else
(W < 7:4 >) -> W < 7:4 >.
影響旗標(biāo):C
指令說明:將W累加器的低四位元與高四位元分別調(diào)整成BCD碼,也就是當(dāng)?shù)退奈辉闹荡箪?時(shí)就將低四位元加6,然後將進(jìn)位加到高四位元去,若是小於9則維持原狀;若是高四位元的值大於9就將高四位元加6,然後將進(jìn)位加到狀態(tài)旗標(biāo)的進(jìn)位旗標(biāo)C中,若是小於9則維持原狀。
類 別:程式流程控制指令。
組 別:邏輯運(yùn)算BCD碼調(diào)整指令。
範(fàn)例一:
執(zhí)行前:
W = 0x0F ;W累加器的值為0x0F。
C = 0 ;進(jìn)位旗標(biāo)等於0。
執(zhí)行後:
W = 0x15 ;由於低四位元大於9,因此將低四位元加6並且將進(jìn)位加到高四位元。
C = 0 ;進(jìn)位旗標(biāo)等於0。
範(fàn)例二:
執(zhí)行前:
W = 0xA0 ;W累加器的值為0xA0。
C = 0 ;進(jìn)位旗標(biāo)等於0。
執(zhí)行後:
W = 0x00 ;由於高四位元大於9,因此將高四位元加6並且將進(jìn)位加到進(jìn)位旗標(biāo)。
C = 1 ;由於高四位元大於9,因此作BCD調(diào)整後會(huì)有進(jìn)位的情形,所以進(jìn)位旗標(biāo)等於1。
範(fàn)例三:
執(zhí)行前:
W = 0xAF ;W累加器的值為0xAF。
C = 0 ;進(jìn)位旗標(biāo)等於0。
執(zhí)行後:
W = 0x15 ;由於低四位元大於9,因此將低四位元加6並且將進(jìn)位加到高四位元,再者是高四位元大於9,因此將高四位元加6並且將進(jìn)位加到進(jìn)位旗標(biāo)。
C = 1 ;由於高四位元大於9,因此作BCD調(diào)整後會(huì)有進(jìn)位的情形,所以進(jìn)位旗標(biāo)等於1。
指令名稱:DECF
原 意:Decrement f
語 法:[label] DECF f, d
運(yùn) 算 元:
運(yùn)算說明:(f) – 1 -> dest
影響旗標(biāo):C, DC, N, OV, Z
指 令說明:將暫存器的值減1,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉(zhuǎn)移指令。
組 別:算數(shù)運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x02 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0xFF ;W累加器的值為0xFF。
C = DC =OV = Z = 0, N = 1 ;由於將暫存器REG的值 (原本為0x00) 減1後變成-1,因此狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N被設(shè)定為1。
範(fàn)例二:
執(zhí)行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x80 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x80 ;W累加器的值為0x00。
C = DC = Z = 1, N = OV = 0;由於減1之後並沒有發(fā)生負(fù)號(hào)的情形發(fā)生,因此狀態(tài)暫存器中的借位旗標(biāo)C等於1;再者高四位元與低四位元之間也沒有借位的情形發(fā)生,因此半借位旗標(biāo)DC 等於1;而將暫存器REG的值減1後結(jié)果為0,因此零位旗標(biāo)Z被設(shè)定為1。
範(fàn)例三:
執(zhí)行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x00 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x80 ;暫存器REG的值為0x00。
W = 0x7F ;W累加器的值為0x00。
C = OV = 1, Z = N = DC = 0;由於減1之後並沒有發(fā)生負(fù)號(hào)的情形發(fā)生,因此狀態(tài)暫存器中的借位旗標(biāo)C等於1;再者是第7個(gè)位元由1變成0,因此跟據(jù)溢位旗標(biāo)OV的定義,當(dāng)?shù)?個(gè)位元狀態(tài)有被改變時(shí),溢位旗標(biāo)OV就會(huì)被設(shè)定為1。
範(fàn)例四:
執(zhí)行前:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x51 ;W累加器的值為0x51。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x7E ;暫存器REG的值為0x7E。
W = 0x51 ;W累加器的值為0x51。
C = DC = 1, Z = N = OV = 0;由於減1之後並沒有發(fā)生負(fù)號(hào)的情形發(fā)生,因此狀態(tài)暫存器中的借位旗標(biāo)C等於1;再者高四位元與低四位元之間也沒有借位的情形發(fā)生,因此半借位旗標(biāo)DC等於1。
備 註:在進(jìn)行DECF減法指令時(shí),若是在減1後有負(fù)號(hào)的情形發(fā)生,例如REG = 0x00減1變成REG = 0xFF,此時(shí)狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N就會(huì)被設(shè)定為1,而借位旗標(biāo)C也會(huì)從1變成0,因?yàn)楸唤栉涣;再者是零位旗?biāo)Z,他要被設(shè)定為1的情形是發(fā)生在當(dāng) 結(jié)果等於0時(shí)才會(huì)發(fā)生,如例題二;其半借位旗標(biāo)DC等於1的情形會(huì)發(fā)生在高四位元與低四位元之間沒有借位的情形發(fā)生,若是有借位的情形發(fā)生DC就會(huì)等於 0,如例題三;最後是溢位旗標(biāo)OV被設(shè)定為1的情形會(huì)發(fā)生在第7個(gè)位元由1變成0的時(shí)候,如例題三。
指令名稱:DECFSZ
原 意:Decrement f, skip if 0
語 法:[label] DECFSZ f, d
運(yùn) 算 元:
運(yùn)算說明:(f) – 1 -> dest, skip if result = 0
影響旗標(biāo):無
指 令說明:將暫存器的值減1後與0作比較,若是暫存器的值等於0則跳過下一個(gè)指令,若不等於0則往下執(zhí)行,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數(shù)比較運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x00 ;W累加器的值為0x00。
PC = 在Here2的位址 ;暫存器的值等於0,因此執(zhí)行Here2這行指令。
範(fàn)例二:
執(zhí)行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x3F ;W累加器的值為0x3F。
PC = 在Here1的位址 ;暫存器的值不等於0,因此執(zhí)行Here1這行指令。
指令名稱:DCFSNZ
原 意:Decrement f, skip if not 0
語 法:[label] DCFSNZ f, d
運(yùn) 算 元:
運(yùn)算說明:(f) – 1 -> dest, skip if result 0
影響旗標(biāo):無
指 令說明:將暫存器的值減1後與0作比較,若是暫存器的值不等於0則跳過下一個(gè)指令,若等於0則往下執(zhí)行,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數(shù)比較運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x15 ;W累加器的值為0x15。
PC = 在Here1的位址 ;暫存器的值等於0,因此執(zhí)行Here1這行指令。
範(fàn)例二:
執(zhí)行前:
REG = 0x10 ;暫存器REG的值為0x10。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x3F ;W累加器的值為0x3F。
PC = 在Here2的位址 ;暫存器的值不等於0,因此執(zhí)行Here2這行指令。
指令名稱:GOTO
原 意:Unconditional Branch
語 法:[label] GOTO k
運(yùn) 算 元:
運(yùn)算說明:k -> PC <20:0 >
影響旗標(biāo):無
指令說明:無條件跳躍至指定位址。
類 別:程式流程控制指令。
組 別:跳躍運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
PC = 在目前Lab的位址
執(zhí)行後:
PC = 在Here1的位址 ;執(zhí)行Here1這行指令。
指令名稱:INCF
原 意:Increment f
語 法:[label] INCF f, d
運(yùn) 算 元:
運(yùn)算說明:(f) + 1 -> dest
影響旗標(biāo):C, DC, N, OV, Z
指 令說明:將暫存器的值加1,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉(zhuǎn)移指令。
組 別:算數(shù)運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x02 ;W累加器的值為0x02。
C = DC = Z = 1, N = OV = 0;由於將暫存器REG的值加1後產(chǎn)生溢位情形,因此進(jìn)位旗標(biāo)C與半進(jìn)位旗標(biāo)DC被設(shè)定為1;又相加結(jié)果為0,因此零位旗標(biāo)Z被設(shè)定為1;而負(fù)號(hào)旗標(biāo)N與 溢位旗標(biāo)OV因?yàn)橄嗉又峤Y(jié)果為0,不符合負(fù)號(hào)旗標(biāo)N與溢位旗標(biāo)OV的定義,因此狀態(tài)步改變。
範(fàn)例二:
執(zhí)行前:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x7F ;暫存器REG的值為0x7F。
W = 0x80 ;W累加器的值為0x80。
DC = N = OV = 1, C = Z = 0;由於將暫存器REG的值加1後低四位元產(chǎn)生溢位情形,因此半進(jìn)位旗標(biāo)DC被設(shè)定為1;又將暫存器REG的值加1後,結(jié)果大於127,因此負(fù)號(hào)旗標(biāo)N被 設(shè)定為1,因?yàn)槭褂?的補(bǔ)數(shù)加法;溢位旗標(biāo)OV等於1,跟據(jù)溢位旗標(biāo)OV的定義,當(dāng)?shù)?個(gè)位元狀態(tài)有被改變時(shí),溢位旗標(biāo)OV就會(huì)被設(shè)定為1。
範(fàn)例三:
執(zhí)行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x81 ;暫存器REG的值為0x81。
W = 0x02 ;W累加器的值為0x02。
N = 1, C = DC = OV = Z = 0;將暫存器REG的值加1後,結(jié)果大於127,因此負(fù)號(hào)旗標(biāo)N被設(shè)定為1,因?yàn)槭褂?的補(bǔ)數(shù)加法。
範(fàn)例四:
執(zhí)行前:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x02 ;W累加器的值為0x02。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
REG = 0x0F ;暫存器REG的值為0x0F。
W = 0x10 ;W累加器的值為0x10。
DC = 1, C = N = OV = Z = 0;由於將暫存器REG的值加1後低四位元產(chǎn)生溢位情形,因此半進(jìn)位旗標(biāo)DC被設(shè)定為1。
指令名稱:INCFSZ
原 意:Increment f, skip if 0
語 法:[label] INCFSZ f, d
運(yùn) 算 元:
運(yùn)算說明:(f) + 1 -> dest, skip if result = 0
影響旗標(biāo):無
指 令說明:將暫存器的值加1後與0作比較,若是暫存器的值等於0則跳過下一個(gè)指令,若不等於0則往下執(zhí)行,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數(shù)比較運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x02 ;W累加器的值為0x02。
PC = 在Here1的位址 ;暫存器的值不等於0,因此執(zhí)行Here1這行指令。
範(fàn)例二:
執(zhí)行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x3F ;W累加器的值為0x3F。
PC = 在Here2的位址 ;暫存器的值不等於0,因此執(zhí)行Here2這行指令。
指令名稱:INFSNZ
原 意:Increment f, skip if not 0
語 法:[label] INFSNZ f, d
運(yùn) 算 元:
運(yùn)算說明:(f) + 1 -> dest, skip if result 0
影響旗標(biāo):無
指 令說明:將暫存器的值加1後與0作比較,若是暫存器的值不等於0則跳過下一個(gè)指令,若等於0則往下執(zhí)行,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:程式流程控制指令。
組 別:算數(shù)比較運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x01 ;暫存器REG的值為0x01。
W = 0x15 ;W累加器的值為0x15。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0x02 ;暫存器REG的值為0x02。
W = 0x15 ;W累加器的值為0x15。
PC = 在Here2的位址 ;暫存器的值不等於0,因此執(zhí)行Here2這行指令。
範(fàn)例二:
執(zhí)行前:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x3F ;W累加器的值為0x3F。
PC = 在目前Lab的位址
執(zhí)行後:
REG = 0xFF ;暫存器REG的值為0xFF。
W = 0x00 ;W累加器的值為0x00。
PC = 在Here1的位址 ;暫存器的值等於0,因此執(zhí)行Here1這行指令。
指令名稱:IORLW
原 意:Inclusive OR literal with W
語 法:[label] IORLW k
運(yùn) 算 元:
運(yùn)算說明:(W) .OR. k -> W
影響旗標(biāo):N, Z
指令說明:W累加器中的值與k值作OR運(yùn)算,並將運(yùn)算結(jié)果放回W累加器中。
類 別:立即常數(shù)定址法。
組 別:邏輯運(yùn)算OR指令。
範(fàn)例一:
執(zhí)行前:
W = 0x00 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
W = 0x00 ;W累加器的值為0x00。
Z = 1, C = DC = OV = N = 0;由於運(yùn)算後結(jié)果等於0,因此零位旗標(biāo)Z被設(shè)定為1。
範(fàn)例二:
執(zhí)行前:
W = 0x00 ;W累加器的值為0x00。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
W = 0x80 ;W累加器的值為0x80。
N = 1, C = DC = OV = Z = 0;由於運(yùn)算後第7個(gè)位元等於1,因此負(fù)號(hào)旗標(biāo)N被設(shè)定為1。
範(fàn)例三:
執(zhí)行前:
W = 0x80 ;W累加器的值為0x80。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
W = 0x85 ;W累加器的值為0x85。
N = 1, C = DC = OV = Z = 0;由於運(yùn)算後第7個(gè)位元等於1,因此負(fù)號(hào)旗標(biāo)N被設(shè)定為1。
指令名稱:IORWF
原 意:Inclusive OR W with f
語 法:[label] IORLW f, d
運(yùn) 算 元:
運(yùn)算說明:(W) .OR. (f) -> dest
影響旗標(biāo):N, Z
指 令說明:W累加器中的值與f暫存器中的值作OR運(yùn)算,並將運(yùn)算結(jié)果放回 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉(zhuǎn)移指令。
組 別:邏輯運(yùn)算OR指令。
範(fàn)例一:
執(zhí)行前:
W = 0x00 ;W累加器的值為0x00。
REG = 0x00 ;暫存器REG的值為0x00。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
W = 0x00 ;W累加器的值為0x00。
REG = 0x00 ;暫存器REG的值為0x00。
Z = 1, C = DC = OV = N = 0;由於運(yùn)算後結(jié)果等於0,因此零位旗標(biāo)Z被設(shè)定為1。
範(fàn)例二:
執(zhí)行前:
W = 0x10 ;W累加器的值為0x10。
REG = 0x05 ;暫存器REG的值為0x05。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
W = 0x10 ;W累加器的值為0x10。
REG = 0x15 ;暫存器REG的值為0x15。
Z = C = DC = OV = N = 0 ;狀態(tài)暫存器的旗標(biāo)皆為0。
範(fàn)例三:
執(zhí)行前:
W = 0x80 ;W累加器的值為0x80。
REG = 0x05 ;暫存器REG的值為0x05。
C = DC = N = OV = Z = 0 ;假設(shè)狀態(tài)暫存器的旗標(biāo)皆為0。
執(zhí)行後:
W = 0x80 ;W累加器的值為0x80。
REG = 0x85 ;暫存器REG的值為0x85。
N = 1, Z = C = DC = OV = N = 0 ;由於運(yùn)算後第7個(gè)位元等於1,因此負(fù)號(hào)旗標(biāo)N被設(shè)定為1。
指令名稱:LFSR
原 意:Load FSR
語 法:[label] LFSR f, d
運(yùn) 算 元:
運(yùn)算說明:k -> FSRf
影響旗標(biāo):無
指 令說明:PIC單晶片對(duì)資料的定址方式除了有直接定址與立即定址外,還有一種就是間接定址,而間接定址所使用的基底暫存器就是FSR (File Select Register) 暫存器,F(xiàn)SR暫存器所放的是位址,也就是資料的位址,至於資料就放在INDF這個(gè)暫存器中,例如我們要將0x30這個(gè)資料放在RAM位址中的 0x100,我們只要把0x100存入FSR暫存器中,把0x30存入INDF這個(gè)暫存器中就可以了。而在PIC18系列中間接定址可以使用的FSR暫存 器有3個(gè),分別是FSR0、FSR1與FSR2這三個(gè)暫存器,而定義的記憶體位址長(zhǎng)度可以到達(dá)12 bits,但是暫存器的長(zhǎng)度只有8 bits,因此便將FSR0分成FSR0H與FSR0L、FSR1分成FSR1H與FSR1L、FSR2分成FSR2H與FSR2L二個(gè)高低位元的暫存 器。若是我們要將RAM的位址0x180放到FSR2,則我們可以寫成LFSR 2,0x180;若是我們要將RAM的位址0x2AB放到FSR0,則我們可以寫成LFSR 0,0x2AB即可。
類 別:立即常數(shù)定址法。
組 別:數(shù)值運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
FSR0H = ?
FSR0L = ?
執(zhí)行後:
FSR0H = 0x04
FSR0L = 0x23
範(fàn)例二:
執(zhí)行前:
FSR2H = ?
FSR2L = ?
執(zhí)行後:
FSR2H = 0x03
FSR2L = 0xAB
指令名稱:MOVF
原 意:Move f
語 法:[label] MOVF f, d
運(yùn) 算 元:
運(yùn)算說明:f -> dest
影響旗標(biāo):N, Z
指 令說明:將暫存器 (f) 的值般到 ’d’ 所指定的暫存器中。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:資料轉(zhuǎn)移指令。
組 別:資料搬移指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x02 ;W累加器的值為0x02。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
W = 0x00 ;W累加器的值為0x00。
Z = 1, N = 0 ;結(jié)果等於0,因此零號(hào)旗標(biāo)Z等於1。
範(fàn)例二:
執(zhí)行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x02 ;W累加器的值為0x02。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x02 ;W累加器的值為0x02。
N = 1, Z = 0 ;由於第7個(gè)位元為1,因此負(fù)號(hào)旗標(biāo)N等於1。
範(fàn)例三:
執(zhí)行前:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x30 ;W累加器的值為0x30。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 0x80 ;暫存器REG的值為0x80。
W = 0x80 ;W累加器的值為0x80。
N = 1, Z = 0 ;由於第7個(gè)位元不是1,因此負(fù)號(hào)旗標(biāo)N等於0;搬運(yùn)後的結(jié)果不是0,因此零號(hào)旗標(biāo)Z等於0。
指令名稱:MOVFF
原 意:Move f to f
語 法:[label] MOVF
運(yùn) 算 元:
運(yùn)算說明:
影響旗標(biāo):無
指令說明:將暫存器的值般到暫存器
去。
類 別:資料轉(zhuǎn)移指令。
組 別:資料搬移指令。
範(fàn)例一:
執(zhí)行前:
REG1 = 0x03 ;暫存器REG1的值為0x03。
REG2 = 0x80 ;暫存器REG2的值為0x80。
執(zhí)行後:
REG1 = 0x03 ;暫存器REG1的值為0x03。
REG2 = 0x03 ;暫存器REG2的值為0x03。
範(fàn)例二:
執(zhí)行前:
REG1 = 0x03 ;暫存器REG1的值為0x03。
PORTB = 0x80 ; PORTB的值為0x80。
執(zhí)行後:
REG1 = 0x03 ;暫存器REG1的值為0x03。
PORTB = 0x03 ; PORTB的值為0x03。
指令名稱:MOVLB
原 意:Move literal to low nibble in BSR
語 法:[label] MOVLB k
運(yùn) 算 元:
運(yùn)算說明:k -> BSR
影響旗標(biāo):無
指 令說明:將常數(shù)搬到分頁暫存器 (Bank Select Register, BSR) 中,以設(shè)定存取資料的起始位址。因?yàn)樵?8FXX2中將RAM分成許多頁供我們使用,因此若是BSR等於1,則表示存取得位址從0x100開始;系統(tǒng)開始 後或是RESET後BSR預(yù)設(shè)為0,也就是從0x00開始。
類 別:立即常數(shù)定址法。
組 別:資料搬移指令。
範(fàn)例一:
執(zhí)行前:
BSR = 0x00 ;暫存器BSR的值為0x00。
執(zhí)行後:
REG1 = 0x01 ;暫存器BSR的值為0x01。
指令名稱:MOVLW
原 意:Move literal to W
語 法:[label] MOVLW k
運(yùn) 算 元:
運(yùn)算說明:k -> W
影響旗標(biāo):無
指令說明:將常數(shù)搬到W累加器中。
類 別:立即常數(shù)定址法。
組 別:資料搬移指令。
範(fàn)例一:
執(zhí)行前:
W = 0x00 ;W累加器的值為0x00。
執(zhí)行後:
W = 0x40 ;W累加器的值為0x40。
指令名稱:MOVWF
原 意:Move W to f
語 法:[label] MOVWF f
運(yùn) 算 元:
運(yùn)算說明:(W) -> f
影響旗標(biāo):無
指令說明:將W累加器中值搬到暫存器REG中。
類 別:資料轉(zhuǎn)移指令。
組 別:資料搬移指令。
範(fàn)例一:
執(zhí)行前:
W = 0xF0 ;W累加器的值為0xF0。
REG = 0x50 ;暫存器REG的值為0x50。
執(zhí)行後:
W = 0xF0 ;W累加器的值為0xF0。
REG = 0xF0 ;暫存器REG的值為0xF0。
指令名稱:MULLW
原 意:Multiply Literal with W
語 法:[label] MULLW k
運(yùn) 算 元:
運(yùn)算說明:(W) x k -> PRODH : PRODL
影響旗標(biāo):無
指令說明:將常數(shù)與W累加器中的值相乘,並將結(jié)果放到PRODH : PRODL這二個(gè)8位元的暫存器。
類 別:立即常數(shù)定址法。
組 別:數(shù)學(xué)運(yùn)算乘法指令。
範(fàn)例一:
執(zhí)行前:
W = 0x02 ;W累加器的值為0x02。
PRODH = ? ;假設(shè)PRODH的值未知。
PRODL = ? ;假設(shè)PRODL的值未知。
執(zhí)行後:
W = 0x02 ;W累加器的值為0x02。
PRODH = 0x00 ;PRODH的值為0x00。
PRODL = 0x20 ;PRODL的值0x20。
範(fàn)例二:
執(zhí)行前:
W = 0xE2 ;W累加器的值為0xE2。
PRODH = ? ;假設(shè)PRODH的值未知。
PRODL = ? ;假設(shè)PRODL的值未知。
執(zhí)行後:
W = 0xE2 ;W累加器的值為0xE2。
PRODH = 0xAD ;PRODH的值為0xAD。
PRODL = 0x08 ;PRODL的值為0x08。
指令名稱:MULWF
原 意:Multiply W to f
語 法:[label] MULWF f
運(yùn) 算 元:
運(yùn)算說明:(W) x (f) -> PRODH : PRODL
影響旗標(biāo):無
指令說明:將暫存器的值與W累加器中的值相乘,並將結(jié)果放到PRODH : PRODL這二個(gè)8位元的暫存器。
類 別:資料轉(zhuǎn)移指令。
組 別:數(shù)學(xué)運(yùn)算乘法指令。
範(fàn)例一:
執(zhí)行前:
W = 0x02 ;W累加器的值為0x02。
REG = 0x20 ;暫存器REG的值為0x20。
PRODH = ? ;假設(shè)PRODH的值未知。
PRODL = ? ;假設(shè)PRODL的值未知。
執(zhí)行後:
W = 0x02 ;W累加器的值為0x02。
REG = 0x20 ;暫存器REG的值為0x20。
PRODH = 0x00 ;PRODH的值為0x00。
PRODL = 0x40 ;PRODL的值0x40。
範(fàn)例二:
執(zhí)行前:
W = 0xC4 ;W累加器的值為0xC4。
REG = 0xB5 ;暫存器REG的值為0xB5。
PRODH = ? ;假設(shè)PRODH的值未知。
PRODL = ? ;假設(shè)PRODL的值未知。
執(zhí)行後:
W = 0xC4 ;W累加器的值為0xC4。
REG = 0xB5 ;暫存器REG的值為0xB5。
PRODH = 0x8A ;PRODH的值為0x8A。
PRODL = 0x94 ;PRODL的值為0x94。
範(fàn)例三:
執(zhí)行前:
W = 0x10 ;W累加器的值為0x10。
REG = 0x50 ;暫存器REG的值為0x50。
PRODH = ? ;假設(shè)PRODH的值未知。
PRODL = ? ;假設(shè)PRODL的值未知。
執(zhí)行後:
W = 0x10 ;W累加器的值為0x10。
REG = 0x50 ;暫存器REG的值為0x50。
PRODH = 0x05 ;PRODH的值為0x05。
PRODL = 0x00 ;PRODL的值0x00。
指令名稱:NEGF
原 意:Negate f
語 法:[label] NEGF f
運(yùn) 算 元:
運(yùn)算說明:
影響旗標(biāo):N, OV, C, DC, Z
指令說明:將暫存器的值取補(bǔ)數(shù)後加1,並將結(jié)果放回暫存器。
類 別:邏輯運(yùn)算指令。
組 別:邏輯運(yùn)算指令。
範(fàn)例一:
執(zhí)行前:
REG = 0x00 ;暫存器REG的值為0x00。
N = OV = C = DC = Z = 0 ;狀態(tài)暫存器中的值皆為0。
執(zhí)行後:
REG = 0x00 ;暫存器REG的值為0x00。
N = OV = 0, C = DC = Z = 1;運(yùn)算結(jié)果等於0,因此零位旗標(biāo)Z等於1;運(yùn)算後有進(jìn)位發(fā)生,由0xFF加1發(fā)生溢位產(chǎn)生0x00,因此進(jìn)位旗標(biāo)C等於1;低四位元有進(jìn)位發(fā)生,因此半進(jìn)位旗標(biāo)DC等於1。
範(fàn)例二:
執(zhí)行前:
REG = 0x80 ;暫存器REG的值為0x80。
N = OV = C = DC = Z = 0 ;狀態(tài)暫存器中的值皆為0。
執(zhí)行後:
REG = 0x80 ;暫存器REG的值為0x80。
C = Z = 0, N = DC = OV = 1;由於第7個(gè)位元由0變成1,因此負(fù)號(hào)旗標(biāo)N被設(shè)定為1;接著OV也被設(shè)定為1,因?yàn)?x80取補(bǔ)數(shù)後為0x7F,之後在加1,因此最後結(jié)果為 0x80,在運(yùn)算過程中低四位元有進(jìn)位的情形發(fā)生,因此半進(jìn)位旗標(biāo)DC等於1。
範(fàn)例三:
執(zhí)行前:
REG = 0x55 ;暫存器REG的值為0x55。
N = OV = C = DC = Z = 0 ;狀態(tài)暫存器中的值皆為0。
執(zhí)行後:
REG = 0xAB ;暫存器REG的值為0xAB。
OV = C = DC = Z = 0, N = 1;由於第7個(gè)位元由0變成1,因此負(fù)號(hào)旗標(biāo)N被設(shè)定為1。
指令名稱:NOP
原 意:NO Operation
語 法:[label] NOP
運(yùn) 算 元:無
運(yùn)算說明:無
影響旗標(biāo):無
指令說明:不做任何運(yùn)算,只延遲一個(gè)指令時(shí)間。
類 別:程式流程控制指令。
組 別:空指令。
範(fàn)例一:
指令名稱:POP
原 意:Pop Top of return Stack
語 法:[label] POP
運(yùn) 算 元:無
運(yùn)算說明:(TOS) -> bit bucket
影響旗標(biāo):無
指令說明:將堆疊的值取出來放在TOS這個(gè)暫存器中,TOS暫存器的資料長(zhǎng)度21 bits,因此TOS暫存器被分為TOSL、TOSH與TOSU。
類 別:程式流程控制指令。
範(fàn)例一:
Goto NEW ;跳到NEW標(biāo)記去。
執(zhí)行前:
TOS = 0x0031A2 ;堆疊暫存器的值為0x0031A2。
堆疊最上層 = 0x014332 ;堆疊最上層的資料為0x014332。
執(zhí)行後:
TOS = 0x014332 ;堆疊暫存器的值為0x014332。
PC = NEW ;程式計(jì)數(shù)器的值為NEW標(biāo)記。
指令名稱:PUSH
原 意:Push Top of return Stack
語 法:[label] PUSH
運(yùn) 算 元:無
運(yùn)算說明:(PC+2) -> TOS
影響旗標(biāo):無
指令說明:將下一個(gè)指令的位址置於堆疊上層。
類 別:程式流程控制指令。
組 別:堆疊資料存取控制。
範(fàn)例一:
執(zhí)行前:
TOS = 0x0031A2 ;堆疊暫存器的值為0x0031A2。
PC = 0x000124 ;目前程式計(jì)數(shù)器的值0x000124。
執(zhí)行後:
TOS = 0x000126 ;堆疊暫存器的值為0x000126。
堆疊次上層 = 0x0031A2 ;堆疊次上層的資料0x0031A2。
指令名稱:RCALL
原 意:Relative Call
語 法:[label] RCALL n
運(yùn) 算 元:
運(yùn)算說明:(PC) + 2 -> TOS
(PC) + 2 + 2n -> PC
影響旗標(biāo):無
指令說明:1 k範(fàn)圍內(nèi)的短程副程式呼叫。
類 別:程式流程控制指令。
組 別:呼叫副程式控制。
範(fàn)例一:
執(zhí)行前:
PC = Here ;程式計(jì)數(shù)器在Here位址上。
執(zhí)行後:
PC = Jump ;程式計(jì)數(shù)器跳到Jump副程式位址。
TOS = Here + 2 ;推疊指標(biāo)暫存器記錄返回的位址。
指令名稱:RESET
原 意:Reset
語 法:[label] RESET
運(yùn) 算 元:無
運(yùn)算說明:Reset all registers and flags.
影響旗標(biāo):全部歸零
指令說明:軟體重置命令。
類 別:程式流程控制指令。
組 別:程式重新啟動(dòng)控制。
範(fàn)例一:
執(zhí)行後:
所有暫存器與旗標(biāo)回到初始值
指令名稱:RETFIE
原 意:Return from Interrupt
語 法:[label] RETFIE [s]
運(yùn) 算 元:
運(yùn)算說明:(TOS) -> PC
1 -> GIE/ GIEH or PEIE/GIEL,
if s = 1
(WS) -> W,
(STATUSS) -> STATUS,
(BSRS) -> BSR,
PCLATU, PCLATH 狀態(tài)不改變。
影響旗標(biāo):GIE/ GIEH, PEIE/GIEL
指 令說明:離開中斷程式副程式,並將推疊指標(biāo)暫存器的值存到PC中,中斷致能接腳設(shè)定為1。若是資料備份選擇位元等於1 (s = 1) ,則將WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態(tài)暫存器;BSRS暫存器的值搬到BSR,但是PCLATU 與PCLATH的狀態(tài)不改變。
類 別:程式流程控制指令。
組 別:流程控制。
範(fàn)例一:
執(zhí)行後:
PC = TOS
W = WS
BSR = BSRS
STATUS = STATUSS
GIE/ GIEH, PEIE/GIEL = 1
指令名稱:RETLW
原 意:Return Literal to W
語 法:[label] RETLW k
運(yùn) 算 元:
運(yùn)算說明:k -> W,
(TOS) -> PC,
PCLATU, PCLATH 狀態(tài)不改變。
影響旗標(biāo):無
指令說明:從副程式返回主程式的指令,但本指令在返回的時(shí)候,還會(huì)順便將8 bits的常數(shù)k載入到 ” W ” 累加器中,這個(gè)功能在查表法時(shí)會(huì)用到。
類 別:立即常數(shù)定址法。
組 別:流程控制。
範(fàn)例一:
、、、、 ;W累加器的內(nèi)容為表中Offset值。
、、、、 ;返回後W累加器的內(nèi)容為TABLE的值。
Table:
ADDWF PCL ;W = Offset.
RETLW 0x30 ;返回時(shí)將0x30存回W累加器
RETLW 0x10 ;返回時(shí)將0x10存回W累加器
RETLW 0xDD ;返回時(shí)將0xDD存回W累加器
執(zhí)行前:
W = ? ;W累加器的值未知。
執(zhí)行後:
W = 0x30 ;W累加器的值等於0x30。
指令名稱:RETURN
原 意:Return from Subroutine
語 法:[label] RETURN [s]
運(yùn) 算 元:
運(yùn)算說明:(TOS) -> PC
1 -> GIE/ GIEH or PEIE/GIEL,
if s = 1
(WS) -> W,
(STATUSS) -> STATUS,
(BSRS) -> BSR,
PCLATU, PCLATH 狀態(tài)不改變。
影響旗標(biāo):無
指 令說明:離開副程式,並將推疊指標(biāo)暫存器的值存到PC中,中斷致能接腳設(shè)定為1。若是資料備份選擇位元等於1 (s = 1) ,則將WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態(tài)暫存器;BSRS暫存器的值搬到BSR,但是PCLATU 與PCLATH的狀態(tài)不改變。
類 別:程式流程控制指令。
組 別:流程控制。
範(fàn)例一:
RETURN ;離開副程式,並把WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態(tài)暫存器;BSRS暫存器的值搬到BSR。
執(zhí)行後:
PC = TOS ;推疊指標(biāo)的值存回PC。
指令名稱:RLCF
原 意:Rotate Left f through Carry
語 法:[label] RLCF f, d
運(yùn) 算 元:
運(yùn)算說明:(f < n >) -> dest <n >,
(f < 7 >) -> 7,
( C ) -> dest <0 >
影響旗標(biāo):C, N, Z
指 令說明:將REG暫存內(nèi)的值與進(jìn)位旗標(biāo)C一起向左旋轉(zhuǎn)。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器)。
類 別:邏輯運(yùn)算指令。
組 別:邏輯指令。
範(fàn)例一:
CLRC ;將進(jìn)位旗號(hào)C清除為0。
RLCF REG, 0 ;將REG暫存器的值一起與進(jìn)位旗號(hào)C一起向左旋轉(zhuǎn),並將結(jié)果存回W暫存器中。
執(zhí)行前:
REG = 1110 0110 ;REG暫存器的值為11100110。
N = Z = C = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 1110 0110 ;REG暫存器的值為11100110。
W = 1100 1100 ;W暫存器的值為11001100。
N = C = 1 ;由於向左移是負(fù)數(shù)越多,因此負(fù)號(hào)旗標(biāo)N為1;進(jìn)位旗號(hào)C為1。
範(fàn)例二:
CLRC ;將進(jìn)位旗號(hào)C清除為0。
RLCF REG, F ;將REG暫存器的值一起與進(jìn)位旗號(hào)C一起向左旋轉(zhuǎn),並將結(jié)果存回REG暫存器中。
執(zhí)行前:
REG = 1000 0000 ;REG暫存器的值為10000000。
W = 0000 0000 ;W暫存器的值為00000000。
N = Z = C = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 0000 0000 ;REG暫存器的值為00000000。
W = 0000 0000 ;W暫存器的值為00000000。
Z = C = 1 ;由於向左移後結(jié)果為0,因此零位旗號(hào)Z為1;進(jìn)位旗號(hào)C為1。
指令名稱:RLNCF
原 意:Rotate Left f (no Carry)
語 法:[label] RLNCF f, d
運(yùn) 算 元:
運(yùn)算說明:(f < n >) -> dest <n >,
(f < 7 >) -> 7,
影響旗標(biāo):N, Z
指 令說明:將REG暫存內(nèi)的值向左旋轉(zhuǎn)。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器)。
類 別:邏輯運(yùn)算指令。
組 別:邏輯指令。
範(fàn)例一:
RLNCF REG, 0 ;將REG暫存器的值向左旋轉(zhuǎn),並將結(jié)果存回W暫存器中。
執(zhí)行前:
REG = 1110 0110 ;REG暫存器的值為11100110。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 1110 0110 ;REG暫存器的值為11100110。
W = 1100 1100 ;W暫存器的值為11001100。
N = 1 ;由於向左移是負(fù)數(shù)越多,因此負(fù)號(hào)旗標(biāo)N為1。
範(fàn)例二:
RLNCF REG, F ;將REG暫存器的值向左旋轉(zhuǎn),並將結(jié)果存回REG暫存器中。
執(zhí)行前:
REG = 1000 0000 ;REG暫存器的值為10000000。
W = 0000 0000 ;W暫存器的值為00000000。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 0000 0000 ;REG暫存器的值為00000000。
W = 0000 0000 ;W暫存器的值為00000000。
Z = 1 ;由於向左移後結(jié)果為0,因此零位旗號(hào)Z為1。
指令名稱:RRCF
原 意:Rotate Right f through Carry
語 法:[label] RRCF f, d
運(yùn) 算 元:
運(yùn)算說明:(f < n >) -> dest <n >,
(f < 7 >) -> 7,
( C ) -> dest <0 >
影響旗標(biāo):C, N, Z
指 令說明:將REG暫存內(nèi)的值與進(jìn)位旗標(biāo)C一起向右旋轉(zhuǎn)。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:邏輯運(yùn)算指令。
組 別:邏輯指令。
範(fàn)例一:
RRCF REG, 0 ;將REG暫存器的值一起與進(jìn)位旗號(hào)C一起向右旋轉(zhuǎn),並將結(jié)果存回W暫存器中。
執(zhí)行前:
REG = 1110 0110 ;REG暫存器的值為11100110。
N = Z = 0 ;假設(shè)狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N與零號(hào)旗標(biāo)Z皆為0。
C = 1 ;假設(shè)進(jìn)位旗號(hào)C為1。
執(zhí)行後:
REG = 1110 0110 ;REG暫存器的值為11100110。
W = 1111 0011 ;W暫存器的值為11110011。
N = Z = C = 0 ;狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N、零號(hào)旗標(biāo)Z與進(jìn)位旗號(hào)C結(jié)果皆為0。
範(fàn)例二:
CLRC ;將進(jìn)位旗號(hào)C清除為0。
RRCF REG, F ;將REG暫存器的值一起與進(jìn)位旗號(hào)C一起向左旋轉(zhuǎn),並將結(jié)果存回REG暫存器中。
執(zhí)行前:
REG = 0000 0001 ;REG暫存器的值為00000001。
W = 0000 0000 ;W暫存器的值為00000000。
N = Z = C = 0 ;狀態(tài)暫存器中的負(fù)號(hào)旗標(biāo)N、零號(hào)旗標(biāo)Z與進(jìn)位旗號(hào)C皆為0。
執(zhí)行後:
REG = 0000 0000 ;REG暫存器的值為00000000。
W = 0000 0000 ;W暫存器的值為00000000。
Z = C = 1 ;由於向左移後結(jié)果為0,因此零位旗號(hào)Z為1;進(jìn)位旗號(hào)C為1。
N = 0 ;負(fù)號(hào)旗標(biāo)N為0。
指令名稱:RRNCF
原 意:Rotate Right f (no Carry)
語 法:[label] RRNCF f, d
運(yùn) 算 元:
運(yùn)算說明:(f < n >) -> dest <n >,
(f < 7 >) -> 7,
影響旗標(biāo):N, Z
指 令說明:將REG暫存內(nèi)的值向右旋轉(zhuǎn)。若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。
類 別:邏輯運(yùn)算指令。
組 別:邏輯指令。
範(fàn)例一:
RRNCF REG, 0 ;將REG暫存器的值向右旋轉(zhuǎn),並將結(jié)果存回W暫存器中。
執(zhí)行前:
REG = 1110 0110 ;REG暫存器的值為11100110。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 1110 0110 ;REG暫存器的值為11100110。
W = 0111 0011 ;W暫存器的值為11001100。
N = Z = 0 ;負(fù)號(hào)旗標(biāo)N與零號(hào)旗標(biāo)皆為0。
範(fàn)例二:
RRNCF REG, F ;將REG暫存器的值向右旋轉(zhuǎn),並將結(jié)果存回REG暫存器中。
執(zhí)行前:
REG = 0000 0001 ;REG暫存器的值為00000001。
W = 0000 0000 ;W暫存器的值為00000000。
N = Z = 0 ;假設(shè)狀態(tài)暫存器的皆為0。
執(zhí)行後:
REG = 0000 0001 ;REG暫存器的值為00000001。
W = 0000 0000 ;W暫存器的值為00000000。
Z = 1 ;由於向右移後結(jié)果為0,因此零位旗號(hào)Z為1。
N = 0 ;負(fù)號(hào)旗標(biāo)N為0。
指令名稱:SETF
原 意:Set f
語 法:[label] SETF f
運(yùn) 算 元:
運(yùn)算說明:0xFF -> f
影響旗標(biāo):無
指令說明:將REG暫存內(nèi)的值全部設(shè)定為1。
類 別:資料轉(zhuǎn)移指令。
組 別:位元設(shè)定指令。
範(fàn)例一:
SETF REG ;將REG暫存器的值全部設(shè)定為1。
執(zhí)行前:
REG = 1110 0110 ;REG暫存器的值為11100110。
執(zhí)行後:
REG = 1111 1111 ;REG暫存器的值為11111111。
指令名稱:SLEEP
原 意:Enter SLEEP Mode
語 法:[label] SLEEP
運(yùn) 算 元:
運(yùn)算說明:0x00 -> WDT,
0 -> WDT後除器,
,
影響旗標(biāo):
指令說明:CPU進(jìn)入睡眠狀態(tài)。
類 別:程式流程控制指令。
組 別:程式流程指令。
範(fàn)例一:
SLEEP ;設(shè)定CPU進(jìn)入睡眠狀態(tài)。
執(zhí)行前:
;
與
的值未知。
執(zhí)行後:
;
暫存器的值為1。
;
暫存器的值為0。
指令名稱:SUBFWB
原 意:Subtract f From W with Borrow
語 法:[label] SUBFWB f, d, a
運(yùn) 算 元:
運(yùn)算說明:(W) – (f) – () -> dest
影響旗標(biāo):N, OV, C, DC, Z
指 令說明:W累加器的值減去f暫存器與進(jìn)位旗標(biāo)C,若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉(zhuǎn)移指令。
組 別:數(shù)學(xué)運(yùn)算減法指令。
範(fàn)例一:
SUBFWB REG, F, 0 ;W累加器的值減去REG暫存器與進(jìn)位旗標(biāo)C,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 3 ;REG暫存器的值為3。
W = 2 ;W累加器的值為2。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
執(zhí)行後:
REG = 0xFF ;REG暫存器的值為0xFF。
W = 2 ;W累加器的值為2。
C = 0 ;進(jìn)位旗標(biāo)C的值為0。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 1 ;負(fù)號(hào)旗號(hào)N的值為1。
²運(yùn)算結(jié)果為負(fù)。
範(fàn)例二:
SUBFWB REG, W, 0 ;W累加器的值減去REG暫存器與進(jìn)位旗標(biāo)C,並將運(yùn)算後的結(jié)果放到W累加器中。
執(zhí)行前:
REG = 2 ;REG暫存器的值為2。
W = 5 ;W累加器的值為5。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
執(zhí)行後:
REG = 2 ;REG暫存器的值為2。
W = 3 ;W累加器的值為3。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為正。
範(fàn)例三:
SUBFWB REG, F, 0 ;W累加器的值減去REG暫存器與進(jìn)位旗標(biāo)C,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 1 ;REG暫存器的值為1。
W = 2 ;W累加器的值為2。
C = 0 ;進(jìn)位旗標(biāo)C的值為0。
執(zhí)行後:
REG = 0 ;REG暫存器的值為0。
W = 2 ;W累加器的值為2。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 1 ;零號(hào)旗號(hào)Z的值為1。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為零。
指令名稱:SUBLW
原 意:Subtract W From Literal
語 法:[label] SUBLW k
運(yùn) 算 元:
運(yùn)算說明:k – (W) -> W
影響旗標(biāo):N, OV, C, DC, Z
指令說明:將常數(shù)k與W累加器的值相減並將結(jié)果放回W累加器中。
類 別:立即常數(shù)定址法。
組 別:數(shù)學(xué)運(yùn)算減法指令。
範(fàn)例一:
SUBLW 0x02 ;將0x02與W累加器的值相減並將結(jié)果放回W累加器中。
執(zhí)行前:
W = 1 ;W累加器的值為1。
C = ? ;進(jìn)位旗標(biāo)C的值為未知。
執(zhí)行後:
W = 1 ;W累加器的值為1。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為正。
範(fàn)例二:
SUBLW 0x02 ;將0x02與W累加器的值相減並將結(jié)果放回W累加器中。
執(zhí)行前:
W = 2 ;W累加器的值為5。
C = ? ;進(jìn)位旗標(biāo)C的值未知。
執(zhí)行後:
W = 0 ;W累加器的值為0。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 1 ;零號(hào)旗號(hào)Z的值為1。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為零。
範(fàn)例三:
SUBLW 0x02 ;將0x02與W累加器的值相減並將結(jié)果放回W累加器中。
執(zhí)行前:
W = 3 ;W累加器的值為2。
C = ? ;進(jìn)位旗標(biāo)C的值未知。
執(zhí)行後:
W = 0xFF ;W累加器的值為0xFF。
C = 0 ;進(jìn)位旗標(biāo)C的值為0。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 1 ;負(fù)號(hào)旗號(hào)N的值為1。
²運(yùn)算結(jié)果為負(fù)。
指令名稱:SUBWF
原 意:Subtract W From f
語 法:[label] SUBWF f, d, a
運(yùn) 算 元:
運(yùn)算說明:(f) – (W) -> dest
影響旗標(biāo):N, OV, C, DC, Z
指 令說明:將暫存器f的值減掉W累加器的值,若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉(zhuǎn)移指令。
組 別:數(shù)學(xué)運(yùn)算減法指令。
範(fàn)例一:
SUBWF REG, F, 0 ;REG暫存器的值減去W累加器的值,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 3 ;REG暫存器的值為3。
W = 2 ;W累加器的值為2。
C = ? ;進(jìn)位旗標(biāo)C的值未知。
執(zhí)行後:
REG = 1 ;REG暫存器的值為1。
W = 2 ;W累加器的值為2。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為正。
範(fàn)例二:
SUBWF REG, W, 0 ;REG暫存器的值減去W累加器的值,並將運(yùn)算後的結(jié)果放到W累加器中。
執(zhí)行前:
REG = 2 ;REG暫存器的值為2。
W = 2 ;W累加器的值為2。
C = ? ;進(jìn)位旗標(biāo)C的值未知。
執(zhí)行後:
REG = 2 ;REG暫存器的值為2。
W = 0 ;W累加器的值為0。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 1 ;零號(hào)旗號(hào)Z的值為1。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為零。
範(fàn)例三:
SUBWF REG, F, 0 ;REG暫存器的值減去W累加器的值,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 1 ;REG暫存器的值為1。
W = 2 ;W累加器的值為2。
C = ? ;進(jìn)位旗標(biāo)C的值未知。
執(zhí)行後:
REG = 0xFF ;REG暫存器的值為0xFF。
W = 2 ;W累加器的值為2。
C = 0 ;進(jìn)位旗標(biāo)C的值為0。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 1 ;負(fù)號(hào)旗號(hào)N的值為1。
²運(yùn)算結(jié)果為負(fù)。
指令名稱:SUBWFB
原 意:Subtract W From f with Borrow
語 法:[label] SUBFWB f, d, a
運(yùn) 算 元:
運(yùn)算說明:(f) – (W) – () -> dest
影響旗標(biāo):N, OV, C, DC, Z
指 令說明:f暫存器的值減去W累加器與進(jìn)位旗標(biāo)C,若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉(zhuǎn)移指令。
組 別:數(shù)學(xué)運(yùn)算減法指令。
範(fàn)例一:
SUBWFB REG, F, 0 ;REG暫存器的值減去W累加器與進(jìn)位旗標(biāo)C,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 3 ;REG暫存器的值為3。
W = 2 ;W累加器的值為2。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
執(zhí)行後:
REG = 1 ;REG暫存器的值為1。
W = 2 ;W累加器的值為2。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為正。
範(fàn)例二:
SUBWFB REG, W, 0 ;REG暫存器的值減去W累加器與進(jìn)位旗標(biāo)C,並將運(yùn)算後的結(jié)果放到W累加器中。
執(zhí)行前:
REG = 2 ;REG暫存器的值為2。
W = 2 ;W累加器的值為2。
C = 0 ;進(jìn)位旗標(biāo)C的值為0。
執(zhí)行後:
REG = 2 ;REG暫存器的值為2。
W = 0 ;W累加器的值為0。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
Z = 1 ;零號(hào)旗號(hào)Z的值為1。
N = 0 ;負(fù)號(hào)旗號(hào)N的值為0。
²運(yùn)算結(jié)果為零。
範(fàn)例三:
SUBWFB REG, F, 0 ;REG暫存器的值減去W累加器與進(jìn)位旗標(biāo)C,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 1 ;REG暫存器的值為1。
W = 2 ;W累加器的值為2。
C = 1 ;進(jìn)位旗標(biāo)C的值為1。
執(zhí)行後:
REG = 0xFF ;REG暫存器的值為0xFF。
W = 2 ;W累加器的值為2。
C = 0 ;進(jìn)位旗標(biāo)C的值為0。
Z = 0 ;零號(hào)旗號(hào)Z的值為0。
N = 1 ;負(fù)號(hào)旗號(hào)N的值為1。
運(yùn)算結(jié)果為負(fù)。
指令名稱:SWAPF
原 意:Swap f
語 法:[label] SWAPF f, d, a
運(yùn) 算 元:
運(yùn)算說明:(f < 3:0 >) -> dest <7:4>,
(f < 7:4 >) -> dest <3:0>
影響旗標(biāo):無
指 令說明:將f暫存器內(nèi)的高4位元與低4位元做交換;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉(zhuǎn)移指令。
組 別:資料交換指令。
範(fàn)例一:
SWAPF REG, F, 0 ;REG暫存器的值高4位元與低4位元做交換,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
REG = 0x53 ;REG暫存器的值為0x53。
執(zhí)行後:
REG = 0x35 ;REG暫存器的值為0x35。
指令名稱:TBLRD
原 意:Table Read
語 法:[label] TBLRD (*; *+, *-, +*)
運(yùn) 算 元:無
運(yùn)算說明:
uIf TBLRD *,
(Prog. Mem (TBLPTR)) -> TABLAT;
TBLPTR No Change;
uIf TBLRD *+,
(Prog. Mem (TBLPTR)) -> TABLAT;
(TBLPTR) +1 ->TBLPTR;
uIf TBLRD *-,
(Prog. Mem (TBLPTR)) -> TABLAT;
(TBLPTR) -1 ->TBLPTR;
uIf TBLRD +*,
(TBLPTR) +1 ->TBLPTR,
(Prog. Mem (TBLPTR)) -> TABLAT.
影響旗標(biāo):無
指令說明:TBLRD是一個(gè)程式記憶體讀取的指令,它具有以下4種用法:
1.TBLRD * :
以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中。
2.TBLRD *+ :
以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動(dòng)加1。
3.TBLRD *- :
以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動(dòng)減1。
4.TBLRD +* :
先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中。
類 別:程式記憶體讀寫指令。
組 別:資料讀取指令。
範(fàn)例一:
TBLRD *+ ;以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動(dòng)加1。
執(zhí)行前:
TABLAT = 0x55 ;TABLAT暫存器的值為0x55。
TBLPTR = 0x00A356 ;TBLPTR暫存器的值為0x00A356。
MEMORY (0x00A356) = 0x34
;記憶體位置0x00A356內(nèi)的值為0x34。
執(zhí)行後:
TABLAT = 0x34 ;TABLAT暫存器的值為0x34。
TBLPTR = 0x00A357 ;TBLPTR暫存器的值為0x00A357。
範(fàn)例二:
TBLRD +* ;以TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中。
執(zhí)行前:
TABLAT = 0xAA ;TABLAT暫存器的值為0xAA。
TBLPTR = 0x01A357 ;TBLPTR暫存器的值為0x01A357。
MEMORY (0x01A357) = 0x12
;記憶體位置0x01A357內(nèi)的值為0x12。
MEMORY (0x01A358) = 0x34
;記憶體位置0x01A358內(nèi)的值為0x34。
執(zhí)行後:
TABLAT = 0x34 ;TABLAT暫存器的值為0x34。
TBLPTR = 0x01A358 ;TBLPTR暫存器的值為0x01A358。
指令名稱:TBLWT
原 意:Table Write
語 法:[label] TBLWT (*; *+, *-, +*)
運(yùn) 算 元:無
運(yùn)算說明:
uIf TBLWT *,
(TABLAT) -> Holding Register;
TBLPTR No Change;
uIf TBLWT *+,
(TABLAT) -> Holding Register;
(TBLPTR) +1 -> TBLPTR;
uIf TBLWT *-,
(TABLAT) -> Holding Register;
(TBLPTR) -1 -> TBLPTR;
uIf TBLWT +*,
(TBLPTR) +1 -> TBLPTR;
(TABLAT) -> Holding Register;
影響旗標(biāo):無
指令說明:TBLWT是一個(gè)程式記憶體寫入的指令,它具有以下4種用法:
1.TBLWT *:
以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中。
2.TBLWT *+:
以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動(dòng)加1。
3.TBLWT *-:
以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動(dòng)減1。
4.TBLWT +*:
先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中。
類 別:程式記憶體讀寫指令。
組 別:資料寫入指令。
範(fàn)例一:
TBLWT *+ ;以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動(dòng)加1。
執(zhí)行前:
TABLAT = 0x55 ;TABLAT暫存器的值為0x55。
TBLPTR = 0x00A356 ;TBLPTR暫存器的值為0x00A356。
Holding Register (0x00A356) = 0xFF
;記憶體位置0x00A356內(nèi)的值為0xFF。
執(zhí)行後:
TABLAT = 0x55 ;TABLAT暫存器的值為0x55。
TBLPTR = 0x00A357 ;TBLPTR暫存器的值為0x00A357。
Holding Register (0x00A356) = 0x55
;記憶體位置0x00A356內(nèi)的值為0x55。
範(fàn)例二:
TBLWT +* ;以TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中。
執(zhí)行前:
TABLAT = 0x34 ;TABLAT暫存器的值為0x34。
TBLPTR = 0x01389A ;TBLPTR暫存器的值為0x01389A。
Holding Register (0x01389A) = 0xFF
;記憶體位置0x01389A內(nèi)的值為0xFF。
Holding Register (0x01389B) = 0xFF
;記憶體位置0x01389B內(nèi)的值為0xFF。
執(zhí)行後:
TABLAT = 0x34 ;TABLAT暫存器的值為0x34。
TBLPTR = 0x01389B ;TBLPTR暫存器的值為0x01389A。
Holding Register (0x01389A) = 0xFF
;記憶體位置0x01389A內(nèi)的值為0xFF。
Holding Register (0x01389B) = 0x34
;記憶體位置0x01389B內(nèi)的值為0x34。
指令名稱:TSTFSZ
原 意:Test f, Skip if 0
語 法:[label] TSTFSZ f, a
運(yùn) 算 元:
運(yùn)算說明:Skip if f = 0
影響旗標(biāo):無
指令說明:假設(shè)暫存器f內(nèi)的值等於0,則跳過下一個(gè)指令;若是暫存器f內(nèi)的值不等於0,則執(zhí)行下一個(gè)指令。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:程式流程控制指令。
組 別:位元比較指令。
範(fàn)例一:
HERE TSTFSZ REG, 1 ;若是暫存器REG內(nèi)的值等於0,則執(zhí)行GOTO N2這一行指令;若是暫存器REG內(nèi)的值不等於0,則執(zhí)行GOTO N1這一行指令。
NZERO GOTO N1 ;
ZERO GOTO N2 ;
執(zhí)行前:
PC = HERE Address ;目前程式計(jì)數(shù)器的值在HERE這行指令的位址。
執(zhí)行後:
If REG = 0x00 ;若是暫存器REG內(nèi)的值等於0。
PC = GOTO N2 ;程式計(jì)數(shù)器的值會(huì)跳到在GOTO N2這行指令的位址。
If REG 0x00 ;若是暫存器REG內(nèi)的值不等於0。
PC = GOTO N1 ;程式計(jì)數(shù)器的值會(huì)跳到在GOTO N1這行指令的位址。
指令名稱:XORLW
原 意:Exclusive OR Literal With W
語 法:[label] XORLW k
運(yùn) 算 元:
運(yùn)算說明:(W) .XOR. k -> W
影響旗標(biāo):N, Z
指令說明:將常數(shù)k與W累加器的值做互斥或 (XOR) 運(yùn)算,並將結(jié)果放回W累加器中。
類 別:立即常數(shù)定址法。
組 別:邏輯運(yùn)算XOR指令。
範(fàn)例一:
XORLW 0xAF ;將常數(shù)k與W累加器的值做互斥或 (XOR) 運(yùn)算,並將結(jié)果放回W累加器中。
執(zhí)行前:
W = 0xB5 ;W累加器的值為0xB5。
執(zhí)行後:
W = 0x1A ;W累加器的值為0x1A。
Z = N = 0 ;零號(hào)旗標(biāo)Z與負(fù)號(hào)旗標(biāo)N皆等於0。
範(fàn)例二:
XORLW 0x40 ;將常數(shù)k與W累加器的值做互斥或 (XOR) 運(yùn)算,並將結(jié)果放回W累加器中。
執(zhí)行前:
W = 0xB5 ;W累加器的值為0xB5。
執(zhí)行後:
W = 0xF5 ;W累加器的值為0xF5。
N = 1 ;負(fù)號(hào)旗標(biāo)N等於1。
Z = 0 ;零號(hào)旗標(biāo)Z等於0。
範(fàn)例三:
XORLW 0xB5 ;將常數(shù)k與W累加器的值做互斥或 (XOR) 運(yùn)算,並將結(jié)果放回W累加器中。
執(zhí)行前:
W = 0xB5 ;W累加器的值為0xB5。
執(zhí)行後:
W = 0x00 ;W累加器的值為0x00。
N = 0 ;負(fù)號(hào)旗標(biāo)N等於0。
Z = 1 ;零號(hào)旗標(biāo)Z等於1。
指令名稱:XORWF
原 意:Exclusive OR W With f
語 法:[label] XORWF f, d, a
運(yùn) 算 元:
運(yùn)算說明:(W) .XOR. (f) -> dest
影響旗標(biāo):N, Z
指 令說明:將常數(shù)k與W累加器的值做互斥或 (XOR) 運(yùn)算,若d = 0,則運(yùn)算後的結(jié)果放到W累加器中;若d = 1,則運(yùn)算後的結(jié)果放到f暫存器中,存放運(yùn)算結(jié)果的暫存器若是存放到W累加器中,我們也可以寫成W (表W累加器) ;若存放運(yùn)算結(jié)果的暫存器若是存放到暫存器中,我們也可以寫成F (表暫存器) 。若a = 0,則運(yùn)算後的結(jié)果放到目前RAM的位址中;若a = 1,則運(yùn)算後的結(jié)果放到BSR暫存器所指定的RAM位址中。
類 別:資料轉(zhuǎn)移指令。
組 別:邏輯運(yùn)算XOR指令。
範(fàn)例一:
XORWF REG,f ;REG暫存器的值與W累加器做互斥或 (XOR) 運(yùn)算,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
W = 0xB5 ;W累加器的值為0xB5。
REG = 0xAF ;REG暫存器的值為0xAF。
執(zhí)行後:
W = 0xB5 ;W累加器的值為0xB5。
REG = 0x1A ;REG暫存器的值為0x1A。
Z = N = 0 ;零號(hào)旗標(biāo)Z與負(fù)號(hào)旗標(biāo)N皆等於0。
範(fàn)例二:
XORWF REG,W ;REG暫存器的值與W累加器做互斥或 (XOR) 運(yùn)算,並將運(yùn)算後的結(jié)果放到REG暫存器中。
執(zhí)行前:
W = 0xB5 ;W累加器的值為0xB5。
REG = 0xAF ;REG暫存器的值為0xAF。
執(zhí)行後:
W = 0x1A ;W累加器的值為0x1A。
REG = 0xAF ;REG暫存器的值為0xAF。
Z = N = 0 ;零號(hào)旗標(biāo)Z與負(fù)號(hào)旗標(biāo)N皆等於0。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |