pic18汇编指令集.docx

上传人:b****7 文档编号:11197060 上传时间:2023-02-25 格式:DOCX 页数:108 大小:128.75KB
下载 相关 举报
pic18汇编指令集.docx_第1页
第1页 / 共108页
pic18汇编指令集.docx_第2页
第2页 / 共108页
pic18汇编指令集.docx_第3页
第3页 / 共108页
pic18汇编指令集.docx_第4页
第4页 / 共108页
pic18汇编指令集.docx_第5页
第5页 / 共108页
点击查看更多>>
下载资源
资源描述

pic18汇编指令集.docx

《pic18汇编指令集.docx》由会员分享,可在线阅读,更多相关《pic18汇编指令集.docx(108页珍藏版)》请在冰豆网上搜索。

pic18汇编指令集.docx

pic18汇编指令集

PIC指令

指令

指令說明

影響旗號

參考說明頁數

位元組運算指令(BYTE-ORIENTEDFILEREGISTEROPERATIONS)

ADDWF

f,d,a

將W與f做相加,並將結果放至W或f。

C,DC,Z,OV,N

7

ADDWFC

f,d,a

將W與C做相加,並將結果放至W或f。

C,DC,Z,OV,N

10

ANDWF

f,d,a

將W與f做AND運算,並將結果放至W或f。

Z,N

14

CLRF

f,a

將f內的值都清為0。

Z

31

COMF

f,d,a

將f內的值取補數,並將結果放至W或f。

Z,N

33

CPFSEQ

f,a

若f與W的值相等,則跳過下一個指令。

35

CPFSGT

f,a

若f大於W,則跳過下一個指令。

36

CPFSLT

f,a

若f小於W,則跳過下一個指令。

37

DECF

f,d,a

將f內的值減1,並將結果放至W或f。

C,DC,Z,OV,N

40

DECFSZ

f,d,a

將f內的值減1,若為0則跳過下一個指令,並將結果放至W或f。

43

DCFSNZ

f,d,a

將f內的值減1,若不為0則跳過下一個指令,並將結果放至W或f。

45

INCF

f,d,a

將f內的值加1,並將結果放至W或f。

C,DC,Z,OV,N

48

INCFSZ

f,d,a

將f內的值加1,若為0則跳過下一個指令,並將結果放至W或f。

51

INFSNZ

f,d,a

將f內的值加1,若不為0則跳過下一個指令,並將結果放至W或f。

53

IORWF

f,d,a

將W與f做OR運算,並將結果放至W或f。

Z,N

57

MOVF

f,d,a

將f內的值搬到W或f。

Z,N

61

MOVFF

內的資料搬到

中。

63

MOVWF

f,a

將W內的值搬到f中。

66

MULWF

f,a

將W與f做相乘。

68

NEGF

f,a

將f內的值取2的補數。

C,DC,Z,OV,N

70

RLCF

f,d,a

將f內的值與C一起做左移動作,並將結果放至W或f。

C,Z,N

80

RLNCF

f,d,a

將f內的值做左移動作,並將結果放至W或f。

Z,N

82

RRCF

f,d,a

將f內的值與C一起做右移動作,並將結果放至W或f。

C,Z,N

84

RRNCF

f,d,a

將f內的值做右移動作,並將結果放至W或f。

Z,N

86

SETF

f,a

將f內的值設為0xFF。

88

SUBFWB

f,d,a

將W內的值減掉C及f,並將結果放至W或f。

C,DC,Z,OV,N

90

SUBWF

f,d,a

將W內的值減掉f,並將結果放至W或f。

C,DC,Z,OV,N

94

SUBWFB

f,d,a

將f內的值減掉W及C,並將結果放至W或f。

C,DC,Z,OV,N

96

SWAPF

f,d,a

將f內的值高4位元與低4位元對調,並將結果放至W或f。

98

TSTFSZ

f,a

測試f內的值是否等於0,若為0則跳過下一個指令。

