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