PIC指令 指令 | 指令說明 | 影響旗號 | 參考說明頁數(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 | ![]() | 將 內(nèi)的資料搬到 中。 | 無 | 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一起做左移動作,並將結(jié)果放至W或f。 | C, Z, N | 80 | RLNCF | f, d, a | 將f內(nèi)的值做左移動作,並將結(jié)果放至W或f。 | Z, N | 82 | RRCF | f, d, a | 將f內(nèi)的值與C一起做右移動作,並將結(jié)果放至W或f。 | C, Z, N | 84 | RRNCF | f, d, a | 將f內(nèi)的值做右移動作,並將結(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位元對調(diào),並將結(jié)果放至W或f。 | 無 | 98 | TSTFSZ | f, a | 測試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 | 測試f內(nèi)某個(gè)位元 (Bit) 的值是否等於0,若為0則跳過下一個(gè)指令。 | 無 | 25 | BTFSS | f, b, a | 測試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ù)) 指令 | 指令說明 | 影響旗號 | 參考說明頁數(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ù)) 指令 | 指令說明 | 影響旗號 | 參考說明頁數(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 ( ) ,而主程式由目前PC值開始執(zhí)行。 | 無 | 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)自動加1。 | 無 | 99 | TBLRD*- | | 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動減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)自動加1。 | 無 | 102 | TBLWT*- | | 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動減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)例一: ADDLW 0x11 ;將0x11的值與W累加器相加,結(jié)果放回W累加器中。執(zhí)行前: W = 0x1F ;假設(shè)執(zhí)行前W累加器的值為0x1F。N = OV = C = DC = Z = 0 ;假設(shè)執(zhí)行前狀態(tài)暫存器的值皆為0。執(zhí)行後: W = 0x30 ;執(zhí)行後W累加器的值為0x30。N = OV = C = 0,DC = 1 ;半進(jìn)位旗標(biāo)等於1,因?yàn)榈退奈辉嗉又嵊羞M(jìn)位的情形發(fā)生,因此半進(jìn)位旗標(biāo)DC等於1其餘旗標(biāo)狀態(tài)不變。
範(fàn)例二: ADDLW 0x11 ;將0x11的值與W累加器相加,結(jié)果放回W累加器中。執(zhí)行前: W = 0x7F ;假設(shè)執(zhí)行前W累加器的值為0x7F。N = OV = C = DC = Z = 0 ;假設(shè)執(zhí)行前狀態(tài)暫存器的值皆為0。執(zhí)行後: W = 0x90 ;執(zhí)行後W累加器的值為0x90。N
= OV = DC = 1,Z = C = 0
;半進(jìn)位旗標(biāo)DC等於1,因?yàn)榈退奈辉嗉俞嵊羞M(jìn)位情形發(fā)生;溢位旗標(biāo)OV等於1,因?yàn)閮蓴?shù)相加後第7個(gè)位元有進(jìn)位情形發(fā)生;負(fù)號旗標(biāo)N等於1,因?yàn)閮蓴?shù)
相加後結(jié)果大於127,因?yàn)槭褂?的補(bǔ)數(shù)作運(yùn)算,所以結(jié)果大於127便算是負(fù)號。範(fàn)例三: ADDLW 0x11 ;將0x11的值與W累加器相加,結(jié)果放回W累加器中。執(zhí)行前: W = 0x9F ;假設(shè)執(zhí)行前W累加器的值為0x9F。N = OV = C = DC = Z = 0 ;假設(shè)執(zhí)行前狀態(tài)暫存器的值皆為0。執(zhí)行後: W = 0xB0 ;執(zhí)行後W累加器的值為0xB0。N
= DC = 1,OV = Z = C = 0
;半進(jìn)位旗標(biāo)DC等於1,因?yàn)榈退奈辉嗉俞嵊羞M(jìn)位情形發(fā)生;負(fù)號旗標(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)例四: ADDLW 0x01 ;將0x01的值與W累加器相加,結(jié)果放回W累加器中。執(zhí)行前: W = 0xFF ;假設(shè)執(zhí)行前W累加器的值為0xFF。N = OV = C = DC = Z = 0 ;假設(shè)執(zhí)行前狀態(tài)暫存器的值皆為0。執(zhí)行後: W = 0x00 ;執(zhí)行後W累加器的值為0x00,因?yàn)槔奂悠鳛? bits的暫存器,因此相加後結(jié)果超過255 (0xFF) 便會歸0。 N
= OV = 0,C = DC = Z = 1 ;由於兩數(shù)相加後結(jié)果超過255 (0xFF)
,因此進(jìn)位旗標(biāo)C會被設(shè)定為1;又相加後W累加器的值為0x00,因此零位旗標(biāo)Z會被設(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)例一: ADDWF REG, 0, 0 ;將暫存器 (REG) 的值與W累加器的值相加,結(jié)果放回W累加器中。
執(zhí)行前: W = 0x11 ;假設(shè)執(zhí)行前W累加器的值為0x11。REG = 0x0F ;假設(shè)執(zhí)行前REG暫存器的值為0x0F。N = OV = C = DC = Z = 0 ;假設(shè)執(zhí)行前狀態(tài)暫存器的值皆為0。執(zhí)行後: W = 0x20REG = 0x0FN = OV = C = Z = 0,DC = 1Ø結(jié)果放回W累加器中。 範(fàn)例二: ADDWF REG, W, 0執(zhí)行前: W = 0x17REG = 0xC2N = OV = C = DC = Z = 0執(zhí)行後: W = 0xD9REG = 0xC2N = OV = C = DC = Z = 0Ø結(jié)果放回W累加器中。 範(fàn)例三: ADDWF REG, F, 1 (if BSR = 0x01) 執(zhí)行前: W = 0x17REG = 0xC2N = OV = C = DC = Z = 0執(zhí)行後: W = 0x17REG = 0xC2RAM位址100 = 0xD9 N = OV = C = DC = Z = 0 Ø結(jié)果放在BSR暫存器所指定的位址中。 範(fàn)例四: ADDWF REG, W 執(zhí)行前: W = 0x17REG = 0xC2N = OV = C = DC = Z = 0執(zhí)行後: W = 0xD9REG = 0xC2N = OV = C = DC = Z = 0Ø結(jié)果放回W累加器中。 範(fàn)例五: ADDWF REG, F 執(zhí)行前: W = 0x01REG = 0x10N = OV = C = DC = Z = 0執(zhí)行後: W = 0x01REG = 0x11N = OV = C = DC = Z = 0Ø結(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)例一: ADDWFC REG, 0, 1執(zhí)行前: W = 0x4DREG = 0x02Carry=1N = OV = DC = Z = 0執(zhí)行後: W = 0x50REG = 0x02Carry=0N = OV = DC = Z = 0Ø結(jié)果放回W累加器中,進(jìn)位旗標(biāo)C = 0。 範(fàn)例二: ADDWFC REG, F, 0執(zhí)行前: W = 0x4DREG = 0x02Carry=1N = OV = DC = Z = 0執(zhí)行後: W = 0x4DREG = 0x50Carry=0N = OV = DC = Z = 0Ø結(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)例一: ANDLW 0x5F執(zhí)行前: W = 0xA3 = 10100011N = Z = 0執(zhí)行後: ![]()
W = 0x03 N = Z = 0
範(fàn)例二: ANDLW 0x00執(zhí)行前: W = 0x5F = 01011111N = Z = 0執(zhí)行後: ![]()
W = 0x00 N = 0;Z=1
指令名稱: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)例一: ANDWF REG, 0, 0執(zhí)行前: W = 0x17 REG = 0xC2N = Z = 0
執(zhí)行後: ![]()
W = 0x02 REG = 0xC2N = Z = 0Ø結(jié)果放回W累加器中。 範(fàn)例二: ANDWF REG, F執(zhí)行前: W = 0x01 REG = 0xFFN = Z = 0執(zhí)行後: ![]()
W = 0x01 REG = 0x01N = Z = 0Ø結(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)例一: Here BC Lab1 ;若是進(jìn)位旗標(biāo)C等於1就跳到Lab1的位址,若是進(jìn)位旗標(biāo)C不等於1則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址C = 1執(zhí)行後: PC = 跳到Lab1的位址 C = 1
指令名稱:BCF 原 意:Bit Clear f 語 法:[label] BCF f, b 運(yùn) 算 元:![]() ![]()
運(yùn)算說明:0 -> f < b > 影響旗標(biāo):無 指令說明:將暫存器中的某一個(gè)位元清除為0。 類 別:位元定址指令。 組 別:單一位元清除指令。 範(fàn)例一: BCF REG,2 ;將REG暫存器的第2個(gè)位元清除為0。執(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ù)號旗標(biāo)N等於1時(shí),就跳到指定的位址。 類 別:程式流程控制指令。 組 別:比較跳躍指令。 範(fàn)例一: Here BN Lab1 ;若是負(fù)號旗標(biāo)N等於1就跳到Lab1的位址,若是負(fù)號旗標(biāo)N不等於1則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址N = 1執(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)例一: Here BC Lab1 ;若是進(jìn)位旗標(biāo)C等於0就跳到Lab1的位址,若是進(jìn)位旗標(biāo)C不等於0則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址C = 0執(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ù)號旗標(biāo)N等於0時(shí),就跳到指定的位址。 類 別:程式流程控制指令。 組 別:比較跳躍指令。 範(fàn)例一: Here BN Lab1 ;若是負(fù)號旗標(biāo)N等於0就跳到Lab1的位址,若是負(fù)號旗標(biāo)N不等於0則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址N = 0執(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)例一: Here BNOV Lab1 ;若是溢位旗標(biāo)OV等於0就跳到Lab1的位址,若是溢位旗標(biāo)OV不等於0則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址OV = 0執(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)例一: Here BNZ Lab1 ;若是零位旗標(biāo)Z等於0就跳到Lab1的位址,若是零位旗標(biāo)Z不等於0則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址Z = 0執(zhí)行後: PC = 跳到Lab1的位址 Z = 0
指令名稱:BRA 原 意:Unconditional Branch 語 法:[label] BRA Label name 運(yùn) 算 元:![]() 運(yùn)算說明:Jump to label name. 影響旗標(biāo):無 指令說明:無條件跳躍至指定的位址。 類 別:程式流程控制指令。 組 別:比較跳躍指令。 範(fàn)例一: Here BRA Lab1 ;跳到Lab1的位址。執(zhí)行前: PC = 在目前Here的位址執(zhí)行後: PC = 跳到Lab1的位址
指令名稱:BSF 原 意:Bit Set f 語 法:[label] BSF f, b 運(yùn) 算 元:![]() ![]()
運(yùn)算說明:1 -> f < b > 影響旗標(biāo):無 指令說明:將暫存器中的某一個(gè)位元設(shè)定為1。 類 別:位元定址指令。 組 別:單一位元設(shè)定指令。 範(fàn)例一: BSF REG,2 ;將REG暫存器的第2個(gè)位元設(shè)定為1。執(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í)行。 類 別:程式流程控制指令。 組 別:單一位元比較指令。 範(fàn)例一: Here BTFSC REG,2 ;比較REG暫存器的第2個(gè)位元是否為0,假設(shè)是0則執(zhí)行Here2這行指令,若不為0則執(zhí)行Here1這行指令。Here1 ADDLW 0x01 ;不為0則執(zhí)行Here1這行指令。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í)行。 類 別:程式流程控制指令。 組 別:單一位元比較指令。 範(fàn)例一: Here BTFSS REG,2 ;比較REG暫存器的第2個(gè)位元是否為1,假設(shè)是1則執(zhí)行Here2這行指令,若不為1則執(zhí)行Here1這行指令。Here1 ADDLW 0x01 ;不為1則執(zhí)行Here1這行指令。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ù)。 類 別:位元定址指令。 組 別:單一位元邏輯指令。 範(fàn)例一: BTG REG,2 ;將REG暫存器的第2個(gè)位元取補(bǔ)數(shù)。執(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)例一: Here BOV Lab1 ;若是溢位旗標(biāo)OV等於1就跳到Lab1的位址,若是溢位旗標(biāo)OV不等於1則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址OV = 1執(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)例一: Here BZ Lab1 ;若是零位旗標(biāo)Z等於1就跳到Lab1的位址,若是零位旗標(biāo)Z不等於1則程式往下執(zhí)行。執(zhí)行前: PC = 在目前Here的位址Z = 1執(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)例一: Here CALL Lab1 ;呼叫Lab1的副程式。執(zhí)行前: PC = 在目前Here的位址執(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)例一: CLRF REG ;將REG暫存器的值全部清為0。執(zhí)行前: REG = 0xF5 ;REG暫存器的值為0xF5。Z = 0 ;零位旗標(biāo)Z等於0。執(zhí)行後: REG = 0x00 ;REG暫存器的值為0x00。Z = 1 ;零位旗標(biāo)Z等於1。
指令名稱:CLRWDT 原 意:Clear Watchdog Timer 語 法:[label] CLRWDT 運(yùn) 算 元:無 運(yùn)算說明:0x00 -> WDT, 0x00 -> WDT postscaler, , ![]()
影響旗標(biāo): , ![]() 指令說明:將看門狗計(jì)時(shí)器的值全部清除為0。 類 別:程式流程控制指令。 組 別:清除指令。 範(fàn)例一: CLRWDT ;將看門狗計(jì)時(shí)器的值全部清除為0。執(zhí)行前: WDT Count = ? ;看門狗計(jì)時(shí)器的值未知?執(zhí)行後: WDT Count = 0x00 ;看門狗計(jì)時(shí)器的值為0x00。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)例一: COMF REG,0 ;將暫存器REG的值取1的補(bǔ)數(shù),並將運(yùn)算結(jié)果放回W累加器中。執(zhí)行前: REG = 0x7F ;暫存器REG的值為0x7F。W = 0x00 ;W累加器的值為0x00。 Z = N = 0 ;零位旗標(biāo)Z與負(fù)號旗標(biāo)N皆為0。 執(zhí)行後: REG = 0x7F ;暫存器REG的值為0x7F。W = 0x80 ;W累加器的值為0x80。 Z = 0, N = 1 ;零位旗標(biāo)Z等於0,因?yàn)檫\(yùn)算結(jié)果不為0x00,而負(fù)號旗標(biāo)N為1,因?yàn)檫\(yùn)算結(jié)果後最高位元等於1。 範(fàn)例二: COMF REG,F ;將暫存器REG的值取1的補(bǔ)數(shù),並將運(yùn)算結(jié)果放回暫存器REG中。執(zhí)行前: REG = 0xFF ;暫存器REG的值為0xFF。W = 0x00 ;W累加器的值為0x00。 Z = N = 0 ;零位旗標(biāo)Z與負(fù)號旗標(biāo)N皆為0。 執(zhí)行後: REG = 0x00 ;暫存器REG的值為0x00。W = 0x00 ;W累加器的值為0x00。 Z = 1, N = 0 ;零位旗標(biāo)Z等於1,因?yàn)檫\(yùn)算結(jié)果為0x00,而負(fù)號旗標(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)例一: Lab CPFSEQ REG ;將暫存器REG的值與W累加器的值作比較。Here1 ADDLW 0x01 ;若暫存器REG的值與W累加器的值不相等,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若暫存器REG的值與W累加器的值相等,則執(zhí)行Here2這行指令。執(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)例一: Lab CPFSGT REG ;將暫存器REG的值與W累加器的值作比較。Here1 ADDLW 0x01 ;若暫存器REG的值與W累加器的值小於或是等於,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若是暫存器的值大於W累加器的值,則執(zhí)行Here2這行指令。執(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)例一: Lab CPFSLT REG ;將暫存器REG的值與W累加器的值作比較。Here1 ADDLW 0x01 ;若暫存器REG的值與W累加器的值大於或是等於,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若是暫存器的值小於W累加器的值,則執(zhí)行Here2這行指令。執(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)例一: DAW ;將W累加器的低四位元與高四位元分別調(diào)整成BCD碼。執(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)例二: DAW ;將W累加器的低四位元與高四位元分別調(diào)整成BCD碼。執(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)整後會有進(jìn)位的情形,所以進(jìn)位旗標(biāo)等於1。 範(fàn)例三: DAW ;將W累加器的低四位元與高四位元分別調(diào)整成BCD碼。執(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)整後會有進(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)例一: DECF REG, W ;將暫存器REG的值減1,並將結(jié)果放回W累加器。執(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ù)號旗標(biāo)N被設(shè)定為1。
範(fàn)例二: DECF REG, F ;將暫存器REG的值減1,並將結(jié)果放回暫存器REG。執(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ù)號的情形發(fā)生,因此狀態(tài)暫存器中的借位旗標(biāo)C等於1;再者高四位元與低四位元之間也沒有借位的情形發(fā)生,因此半借位旗標(biāo)DC
等於1;而將暫存器REG的值減1後結(jié)果為0,因此零位旗標(biāo)Z被設(shè)定為1。 範(fàn)例三: DECF REG, W ;將暫存器REG的值減1,並將結(jié)果放回W累加器。執(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ù)號的情形發(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就會被設(shè)定為1。 範(fàn)例四: DECF REG, 1 ;將暫存器REG的值減1,並將結(jié)果放回暫存器REG。執(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ù)號的情形發(fā)生,因此狀態(tài)暫存器中的借位旗標(biāo)C等於1;再者高四位元與低四位元之間也沒有借位的情形發(fā)生,因此半借位旗標(biāo)DC等於1。 備
註:在進(jìn)行DECF減法指令時(shí),若是在減1後有負(fù)號的情形發(fā)生,例如REG = 0x00減1變成REG =
0xFF,此時(shí)狀態(tài)暫存器中的負(fù)號旗標(biāo)N就會被設(shè)定為1,而借位旗標(biāo)C也會從1變成0,因?yàn)楸唤栉涣;再者是零位旗?biāo)Z,他要被設(shè)定為1的情形是發(fā)生在當(dāng)
結(jié)果等於0時(shí)才會發(fā)生,如例題二;其半借位旗標(biāo)DC等於1的情形會發(fā)生在高四位元與低四位元之間沒有借位的情形發(fā)生,若是有借位的情形發(fā)生DC就會等於
0,如例題三;最後是溢位旗標(biāo)OV被設(shè)定為1的情形會發(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)例一: Lab DECFSZ REG,W ;將暫存器REG的值減1後與0作比較,並將運(yùn)算結(jié)果放到W累加器中。Here1 ADDLW 0x01 ;若暫存器REG的值不等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若是暫存器的值等於0,則執(zhí)行Here2這行指令。執(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)例二: Lab DECFSZ REG,F ;將暫存器REG的值減1後與0作比較,並將運(yùn)算結(jié)果放到暫存器REG中。Here1 ADDLW 0x04 ;若暫存器REG的值不等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x15 ;若是暫存器的值等於0,則執(zhí)行Here2這行指令。執(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)例一: Lab DCFSNZ REG,F ;將暫存器REG的值減1後與0作比較,並將運(yùn)算結(jié)果放到暫存器REG中。Here1 ADDLW 0x01 ;若暫存器REG的值等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若是暫存器的值不等於0,則執(zhí)行Here2這行指令。執(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)例二: Lab DCFSNZ REG,W ;將暫存器REG的值減1後與0作比較,並將結(jié)果放到W累加器中。Here1 ADDLW 0x04 ;若暫存器REG的值等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x15 ;若是暫存器的值不等於0,則執(zhí)行Here2這行指令。執(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)例一: Lab GOTO Here1 ;無條件跳躍至Here1。 Here1 ADDLW 0x01 ;無條件跳躍至此。執(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)例一: INCF REG,F ;將暫存器REG的值加1,並將結(jié)果放回暫存器REG。執(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ù)號旗標(biāo)N與
溢位旗標(biāo)OV因?yàn)橄嗉又峤Y(jié)果為0,不符合負(fù)號旗標(biāo)N與溢位旗標(biāo)OV的定義,因此狀態(tài)步改變。 範(fàn)例二: INCF REG,W ;將暫存器REG的值加1,並將結(jié)果放回W累加器。執(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ù)號旗標(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就會被設(shè)定為1。 範(fàn)例三: INCF REG,F ;將暫存器REG的值加1,並將結(jié)果放回暫存器REG。執(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ù)號旗標(biāo)N被設(shè)定為1,因?yàn)槭褂?的補(bǔ)數(shù)加法。 範(fàn)例四: INCF REG,W ;將暫存器REG的值加1,並將結(jié)果放回暫存器REG。執(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)例一: Lab INCFSZ REG,W ;將暫存器REG的值加1後與0作比較,並將運(yùn)算結(jié)果放到W累加器中。Here1 ADDLW 0x01 ;若暫存器REG的值不等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若是暫存器的值等於0,則執(zhí)行Here2這行指令。執(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)例二: Lab DECFSZ REG,F ;將暫存器REG的值加1後與0作比較,並將運(yùn)算結(jié)果放到暫存器REG中。Here1 ADDLW 0x04 ;若暫存器REG的值不等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x15 ;若是暫存器的值等於0,則執(zhí)行Here2這行指令。執(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)例一: Lab INFSNZ REG,F ;將暫存器REG的值加1後與0作比較,並將運(yùn)算結(jié)果放到暫存器REG中。Here1 ADDLW 0x01 ;若暫存器REG的值等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x05 ;若是暫存器的值不等於0,則執(zhí)行Here2這行指令。執(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)例二: Lab INFSNZ REG,W ;將暫存器REG的值加1後與0作比較,並將運(yùn)算結(jié)果放到W累加器中。Here1 ADDLW 0x04 ;若暫存器REG的值等於0,則執(zhí)行Here1這行指令。Here2 ADDLW 0x15 ;若是暫存器的值不等於0,則執(zhí)行Here2這行指令。執(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)例一: IORLW 0x00 ;將暫存器REG的值與0作OR運(yùn)算,並將運(yùn)算結(jié)果放到W累加器中。執(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)例二: IORLW 0x80 ;將暫存器REG的值與0作OR運(yùn)算,並將運(yùn)算結(jié)果放到W累加器中。執(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ù)號旗標(biāo)N被設(shè)定為1。 範(fàn)例三: IORLW 0x05 ;將暫存器REG的值與0作OR運(yùn)算,並將運(yùn)算結(jié)果放到W累加器中。執(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ù)號旗標(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)例一: IORWF REG,W ;將暫存器REG的值與W累加器作OR運(yùn)算,並將運(yùn)算結(jié)果放到W累加器中。執(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)例二: IORWF REG,F ;將暫存器REG的值與W累加器作OR運(yùn)算,並將運(yùn)算結(jié)果放到暫存器REG中。執(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)例三: IORWF REG,F ;將暫存器REG的值與W累加器作OR運(yùn)算,並將運(yùn)算結(jié)果放到暫存器REG中。執(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ù)號旗標(biāo)N被設(shè)定為1。
指令名稱:LFSR 原 意:Load FSR 語 法:[label] LFSR f, d 運(yùn) 算 元:![]() ![]()
運(yùn)算說明:k -> FSRf 影響旗標(biāo):無 指
令說明:PIC單晶片對資料的定址方式除了有直接定址與立即定址外,還有一種就是間接定址,而間接定址所使用的基底暫存器就是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è)暫存器,而定義的記憶體位址長度可以到達(dá)12 bits,但是暫存器的長度只有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)例一: LFSR 0,0x423執(zhí)行前: FSR0H = ? FSR0L = ?
執(zhí)行後: FSR0H = 0x04 FSR0L = 0x23 範(fàn)例二: LFSR 2,0x3AB執(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)例一: MOVF REG,W ;將暫存器REG的值般到W累加器中。執(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,因此零號旗標(biāo)Z等於1。 範(fàn)例二: MOVF REG,F ;將暫存器REG的值般到暫存器REG中。執(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ù)號旗標(biāo)N等於1。 範(fàn)例三: MOVF REG,W ;將暫存器REG的值般到W累加器中。執(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ù)號旗標(biāo)N等於0;搬運(yùn)後的結(jié)果不是0,因此零號旗標(biāo)Z等於0。
指令名稱:MOVFF 原 意:Move f to f 語 法:[label] MOVF ![]() 運(yùn) 算 元:![]() ![]()
運(yùn)算說明:![]() 影響旗標(biāo):無 指令說明:將暫存器 的值般到暫存器 去。 類 別:資料轉(zhuǎn)移指令。 組 別:資料搬移指令。 範(fàn)例一: MOVFF REG1,REG2 ;將暫存器REG1的值般到暫存器REG2中。執(zhí)行前: REG1 = 0x03 ;暫存器REG1的值為0x03。 REG2 = 0x80 ;暫存器REG2的值為0x80。 執(zhí)行後: REG1 = 0x03 ;暫存器REG1的值為0x03。 REG2 = 0x03 ;暫存器REG2的值為0x03。 範(fàn)例二: MOVFF REG1,PORTB ;將暫存器REG1的值般到PORTB中。執(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)例一: MOVLB 1 ;將常數(shù)1般到暫存器BSR中。執(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)例一: MOVLW 0x40 ;將常數(shù)0x40搬到W累加器中。執(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)例一: MOVWF REG ;將W累加器中的值搬到暫存器REG去。執(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)例一: MULLW 0x10 ;將常數(shù)0x10與W累加器中的值相乘。執(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)例二: MULLW 0xC4 ;將常數(shù)0xC4與W累加器中的值相乘。執(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)例一: MULWF REG ;將暫存器REG的值與W累加器中的值相乘。執(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)例二: MULWF REG ;將暫存器REG的值與W累加器中的值相乘。執(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)例三: MULWF REG ;將暫存器REG的值與W累加器中的值相乘。執(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)例一: NEGF REG ;將暫存器REG的值取補(bǔ)數(shù)後加1。執(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)例二: NEGF REG ;將暫存器REG的值取補(bǔ)數(shù)後加1。執(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ù)號旗標(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)例三: NEGF REG ;將暫存器REG的值取補(bǔ)數(shù)後加1。執(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ù)號旗標(biāo)N被設(shè)定為1。
指令名稱:NOP 原 意:NO Operation 語 法:[label] NOP 運(yùn) 算 元:無 運(yùn)算說明:無 影響旗標(biāo):無 指令說明:不做任何運(yùn)算,只延遲一個(gè)指令時(shí)間。 類 別:程式流程控制指令。 組 別:空指令。 範(fàn)例一: NOP ;空指令。
指令名稱:POP 原 意:Pop Top of return Stack 語 法:[label] POP 運(yùn) 算 元:無 運(yùn)算說明:(TOS) -> bit bucket 影響旗標(biāo):無 指令說明:將堆疊的值取出來放在TOS這個(gè)暫存器中,TOS暫存器的資料長度21 bits,因此TOS暫存器被分為TOSL、TOSH與TOSU。 類 別:程式流程控制指令。 組 別:堆疊資料存取控制。範(fàn)例一: POP ;將堆疊最上層的資料取出來。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)例一: PUSH ;將下一個(gè)指令的位址置於堆疊上層。執(zhí)行前: TOS = 0x0031A2 ;堆疊暫存器的值為0x0031A2。 PC = 0x000124 ;目前程式計(jì)數(shù)器的值0x000124。 執(zhí)行後: TOS = 0x000126 ;堆疊暫存器的值為0x000126。 PC = 0x000126 ;目前程式計(jì)數(shù)器的值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)例一: Here RCALL Jump ;呼叫Jump副程式。執(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):全部歸零 指令說明:軟體重置命令。 類 別:程式流程控制指令。 組 別:程式重新啟動控制。 範(fàn)例一: RESET ;執(zhí)行軟體RESET。執(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)例一: RETFIE 1 ;離開中斷程式,並把WS暫存器的值搬到W;STATUSS暫存器的值搬到狀態(tài)暫存器;BSRS暫存器的值搬到BSR。執(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í)候,還會順便將8 bits的常數(shù)k載入到 ” W ” 累加器中,這個(gè)功能在查表法時(shí)會用到。 類 別:立即常數(shù)定址法。 組 別:流程控制。 範(fàn)例一: CALL TABLE ;呼叫TABLE副程式。、、、、 ;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)位旗號C清除為0。 RLCF REG, 0 ;將REG暫存器的值一起與進(jìn)位旗號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ù)號旗標(biāo)N為1;進(jìn)位旗號C為1。
範(fàn)例二: CLRC ;將進(jìn)位旗號C清除為0。 RLCF REG, F ;將REG暫存器的值一起與進(jìn)位旗號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,因此零位旗號Z為1;進(jìn)位旗號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ù)號旗標(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,因此零位旗號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)位旗號C一起向右旋轉(zhuǎn),並將結(jié)果存回W暫存器中。 執(zhí)行前: REG = 1110 0110 ;REG暫存器的值為11100110。 N = Z = 0 ;假設(shè)狀態(tài)暫存器中的負(fù)號旗標(biāo)N與零號旗標(biāo)Z皆為0。 C = 1 ;假設(shè)進(jìn)位旗號C為1。 執(zhí)行後: REG = 1110 0110 ;REG暫存器的值為11100110。 W = 1111 0011 ;W暫存器的值為11110011。 N = Z = C = 0 ;狀態(tài)暫存器中的負(fù)號旗標(biāo)N、零號旗標(biāo)Z與進(jìn)位旗號C結(jié)果皆為0。 範(fàn)例二: CLRC ;將進(jìn)位旗號C清除為0。 RRCF REG, F ;將REG暫存器的值一起與進(jìn)位旗號C一起向左旋轉(zhuǎn),並將結(jié)果存回REG暫存器中。 執(zhí)行前: REG = 0000 0001 ;REG暫存器的值為00000001。 W = 0000 0000 ;W暫存器的值為00000000。 N = Z = C = 0 ;狀態(tài)暫存器中的負(fù)號旗標(biāo)N、零號旗標(biāo)Z與進(jìn)位旗號C皆為0。 執(zhí)行後: REG = 0000 0000 ;REG暫存器的值為00000000。 W = 0000 0000 ;W暫存器的值為00000000。 Z = C = 1 ;由於向左移後結(jié)果為0,因此零位旗號Z為1;進(jìn)位旗號C為1。 N = 0 ;負(fù)號旗標(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ù)號旗標(biāo)N與零號旗標(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,因此零位旗號Z為1。 N = 0 ;負(fù)號旗標(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 ;零號旗號Z的值為0。 N = 1 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為1。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為1。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 1 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為1。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 1 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為1。 N = 0 ;負(fù)號旗號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 ;零號旗號Z的值為0。 N = 1 ;負(fù)號旗號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)自動加1。
3.TBLRD *- : 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),讀取程式記憶體之內(nèi)容至TABLAT暫存器中,然後將位址指標(biāo)自動減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)自動加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)自動加1。
3.TBLWT *-: 以TBLPTRH與TBLPTRL記錄器之內(nèi)容為位址指標(biāo),將TABLAT暫存器內(nèi)的值寫入程式記憶體中,然後將位址指標(biāo)自動減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)自動加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ù)器的值會跳到在GOTO N2這行指令的位址。 If REG 0x00 ;若是暫存器REG內(nèi)的值不等於0。 PC = GOTO N1 ;程式計(jì)數(shù)器的值會跳到在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 ;零號旗標(biāo)Z與負(fù)號旗標(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ù)號旗標(biāo)N等於1。 Z = 0 ;零號旗標(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ù)號旗標(biāo)N等於0。 Z = 1 ;零號旗標(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 ;零號旗標(biāo)Z與負(fù)號旗標(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 ;零號旗標(biāo)Z與負(fù)號旗標(biāo)N皆等於0。 |