105

XORWF

f,d,a

將W與f做XOR運算,並將結果放至W或f。

Z,N

108

位元運算指令(BIT-ORIENTEDFILEREGISTEROPERATIONS)

BCF

f,b,a

將f內某個位元(Bit)設定為0。

17

BSF

f,b,a

將f內某個位元(Bit)設定為1。

24

BTFSC

f,b,a

測試f內某個位元(Bit)的值是否等於0,若為0則跳過下一個指令。

25

BTFSS

f,b,a

測試f內某個位元(Bit)的值是否等於1,若為1則跳過下一個指令。

26

BTG

f,d,a

將f內某個位元(Bit)做NOT運算。

27

Note:

☞f表示暫存器。

☞d表示資料存放的地方,d=0表示存放在W累加器;d=1表示存放在f暫存器。

☞b表示暫存器的第b個位元。

☞k表示8位元常數。

☞a表示資料存放在那個記憶體位置,a=0表示放在目前的記憶體位置;a=1表示放在BSR暫存器內所指定的記憶體位置。

☞n表示程式記憶體的位址。

PIC18系列家族指令快速索引(續)

指令

指令說明

影響旗號

參考說明頁數

程式流程控制指令(CONTROLOPERATIONS)

BC

n

若C=1則跳到位址n去。

16

BN

n

若N=1則跳到位址n去。

18

BNC

n

若C=0則跳到位址n去。

19

BNN

n

若N=0則跳到位址n去。

20

BNOV

n

若OV=0則跳到位址n去。

21

BNZ

n

若Z=0則跳到位址n去。

22

BOV

n

若OV=1則跳到位址n去。

28

BRA

n

無條件跳到位址n去(

)。

23

BZ

n

若Z=1則跳到位址n去。

29

CALL

n,s

將下一個指令的PC值存到堆疊的最上層,並跳到位址n去(

)。

30

CLRWDT

將看門狗計時器清為0。

32

DAW

將W內的值做BCD調整。

38

GOTO

n

無條件跳到位址n去(

)。

47

NOP

空指令。

72

POP

將堆疊最上層的值取出來。

73

PUSH

將下一個指令的PC值存到堆疊的最上層。

74

RCALL

n

將下一個指令的PC值存到堆疊的最上層,並跳到位址n去(

)。

75

RESET

利用軟體將系統重置。

76

RETFIE

s

由中斷副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執行。

77

RETURN

s

由副程式返回主程式,並將堆疊最上層的值取出來放至PC中,而主程式由目前PC值開始執行。

79

SLEEP

進入睡眠狀態。

89

Note:

☞f表示暫存器。

☞d表示資料存放的地方,d=0表示存放在W累加器;d=1表示存放在f暫存器。

☞b表示暫存器的第b個位元。

☞k表示8位元常數。

☞n表示程式記憶體的位址。

☞a表示資料存放在那個記憶體位置,a=0表示放在目前的記憶體位置;a=1表示放在BSR暫存器內所指定的記憶體位置。

PIC18系列家族指令快速索引(續)

指令

指令說明

影響旗號

參考說明頁數

立即常數定址(LITERALOPERATIONS)

ADDLW

k

將常數k與W做相加。

C,DC,Z,OV,N

4

ANDLW

k

將常數k與W做AND運算。

Z,N

12

IORLW

k

將常數k與W做OR運算。

Z,N

55

LFSR

f,k

將常數k(12-bit)搬到第f個FSR暫存器去(f=0~2)。

59

MOVLB

k

將常數k搬到BSR暫存器去。

64

MOVLW

k

將常數k搬到W去。

65

MULLW

k

將常數k與W做乘法運算。

67

RETLW

k

將堆疊最上層的值取出來放至PC中,並將W的值設為k(

),而主程式由目前PC值開始執行。

78

SUBLW

k

將常數k與W做減法。

C,DC,Z,OV,N

92

XORLW

k

將常數k與W做XOR運算。

Z,N

106

程式記憶體讀寫指令(DATAMEMORY<->PROGRAMMEMORYOPERATIONS)

TBLRD*

以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。

99

TBLRD*+

以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動加1。

99

TBLRD*-

以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中,然後將位址指標自動減1。

99

TBLRD+*

先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,讀取程式記憶體之內容至TABLAT暫存器中。

99

TBLWT*

以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。

102

TBLWT*+

以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動加1。

102

TBLWT*-

以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中,然後將位址指標自動減1。

102

TBLWT+*

先將TBLPTRH與TBLPTRL記錄器先加1,然後以TBLPTRH與TBLPTRL記錄器之內容為位址指標,將TABLAT暫存器內的值寫入程式記憶體中。

102

Note:

☞f表示暫存器。

☞d表示資料存放的地方,d=0表示存放在W累加器;d=1表示存放在f暫存器。

☞b表示暫存器的第b個位元。

☞k表示8位元常數。

☞n表示程式記憶體的位址。

☞a表示資料存放在那個記憶體位置,a=0表示放在目前的記憶體位置;a=1表示放在BSR暫存器內所指定的記憶體位置。

指令名稱:

ADDLW

原意:

ADDliteraltoW

語法:

[label]ADDLWk

運算元:

運算說明:

(W)+K->W

影響旗標:

N,OV,C,DC,Z

指令說明:

W累加器中的值與k值相加,並將運算結果放回W累加器中。

類別:

立即常數定址法。

組別:

數學運算加法指令。

範例一:

ADDLW0x11;將0x11的值與W累加器相加,結果放回W累加器中。

執行前:

W=0x1F;假設執行前W累加器的值為0x1F。

N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。

執行後:

W=0x30;執行後W累加器的值為0x30。

N=OV=C=0,DC=1;半進位旗標等於1,因為低四位元相加之後有進位的情形發生,因此半進位旗標DC等於1其餘旗標狀態不變。

範例二:

ADDLW0x11;將0x11的值與W累加器相加,結果放回W累加器中。

執行前:

W=0x7F;假設執行前W累加器的值為0x7F。

N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。

執行後:

W=0x90;執行後W累加器的值為0x90。

N=OV=DC=1,Z=C=0;半進位旗標DC等於1,因為低四位元相加後有進位情形發生;溢位旗標OV等於1,因為兩數相加後第7個位元有進位情形發生;負號旗標N等於1,因為兩數相加後結果大於127,因為使用2的補數作運算,所以結果大於127便算是負號。

範例三:

ADDLW0x11;將0x11的值與W累加器相加,結果放回W累加器中。

執行前:

W=0x9F;假設執行前W累加器的值為0x9F。

N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。

執行後:

W=0xB0;執行後W累加器的值為0xB0。

N=DC=1,OV=Z=C=0;半進位旗標DC等於1,因為低四位元相加後有進位情形發生;負號旗標N等於1,因為使用2的補數作運算,因此兩數相加後結果大於127,N等於1。

範例二與範例三之不同是在於範例二在相加前第七個位元為0,相加後第七個位元為1,因此溢位旗標OV等於1(根據Microchip的定義),而範例三不同的是在相加前第七個位元為1,相加後第七個位元為1,因此溢位旗標OV不變,依然是等於0。

範例四:

ADDLW0x01;將0x01的值與W累加器相加,結果放回W累加器中。

執行前:

W=0xFF;假設執行前W累加器的值為0xFF。

N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。

執行後:

W=0x00;執行後W累加器的值為0x00,因為累加器為8bits的暫存器,因此相加後結果超過255(0xFF)便會歸0。

N=OV=0,C=DC=Z=1;由於兩數相加後結果超過255(0xFF),因此進位旗標C會被設定為1;又相加後W累加器的值為0x00,因此零位旗標Z會被設定為1;又由於低四位元相加後有進位情形發生,因此半進位旗標DC被設定為1。

指令名稱:

ADDWF

原意:

ADDWtof

語法:

[label]ADDWFf,d,a

運算元:

運算說明:

(W)+(f)->dest

影響旗標:

N,OV,C,DC,Z

指令說明:

W累加器中的值與f暫存器中的值相加,並將運算結果放回’d’所指定的暫存器中。

若d=0,則運算後的結果放到W累加器中;若d=1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W(表W累加器);若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F(表暫存器)。

若a=0,則運算後的結果放到目前RAM的位址中;若a=1,則運算後的結果放到BSR暫存器所指定的RAM位址中。

類別:

資料轉移指令。

組別:

數學運算加法指令。

範例一:

ADDWFREG,0,0;將暫存器(REG)的值與W累加器的值相加,結果放回W累加器中。

執行前:

W=0x11;假設執行前W累加器的值為0x11。

REG=0x0F;假設執行前REG暫存器的值為0x0F。

N=OV=C=DC=Z=0;假設執行前狀態暫存器的值皆為0。

執行後:

W=0x20

REG=0x0F

N=OV=C=Z=0,DC=1

Ø結果放回W累加器中。

範例二:

ADDWFREG,W,0

執行前:

W=0x17

REG=0xC2

N=OV=C=DC=Z=0

執行後:

W=0xD9

REG=0xC2

N=OV=C=DC=Z=0

Ø結果放回W累加器中。

範例三:

ADDWFREG,F,1(ifBSR=0x01)

執行前:

W=0x17

REG=0xC2

N=OV=C=DC=Z=0

執行後:

W=0x17

REG=0xC2

RAM位址100=0xD9

N=OV=C=DC=Z=0

Ø結果放在BSR暫存器所指定的位址中。

範例四:

ADDWFREG,W

執行前:

W=0x17

REG=0xC2

N=OV=C=DC=Z=0

執行後:

W=0xD9

REG=0xC2

N=OV=C=DC=Z=0

Ø結果放回W累加器中。

範例五:

ADDWFREG,F

執行前:

W=0x01

REG=0x10

N=OV=C=DC=Z=0

執行後:

W=0x01

REG=0x11

N=OV=C=DC=Z=0

Ø結果放回暫存器中。

指令名稱:

ADDWFC

原意:

ADDWandCarrybittof

語法:

[label]ADDWFCf,d,a

運算元:

運算說明:

(W)+(f)+(c)->dest

影響旗標:

N,OV,C,DC,Z

指令說明:

W累加器中的值與f暫存器中的值與進位旗標三者相加,並將運算結果放回’d’所指定的暫存器中。

若d=0,則運算後的結果放到W累加器中;若d=1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W(表W累加器);若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F(表暫存器)。

若a=0,則運算後的結果放到f所指定的暫存器中;若a=1為不存在狀態。

類別:

資料轉移指令。

組別:

數學運算加法指令。

範例一:

ADDWFCREG,0,1

執行前:

W=0x4D

REG=0x02

Carry=1

N=OV=DC=Z=0

執行後:

W=0x50

REG=0x02

Carry=0

N=OV=DC=Z=0

Ø結果放回W累加器中,進位旗標C=0。

範例二:

ADDWFCREG,F,0

執行前:

W=0x4D

REG=0x02

Carry=1

N=OV=DC=Z=0

執行後:

W=0x4D

REG=0x50

Carry=0

N=OV=DC=Z=0

Ø結果放回暫存器中,進位旗標C=0。

指令名稱:

ANDLW

原意:

ANDliteralwithW

語法:

[label]ANDLWk

運算元:

運算說明:

(W).AND.k->W

影響旗標:

N,Z

指令說明:

W累加器中的值與k值做邏輯的AND運算,並將運算結果放回W累加器中。

類別:

立即常數定址法。

組別:

邏輯運算AND指令。

範例一:

ANDLW0x5F

執行前:

W=0xA3=10100011

N=Z=0

執行後:

W=0x03

N=Z=0

範例二:

ANDLW0x00

執行前:

W=0x5F=01011111

N=Z=0

執行後:

W=0x00

N=0;Z=1

指令名稱:

ANDWF

原意:

ANDWwithf

語法:

[label]ANDWFf,d,a

運算元:

運算說明:

(W).AND.(f)->dest

影響旗標:

N,Z

指令說明:

W累加器中的值與f暫存器中的值做邏輯AND運算,並將運算結果放回’d’所指定的暫存器中。

若d=0,則運算後的結果放到W累加器中;若d=1,則運算後的結果放到f暫存器中,存放運算結果的暫存器若是存放到W累加器中,我們也可以寫成W(表W累加器);若存放運算結果的暫存器若是存放到暫存器中,我們也可以寫成F(表暫存器)。

若a=0,則運算後的結果放到f所指定的暫存器中;若a=1不存在(系統預設值)。

類別:

邏輯運算指令。

組別:

邏輯運算AND指令。

範例一:

ANDWFREG,0,0

執行前:

W=0x17

REG=0xC2

N=Z=0

執行後:

W=0x02

REG=0xC2

N=Z=0

Ø結果放回W累加器中。

範例二:

ANDWFREG,F

執行前:

W=0x01

REG=0xFF

N=Z=0

執行後:

W=0x01

REG=0x01

N=Z=0

Ø結果放回暫存器中。

指令名稱:

BC

原意:

BranchifCarry

語法:

[label]BClabelname

運算元:

運算說明:

Ifcarrybitis‘1’,jumptolabelname.

影響旗標:

指令說明:

當狀態暫存器中的進位旗標C等於1時,就跳到指定的位址。

類別:

程式流程控制指令。

組別:

比較跳躍指令。

範例一:

HereBCLab1;若是進位旗標C等於1就跳到Lab1的位址,若是進位旗標C不等於1則程式往下執行。

執行前:

PC=在目前Here的位址

C=1

執行後:

PC=跳到Lab1的位址

C=1

指令名稱:

BCF

原意:

BitClearf

語法:

[label]BCFf,b

運算元:

運算說明:

0->f

影響旗標:

指令說明:

將暫存器中的某一個位元清除為0。

類別:

位元定址指令。

組別:

單一位元清除指令。

範例一:

BCFREG,2;將REG暫存器的第2個位元清除為0。

執行前:

REG=11111111=0xFF;REG暫存器的值為0xFF。

執行後:

REG=11111011=0xFB;將REG暫存器的第2個位元清除為0,從右邊算起為第0個位元、第1個位元、第2個位元,以下依此類推。

指令名稱:

BN

原意:

BranchifNegative

語法:

[label]BNLabelname

運算元:

運算說明:

Ifnegativebitis‘1’,jumptolabelname.

影響旗標:

指令說明:

當狀態暫存器中的負號旗標N等於1時,就跳到指定的位址。

類別:

程式流程控制指令。

組別:

比較跳躍指令。

範例一:

HereBNLab1;若是負號旗標N等於1就跳到Lab1的位址,若是負號旗標N不等於1則程式往下執行。

執行前:

PC=在目前Here的位址

N=1

執行後:

PC=跳到Lab1的位址

N=1

指令名稱:

BNC

原意:

BranchifNotCarry

語法:

[label]BNClabelname

運算元:

運算說明:

Ifcarrybitis‘0’,jumptolabelname.

影響旗標:

指令說明:

當狀態暫存器中的進位旗標C等於0時,就跳到指定的位址。

類別:

程式流程控制指令。

組別:

比較跳躍指令。

範例一:

HereBCLab1;若是進位旗標C等於0就跳到Lab1的位址,若是進位旗標C不等於0則程式往下執行。

執行前:

PC=在目前Here的位址

C=0

執行後:

PC=跳到Lab1的位址

C=0

指令名稱:

BNN

原意:

Bran

展开阅读全文
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1