版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章MCS-51系列單片機(jī)的指令集及匯編語言程序設(shè)計(jì)基礎(chǔ)3.1MCS-51系列單片機(jī)指令系統(tǒng)的尋址方式3.2MCS-51系列單片機(jī)指令集及其說明3.3MCS-51系列單片機(jī)匯編語言程序設(shè)計(jì)習(xí)題三3.1
MCS-51系列單片機(jī)指令系統(tǒng)的尋址方式
MCS-51系列單片機(jī)的指令系統(tǒng)使用5種尋址方式,即寄存器尋址、直接地址尋址、立即尋址、寄存器間接尋址及基址寄存器+變址寄存器間接尋址。確定尋址方式的方法是根據(jù)指令中操作數(shù)的真實(shí)地址來判定的。不同的尋址方式有不同的尋址空間,表3-1給出了它們之間的區(qū)別。
1.寄存器尋址寄存器尋址一般用于訪問選定的通用寄存器區(qū)的8個(gè)通用寄存器R0~R7。這種尋址方式如果使用了另一個(gè)操作數(shù),那么另一個(gè)操作數(shù)必須是累加器A,這些指令都是單字節(jié)指令(一條指令在程序存儲(chǔ)器中占一個(gè)字節(jié)地址)。例如:MOV R0,A ;二進(jìn)制機(jī)器碼為“F8H”MOV A,R0 ;二進(jìn)制機(jī)器碼為“E8H”INC
R0 ;二進(jìn)制機(jī)器碼為“08H”DEC R0 ;二進(jìn)制機(jī)器碼為“18H”
2.直接地址尋址
MCS-51系列單片機(jī)的所有SFR必須而且只能使用直接地址尋址,內(nèi)部低128B的RAM都可以使用直接地址尋址,內(nèi)部RAM區(qū)的所有可以位尋址的位都必須使用直接位地址尋址。如果采用直接地址尋址方式的指令中一個(gè)操作數(shù)是直接地址,而另一個(gè)操作數(shù)是通用寄存器或SFR,那么這種結(jié)構(gòu)的指令一般都是雙字節(jié)指令(一條指令在程序存儲(chǔ)器中占兩個(gè)字節(jié)地址),指令碼中包括一個(gè)字節(jié)的指令操作碼和一個(gè)字節(jié)的直接地址碼。例如:MOV A,B ;二進(jìn)制機(jī)器碼為“E5F0H”MOV A,30H ;二進(jìn)制機(jī)器碼為“E530H”如果采用直接地址尋址方式的指令中兩個(gè)操作數(shù)都是直接地址,那么這種結(jié)構(gòu)的指令一般都是三字節(jié)指令(一條指令在程序存儲(chǔ)器中占三個(gè)字節(jié)地址),指令碼中包括一個(gè)字節(jié)的指令操作碼和兩個(gè)字節(jié)地址的直接地址碼。例如:MOV 68H,69H ;二進(jìn)制機(jī)器碼為“856869H”注意,采用直接地址尋址方式的指令中,如果其中的源地址或目的地址使用了SFR,那么SFR的符號(hào)將替代直接地址,例如前面的指令“MOVA,B”。訪問MCS-51系列單片機(jī)的所有可以位尋址的位指令都屬于直接地址尋址方式(可以稱做直接位地址尋址方式)。例如:CLR 30H ;二進(jìn)制機(jī)器碼為“C230H”SETB 68H ;二進(jìn)制機(jī)器碼為“D268H”MOV C,25H ;二進(jìn)制機(jī)器碼為“A225H”
3.立即尋址立即尋址方式的指令一般使用于將立即數(shù)賦值給SFR、直接或間接地址的操作。在MCS-51系列單片機(jī)的匯編程序語言中,為了區(qū)分直接地址和立即數(shù),必須在立即數(shù)前使用“#”標(biāo)志。采用立即數(shù)尋址方式的指令大多數(shù)都屬于雙字節(jié)指令,在指令碼中,一個(gè)地址用于存放操作碼,另一個(gè)地址用于存放立即數(shù)。例如:MOV
A,#30H;二進(jìn)制機(jī)器碼為“7430H”注意,指令“MOVA,30H”是直接地址尋址,其中30H是一個(gè)直接地址,而指令“MOV
A,#30H”中的30H是一個(gè)立即數(shù)。
4.寄存器間接尋址
MCS-51系列單片機(jī)的高128B的RAM必須而且只能使用寄存器間接尋址,由于這些RAM地址與SFR的地址相同,而SFR必須而且只能使用直接地址尋址,這樣可以區(qū)分兩塊地址相同的RAM區(qū)域。低128B的RAM也可以使用寄存器間接尋址。使用寄存器間接尋址方式的指令訪問內(nèi)部RAM時(shí),必須使用R0或R1作為間接寄存器。例如:MOV
A,@R1;二進(jìn)制機(jī)器碼為“E7H”MOV
@R0,30H;二進(jìn)制機(jī)器碼為“A630H”MOV
@R0,#30H;二進(jìn)制機(jī)器碼為“7630H”
MCS-51系列單片機(jī)訪問外部擴(kuò)展的并行數(shù)據(jù)存儲(chǔ)器和外部并行I/O端口時(shí),必須而且只能使用寄存器間接尋址,間接寄存器可以是R0、R1或DPTR。例如:MOVX
A,@R1;二進(jìn)制機(jī)器碼為“E3H”MOVX
@R0,A;二進(jìn)制機(jī)器碼為“F6H”MOVX
@DPTR,A;二進(jìn)制機(jī)器碼為“F0H”MOVX
A,@DPTR;二進(jìn)制機(jī)器碼為“E0H”寄存器間接尋址方式的實(shí)現(xiàn)機(jī)理是把間接寄存器作為指針,然后對指針?biāo)赶虻牡刂愤M(jìn)行尋址。以下面兩條順序執(zhí)行的指令為例說明寄存器間接尋址的實(shí)現(xiàn)機(jī)理。MOV
R1,#86H;給間接寄存器(指針)賦值MOV
A,@R1;將間接地址(指針?biāo)赶虻牡刂?中的內(nèi)容移到累加器A中顯然,前一句指令執(zhí)行后使R1寄存器的內(nèi)容等于“86H”,后一句指令執(zhí)行時(shí)將R1作為指針使用,那么R1就指向內(nèi)部RAM的86H單元,并將86H單元的內(nèi)容傳送到累加器A中。另外,MCS-51單片機(jī)在訪問外部擴(kuò)展的并行數(shù)據(jù)存儲(chǔ)器和外部并行I/O端口時(shí),如果使用8位寄存器R0和R1作為間接寄存器,那么指針?biāo)赶虻牡刂房臻g大小應(yīng)是28(256)B,也就是說,使用R0和R1訪問外部存儲(chǔ)器和I/O端口最大只能區(qū)分256個(gè)地址。例如:MOV R1,#30H
;指針賦值,指向外部8位地址30HMOVX A,@R1
;將外部地址30H單元的內(nèi)容讀到累加器A中MOV
R0,#0FFH
;指針賦值,指向8位外部地址FFHMOVX
@R0,A
;將累加器A中的內(nèi)容寫到外部地址FFH單元中
DPTR是一個(gè)16位數(shù)據(jù)指針,如果使用DPTR作為訪問外部擴(kuò)展的并行數(shù)據(jù)存儲(chǔ)器和外部并行I/O端口的間接寄存器(指針),那么指針?biāo)赶虻牡刂房臻g大小應(yīng)是216B(64KB),也就是說,使用DPTR訪問外部存儲(chǔ)器和I/O端口最大尋址能力達(dá)64KB。例如:MOV
DPTR,#1234H
;指針賦值,指向16位外部地址1234HMOVX
A,@DPTR
;將外部地址1234H單元的內(nèi)容讀到累加器A中MOV
DPTR,#0FFFFH
;指針賦值,指向16位外部地址FFFFHMOVX
@DPTR,A
;將累加器A中的內(nèi)容寫到外部地址FFFFH單元中
5.變址寄存器+基址寄存器間接尋址在MCS-51系列單片機(jī)的程序存儲(chǔ)器中常需要存儲(chǔ)一些常數(shù)表、程序表等,訪問這些存儲(chǔ)器時(shí),必須使用變址寄存器+基址寄存器間接尋址方式來實(shí)現(xiàn)。采用這種尋址方式的指令僅包括查表指令MOVC
A,@A+DPTR;二進(jìn)制機(jī)器碼為“93H”MOVC
A,@A+PC
;二進(jìn)制機(jī)器碼為“83H”和程序散轉(zhuǎn)指令JMP
@A+DPTR;二進(jìn)制機(jī)器碼為“73H”上面的3條指令中都是把累加器A作為變址寄存器,而DPTR或PC作為基址寄存器的間接寄存器尋址。同前面的寄存器間接尋址一樣,變址寄存器+基址寄存器間接尋址方式中也是使用指針方式尋址,不同的是,在這里是把變址寄存器+基址寄存器之和作為指針(間接寄存器)。下面的例子是使用變址寄存器+基址寄存器間接尋址方式實(shí)現(xiàn)程序常數(shù)查表。8000H
MOV
DPTR,#ShowStr
;基址寄存器賦值(指針指向常數(shù)表的首地址)8003H
MOV
A,#06H
;變址寄存器賦值(確定地址偏移量)8005H
MOVC
A,@A+DPTR
;從常數(shù)表首地址開始偏移6個(gè)地址,
…
;將該單元中的內(nèi)容取出并存在累加器A中ShowStr: ;常數(shù)表的首地址(符號(hào)地址)9000H
DB“EnteranykeytoContinue!”
;程序存儲(chǔ)區(qū)的常數(shù)表再通過下面的例子理解如何使用變址寄存器+基址寄存器間接尋址方式實(shí)現(xiàn)程序散轉(zhuǎn)。0800H
MOV
A,#02H;需要跳轉(zhuǎn)的函數(shù)編址0802H
MOV
DPTR,#FunTable
;基址寄存器賦值(指針指向函數(shù)表首地址)0805H
MOV
B,#03H
;“LJMP”指令是三字節(jié)指令0807H
MUL
AB
;變址寄存器賦值(確定地址偏移量)0808H
JMP
@A+DPTR
;跳轉(zhuǎn)到指針指向的地址執(zhí)行指令
…FunTable:;函數(shù)表的首地址0910H
LJMP
Function0
;二進(jìn)制指令碼為“021234H”,跳轉(zhuǎn)到地址1234H執(zhí)行0913H
LJMP
Function1
;二進(jìn)制指令碼為“023000H”,跳轉(zhuǎn)到地址3000H執(zhí)行0916H
LJMP
Function2
;二進(jìn)制指令碼為“024567H”,跳轉(zhuǎn)到地址4567H執(zhí)行0919H
LJMP
Function3
;二進(jìn)制指令碼為“028000H”,跳轉(zhuǎn)到地址8000H執(zhí)行
…ORG
1234HFunction0:;地址“1234H”單元的程序
…ORG
3000HFunction1:;地址“3000H”單元的程序
…ORG
4567HFunction2:;地址“4567H”單元的程序
…ORG
8000HFunction3:;地址“8000H”單元的程序
…3.2
MCS-51系列單片機(jī)指令集及其說明按指令的功能分類,MCS-51系列單片機(jī)的指令集可以劃分為下面五類:
(1)數(shù)據(jù)傳送類指令:實(shí)現(xiàn)存儲(chǔ)器賦值、數(shù)據(jù)轉(zhuǎn)移等功能。
(2)算術(shù)運(yùn)算類指令:實(shí)現(xiàn)數(shù)值的加、減、乘、除運(yùn)算等功能。
(3)邏輯運(yùn)算類指令:實(shí)現(xiàn)邏輯與、或、異或、移位等功能。
(4)控制轉(zhuǎn)移類指令:實(shí)現(xiàn)程序條件轉(zhuǎn)移、無條件轉(zhuǎn)移等功能。
(5)位操作類指令:實(shí)現(xiàn)位清零、置位、判斷等功能,由MCS-51系列單片機(jī)內(nèi)部特有的布爾處理器完成。在本節(jié)中將分類詳細(xì)介紹MCS-51系列單片機(jī)的指令集。在分類介紹之前,首先了解描述指令的一些特殊約定:
(1)當(dāng)前使用的通用寄存器以“Rn”表示,包括R0~R7(即n=0~7)。
(2)當(dāng)前使用的間接寄存器以“Ri”表示,包括R0和R1(即i=0、1)。
(3)當(dāng)前使用的8bit直接地址以“direct”表示,包括低128B的RAM和SFR地址。
(4)當(dāng)前使用的8bit立即數(shù)以“#data”表示。
(5)當(dāng)前使用的16bit立即數(shù)以“#data16”表示。
(6)當(dāng)前使用的8bit帶有符號(hào)的相對偏移量用“rel”表示,取值范圍為-128~+127。
(7)當(dāng)前使用的16bit偏移地址和11bit偏移地址分別用“addr16”和“addr11”表示。
(8)內(nèi)部RAM中可以位尋址的位用“bit”表示。
(9)寄存器或某地址中的內(nèi)容用帶有括號(hào)的寄存器名稱或地址表示。例如,“(A)”表示累加器A中的內(nèi)容;“(30H)”表示直接地址30H單元中的內(nèi)容。3.2.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令是匯編語言程序中使用最為頻繁的一類指令,共有29條。數(shù)據(jù)傳送類指令的操作目的是把源操作數(shù)傳送到目的操作數(shù),指令執(zhí)行后源操作數(shù)保持不變,目的操作數(shù)被修改為與源操作數(shù)相同。如果要求在進(jìn)行數(shù)據(jù)傳送時(shí)不丟失目的操作數(shù),這時(shí)可以使用數(shù)據(jù)交換型指令。數(shù)據(jù)傳送類指令不影響Cy、AC和OC標(biāo)志位;如果指令以累加器A作為目的操作數(shù),那么指令執(zhí)行后可能會(huì)影響奇偶校驗(yàn)標(biāo)志位P。
1.以累加器A為目的操作數(shù)的數(shù)據(jù)傳送類指令(4條)MOV
A,Rn;n=0~7,寄存器尋址MOV
A,direct
;direct可以是128B的RAM或SFR地址,直接地址尋址MOV
A,#data
;#data是8bit的立即數(shù),立即尋址MOV
A,@Ri;i=0或1,寄存器間接尋址這4條指令都是將源操作數(shù)的內(nèi)容傳送到累加器A中,源操作數(shù)可以是通用寄存器、直接地址、立即數(shù)或間接寄存器。例如:MOV
A,R4;(R4)→(A),寄存器尋址MOV
A,30H;(30H)→(A),直接地址尋址MOV
A,#30H;30H→(A),立即尋址MOV
A,@R0;((R0))→(A),寄存器間接尋址
2.以Rn為目的操作數(shù)的指令(3條)MOV
Rn,A;n=0~7MOV
Rn,direct;n=0~7MOV
Rn,#data;n=0~7這些指令是將源操作數(shù)中的內(nèi)容傳送到當(dāng)前使用的通用寄存器組對應(yīng)的R0~R7中。例如:MOV
R2,A;(A)→(R2)MOV
R6,30H;(30H)→(R6)MOV
R7,#30H;30H→(R7)
3.以直接地址為目的操作數(shù)的指令(5條)MOV
direct,A
MOV
direct,Rn;n=0~7MOV
direct,direct
;direct可以是128B的RAM或SFR地址MOV
direct,#dataMOV
direct,@Ri;i=0或1這些指令是將源操作數(shù)中的內(nèi)容傳送到低128B的RAM區(qū)域的某單元中或某個(gè)SFR中。例如:MOV
30H,A;(A)→(30H)MOV
30H,R6;(R6)→(30H)MOV
30H,#30H;30H→(30H)MOV
30H,68H;(68H)→(30H)MOV
30H,@R0;((R0))→(30H)
4.以間接寄存器所指向的地址作為目的操作數(shù)的指令(3條)MOV
@Ri,A ;i=0或1MOV
@Ri,direct ;i=0或1MOV
@Ri,#data ;i=0或1這些指令是將源操作數(shù)中的內(nèi)容傳送到間接寄存器Ri所指向的地址單元中,這里的Ri是當(dāng)前使用的通用寄存器組R0或R1。例如:MOV
A,#55H ;55H→AMOV
R0,#30H ;30H→(R0)MOV
@R0,A ;(A)→((R0))這3條指令連續(xù)執(zhí)行后內(nèi)部RAM中30H地址單元中的數(shù)據(jù)為55H,而寄存器R0中的數(shù)據(jù)為30H,累加器A中的數(shù)據(jù)也為55H。
5.堆棧操作指令(2條)PUSH
direct
;將直接地址direct單元中的內(nèi)容壓入堆棧POP
direct
;將堆棧棧頂中的內(nèi)容彈出傳送到直接地址direct單元中
MCS-51系列單片機(jī)的匯編語言程序允許使用多級(jí)子程序或子過程嵌套調(diào)用,而調(diào)用子程序或子過程時(shí)需要保護(hù)某些地址單元中的內(nèi)容,最快捷的方法是使用堆棧操作,將某些需要保護(hù)的寄存器中的內(nèi)容依次壓入堆棧區(qū),當(dāng)子程序或子過程執(zhí)行完成后再將這些內(nèi)容依次從堆棧中彈出恢復(fù)到對應(yīng)的寄存器中。MCS-51系列單片機(jī)的堆棧區(qū)管理使用8bit的堆棧指針SP來完成,SP作為指針總指向堆棧的棧頂位置,堆棧采用“先進(jìn)后出(FILO,F(xiàn)irstInandLastOut)”原則。堆棧區(qū)必須設(shè)置在RAM區(qū)域,堆棧的容量必須在255字節(jié)以內(nèi)。MCS-51系列單片機(jī)的匯編語言程序使用“PUSH”指令完成進(jìn)棧操作,如PUSH
direct這條指令中的direct可以是低128B的RAM區(qū)域直接地址或SFR,例如:PUSH
ACC ;累加器A的內(nèi)容進(jìn)棧PUSH
B ;特殊功能寄存器B進(jìn)棧PUSH
02H ;RAM區(qū)域02H地址單元中的內(nèi)容進(jìn)棧PUSH
DPL ;DPTR的低8位內(nèi)容進(jìn)棧
PUSH指令的執(zhí)行過程分為兩步:首先將堆棧指針SP加1,然后將直接地址direct單元中的內(nèi)容壓入堆棧指針SP所指向的堆棧區(qū)的單元保存??纯聪旅嬷噶畹膱?zhí)行過程:MOV
SP,07H
;內(nèi)部RAM區(qū)域從08H地址開始作為堆棧區(qū),SP初始值為07HMOV
A,#30H
MOV
PSW,#00HPUSH
ACC;(SP)+1=08H→(SP),(A)→((SP))PUSH
PSW;(SP)+1=09H→(SP),(PSW)→((SP))
MCS-51系列單片機(jī)的匯編語言程序使用“POP”指令完成出棧操作,如POP
direct這條指令中的direct可以是低128B的RAM區(qū)域直接地址或SFR,例如:POP
ACC
;將SP所指向的堆棧單元內(nèi)容彈出到累加器A中POP
B
;將SP所指向的堆棧單元內(nèi)容彈出到特殊功能寄存器B中POP
02H
;將SP所指向的堆棧單元內(nèi)容彈出到RAM區(qū)域的02H地址單元中POP
DPL
;將SP所指向的堆棧單元內(nèi)容彈出到DPTR的低8位中
POP指令的執(zhí)行過程也分為兩步:首先將堆棧指針SP所指向的堆棧區(qū)單元中的內(nèi)容彈出并傳送到直接地址direct單元中,然后堆棧指針SP減1??纯聪旅嬷噶畹膱?zhí)行過程:MOV
SP,07H
;內(nèi)部RAM區(qū)域從08H地址開始作為堆棧區(qū),SP初始值為07HMOV
A,#30H
MOV
PSW,#00HPUSH
ACC;(SP)+1=08H→(SP),(A)→((SP))PUSH
PSW;(SP)+1=09H→(SP),(PSW)→((SP))MOV
A,#55HMOV
PSW,#06HPOP
PSW;((SP))→(PSW),(SP)-1=08H→(SP)POP
ACC;((SP))→(A),(SP)-1=07H→(SP)顯然,累加器A和程序狀態(tài)寄存器PSW被依次壓入堆棧前,(A)=30H,(PSW)=00H,將A和PSW分別壓入堆棧區(qū)后,A和PSW又分別被修改為55H和06H,內(nèi)容都變化了。但是,由于使用“POP”指令又將PSW和A依次彈出堆棧后,A和PSW中的內(nèi)容又恢復(fù)到原來的內(nèi)容,即(A)=30H,(PSW)=00H。這里必須注意,要正確使用堆棧保存某些地址單元中的內(nèi)容,使用“PUSH”和“POP”指令必須成對,而且應(yīng)嚴(yán)格按照“先進(jìn)后出”原則。
6.16位數(shù)據(jù)的傳送指令(1條)MOV
DPTR,#data16這條指令是將一個(gè)16bit的立即數(shù)傳送給16位數(shù)據(jù)指針DPTR,這是MCS-51系列單片機(jī)的指令集中惟一的一條16bit的數(shù)據(jù)傳送指令。由于DPTR是由特殊功能寄存器DPH和DPL組成的,執(zhí)行這條指令后,實(shí)際上是把data16的高8位傳送給DPH,而把低8位數(shù)據(jù)傳送給DPL。所以這條指令與執(zhí)行下面兩條指令是完全相同的:MOV
DPH,#data16_high8bitMOV
DPL,#data16_low8bit例如:MOV
DPTR,#1234H
;1234H→(DPTR),(DPH)=12H,(DPL)=34H等同于MOV
DPH,#12H;12H→(DPH)MOV
DPL,#34H;34H→(DPL)的執(zhí)行效果。
7.外部數(shù)據(jù)存儲(chǔ)器傳送指令(4條)MOVX
A,@Ri;((Ri))→(A),讀外部數(shù)據(jù)存儲(chǔ)器或I/O端口,地址在Ri中,i=0或1;MOVX
@Ri,A;(A)→((Ri)),寫外部數(shù)據(jù)存儲(chǔ)器或I/O端口,地址在Ri中,i=0或1MOVX
A,@DPTR;((DPTR))→(A),讀外部數(shù)據(jù)存儲(chǔ)器或I/O端口,地址在DPTR中MOVX
@DPTR,A;(A)→((DPTR)),寫外部數(shù)據(jù)存儲(chǔ)器或I/O端口,地址在DPTR中
8.查表操作指令(2條)MOVCA,@A+PC;以PC作為基址寄存器的查表指令MOVCA,@A+DPTR;以DPTR作為基址寄存器的查表指令這2條指令都是使用變址寄存器(A)+基址寄存器(PC或DPTR)間接尋址方式的指令。指令的執(zhí)行過程是,首先將變址寄存器(A)中的內(nèi)容和基址寄存器(PC或DPTR)中的內(nèi)容相加,得到一個(gè)16bit的地址,然后將程序存儲(chǔ)器區(qū)域中該地址單元中的數(shù)據(jù)傳送到累加器A中。這個(gè)過程常常用來訪問程序存儲(chǔ)器區(qū)域的常數(shù)表,所以俗稱查表指令。注意,這2條指令執(zhí)行后,基址寄存器(PC或DPTR)中的內(nèi)容不變。顯然,變址寄存器用累加器A,那么,當(dāng)基址寄存器不變時(shí),這2條指令可以訪問的常數(shù)表必須小于256個(gè)字節(jié)。當(dāng)然,如果將較大的常數(shù)表分割成256B大小的塊,訪問不同的塊時(shí),首先修改基址寄存器內(nèi)容,這樣就可以實(shí)現(xiàn)訪問大于256B的常數(shù)表。由于PC是根據(jù)當(dāng)前程序執(zhí)行的程序位置確定的,不能由程序軟件任意設(shè)定,因此訪問大于256B的常數(shù)表時(shí),僅可以使用DPTR作為基址寄存器。例如:8000H
MOV
A,#04H;變址寄存器(A)=04H8002H
MOVC
A,@A+PC ;(PC)+1=8003H→(PC),(PC)+(A)=8007H;(8007H)→A,(A)=31H8003H
LJMP
SKIP8006H
DB
30H8007H
DB
31H8008H
DB
32H…注意,執(zhí)行“MOVC”指令時(shí),首先需要執(zhí)行當(dāng)前的這條指令,即“MOVC”指令,這條指令是單字節(jié)指令,那么PC將加1,然后將新的PC值與變址寄存器相加,最后將所指向的地址單元中的內(nèi)容傳送到A中。再看看下面以DPTR作為基址寄存器的查表指令的應(yīng)用示例,程序首先讓DPTR指向常數(shù)表“AscTable”,然后用MOVC指令實(shí)現(xiàn)查表。0800H
MOV
DPTR,#AscTable
;基址寄存器指向常數(shù)表的首地址,即(DPTR)=0900H0803H
MOV
A,#10H
;變址寄存器(A)=10H0805H
MOVC
A,@A+DPTR
;查表,執(zhí)行后(A)=Q
…AscTable:0900H
DB
'A','B','C','D','E','F','G','H'
;8個(gè)字符0908H
DB
'I','J','K','L','M','N','O','P'
;8個(gè)字符0910H
DB
'Q','R','S','T','U','V','W','X'
;8個(gè)字符0918H
DB
'Y','Z','a','b','c','d','e','f'
;8個(gè)字符…
9.字節(jié)交換指令(3條)XCH
A,Rn;n=0~7XCH
A,directXCH
A,@Ri;i=0或1這3條指令都是實(shí)現(xiàn)將累加器A中的內(nèi)容與源操作數(shù)中的內(nèi)容互換(交換),執(zhí)行后,源操作數(shù)中的內(nèi)容與交換前的累加器A中的內(nèi)容相同,累加器A中的內(nèi)容與交換前的源操作數(shù)中的內(nèi)容相同。例如:MOV
A,#55H;55H→(A)MOV
R2,#30H;30H→(R2)XCH
A,R2
;(A)與(R2)互換,執(zhí)行后(A)=30H,(R2)=55H再如:MOV
A,#55H;55H→(A)MOV
30H,#38H;38H→(30H)MOV
R1,#30H;30H→(R1)XCH
A,@R1;(A)與((R1))互換,執(zhí)行后(A)=38H,((R1))=55H
10.半字節(jié)交換指令(1條)XCHD
A,@Ri;i=0或1這條指令是實(shí)現(xiàn)累加器A的低4位(低半字節(jié))與間接寄存器所指向的地址單元中的低4位互換,而各自的高4位(高半字節(jié))保持不變。例如:MOV
A,#55H;55H→(A)MOV
30H,#30H;38H→(30H)MOV
R1,#30H;30H→(R1)XCHD
A,@R1;(A)的低半字節(jié)與((R1))的低半字節(jié)互換執(zhí)行后(A)=58H,((R1))=35H
11.累加器內(nèi)部高半字節(jié)與低半字節(jié)互換指令(1條)SWAP
A這條指令能夠?qū)崿F(xiàn)累加器A內(nèi)部的高4位與低4位的內(nèi)容互換,可以用下面的圖表示其執(zhí)行過程。例如:MOV
A,#5AH;5AH→(A)SWAPA;高半字節(jié)與低半字節(jié)互換,(A)=0A5H3.2.2算術(shù)運(yùn)算類指令
MCS-51系列單片機(jī)指令集提供直接使用的8bit數(shù)值加、減、乘、除法運(yùn)算指令,以及自加1和自減1指令,共有24條。這些指令能夠?yàn)镸CS-51系列單片機(jī)提供強(qiáng)大的數(shù)值運(yùn)算處理能力,在工業(yè)控制領(lǐng)域使用MCS-51系列單片機(jī)可以完成復(fù)雜的控制算法。算術(shù)運(yùn)算類指令執(zhí)行后可能影響Cy、AC、OV和P等標(biāo)志位。
1.不帶進(jìn)位的加法運(yùn)算指令(4條)ADD
A,Rn ;n=0~7ADD
A,direct;direct可以是低128B的RAM單元或SFR地址ADD
A,@Ri ;i=0或1ADD
A,#data ;data是任意8bit的立即數(shù)這些指令都是以累加器A為目的操作數(shù)的指令,執(zhí)行時(shí),不考慮原來進(jìn)位位的狀態(tài),直接將源操作數(shù)加到累加器A中,并且源操作數(shù)保持不變。這些指令執(zhí)行后,根據(jù)指令的執(zhí)行情況重新對PSW中的Cy、AC、OV和P等4個(gè)標(biāo)志位進(jìn)行置位或清零。注意,這里的“不帶進(jìn)位”是指在兩個(gè)數(shù)相加時(shí)不考慮原來進(jìn)位位的狀態(tài),但指令執(zhí)行時(shí)仍然會(huì)影響進(jìn)位位。例如:SETB
C ;1→(Cy)MOV
A,#83H ;83H→(A)ADD
A,#80H ;(A)+80H=03H→(A),1→Cy指令執(zhí)行前,雖然Cy為1,但“ADD”指令是不考慮Cy狀態(tài)的,執(zhí)行后累加器A中的內(nèi)容為03H,由于加法執(zhí)行后有進(jìn)位,因此(Cy)=1。再比較下面的指令:CLR
C ;0→(Cy)MOV
A,#83H ;83H→(A)ADD
A,#80H ;(A)+80H=03H→(A),1→(Cy)執(zhí)行后累加器A中的內(nèi)容為03H,由于加法執(zhí)行后有進(jìn)位,因此(Cy)=1。
2.帶進(jìn)位加法運(yùn)算指令(4條)ADDC
A,Rn ;n=0~7ADDC
A,direct
;direct可以是低128B的RAM單元或SFR地址ADDC
A,@Ri ;i=0或1ADDC
A,#data ;data是任意8bit的立即數(shù)這些指令與不帶進(jìn)位的加法運(yùn)算指令的區(qū)別就在于,帶進(jìn)位加法指令在執(zhí)行加運(yùn)算時(shí)必須考慮進(jìn)位位的狀態(tài),指令執(zhí)行后,根據(jù)指令的執(zhí)行情況,重新對Cy、AC、OV、P等標(biāo)志位置位或清零。比較下面帶進(jìn)位加法和不帶進(jìn)位加法指令的執(zhí)行結(jié)果:①帶進(jìn)位的加法指令程序:SETB
C ;1→(Cy)MOV
A,#98H ;98H→(A)ADDC
A,#0C8H
;執(zhí)行(A)+(Cy)+C8H=61H→(A),1→(Cy)執(zhí)行ADDC時(shí),首先將Cy加到累加器A中,然后執(zhí)行(A)+C8H,執(zhí)行結(jié)果(A)=61H,有進(jìn)位,進(jìn)位位Cy被置位。②不帶進(jìn)位的加法指令程序SETB
C ;1→(Cy)MOV
A,#98H ;98H→(A)ADD
A,#0C8H
;執(zhí)行(A)+C8H=60H→(A),1→(Cy)執(zhí)行結(jié)果(A)=60H,有進(jìn)位,進(jìn)位位Cy被置位。顯然,執(zhí)行ADDC和ADD之前如果進(jìn)位位為“1”,那么兩指令執(zhí)行的結(jié)果不相同。再比較下面帶進(jìn)位加法和不帶進(jìn)位加法指令的執(zhí)行結(jié)果。①帶進(jìn)位的加法指令程序:CLR
C ;0→(Cy)MOV
A,#98H ;98H→(A)ADDC
A,#0C8H
;執(zhí)行(A)+(Cy)+C8H=60H→(A),1→(Cy)執(zhí)行ADDC時(shí),首先將Cy加到累加器A中,然后執(zhí)行(A)+C8H,執(zhí)行結(jié)果(A)=60H,有進(jìn)位,進(jìn)位位Cy被置位。②不帶進(jìn)位的加法指令程序:CLR
C ;0→(Cy)MOV
A,#98H ;98H→(A)ADD
A,#0C8H
;執(zhí)行(A)+C8H=60H→(A),1→(Cy)執(zhí)行結(jié)果(A)=60H,有進(jìn)位,進(jìn)位位Cy被置位。顯然,執(zhí)行ADDC和ADD之前如果進(jìn)位位為“0”,那么兩指令執(zhí)行的結(jié)果相同。
3.減法運(yùn)算指令(4條)SUBB
A,Rn ;n=0~7SUBB
A,direct
;direct可以是低128B的RAM單元或SFR地址SUBB
A,@Ri ;i=0或1SUBB
A,#data ;data是任意8bit的立即數(shù)首先必須注意,MCS-51系列單片機(jī)指令集中的減法指令在被執(zhí)行時(shí),都必須考慮減運(yùn)算之前的借位位狀態(tài),當(dāng)然指令執(zhí)行后會(huì)影響Cy(用作減法運(yùn)算時(shí),Cy被稱做借位)、AC、OV、P等標(biāo)志位。減法指令都是以累加器A作為目的操作數(shù),執(zhí)行時(shí),先將借位從累加器A中減去,然后將源操作數(shù)從A中減去,減后的差值存放到累加器A中。在執(zhí)行減去借位或減去源操作數(shù)而需要借位時(shí),借位位Cy被置位。例如:SETB
C ;1→(Cy)(借位位被置位)MOV
A,#64H ;64H→(A)SUBB
A,#0C8H
;執(zhí)行(A)-(Cy)-C8H=9BH→(A),1→(Cy)執(zhí)行SUBB指令時(shí),首先執(zhí)行(A)-(Cy)=64H-1=63H→A,即(A)=63H,然后繼續(xù)執(zhí)行(A)-C8H=9BH,顯然需要借位,那么借位位Cy被置位。其他減法指令的例子如下:SUBB
A,R3
;執(zhí)行(A)-(Cy)-(R3)=?→(A),影響CySUBB
A,30H
;執(zhí)行(A)-(Cy)-(30H)=?→(A),影響CySUBB
A,@R1
;執(zhí)行(A)-(Cy)-((R1))=?→(A),影響Cy
4.乘法指令(1條)MUL
AB注意,這條指令和后面的除法指令都是非常特殊的指令尋址方式,它們的源操作數(shù)都是A和B,同時(shí)A和B又都是它們的目的操作數(shù),執(zhí)行乘法和除法指令后,兩個(gè)操作數(shù)中的內(nèi)容都將被修改,這與其他指令大不相同。而且,乘法和除法指令的目的操作數(shù)和源操作數(shù)之間沒有“,”分割符。另外,在MCS-51系列單片機(jī)的指令集中,乘法和除法指令的目的操作數(shù)和源操作數(shù)必須是A和B。執(zhí)行乘法指令后的乘積是一個(gè)16bit的數(shù)據(jù),MCS-51指令中約定將乘積分成低8bit(低字節(jié))和高8bit(高字節(jié)),分別存放在累加器A和B中。乘法指令執(zhí)行前不考慮進(jìn)位位或借位位,指令執(zhí)行后,Cy將被無條件清零,同時(shí)將影響標(biāo)志位OV和P,但不影響輔助進(jìn)位位AC。例如:SETB
C ;1→(Cy)MOV
A,#64H ;64H→(A)MOV
B,#03H ;03H→(B)MUL
AB
;執(zhí)行(A)×(B)=012CH,01H→A,2CH→B,0→Cy
5.除法指令(1條)DIV
AB與乘法指令一樣,這條指令也是一種特殊的尋址方式,A和B既都是源操作數(shù)又都是目的操作數(shù),執(zhí)行除法運(yùn)算后,源操作數(shù)A和B中的內(nèi)容都將被修改。執(zhí)行除法指令是將累加器A中的內(nèi)容作為被除數(shù),B中的內(nèi)容作為除數(shù),即執(zhí)行“(A)÷(B)”,執(zhí)行除法運(yùn)算后的結(jié)果包括商和余數(shù),共2個(gè)字節(jié),商被存放在累加器A中,而余數(shù)存放在B中,執(zhí)行后Cy被無條件清零,同時(shí)將影響OV和P等標(biāo)志位,但不影響輔助進(jìn)位位AC的狀態(tài)。例如:SETB C ;1→(Cy)MOV A,#09H ;09H→(A)OV B,#02H ;02H→(B)DIV
AB
;執(zhí)行(A)÷(B),商等于04H→(A),余數(shù)等于01H→(B);0→(Cy)(進(jìn)位位/借位位被無條件清零)
6.自加1指令(5條)INC
AINC
Rn ;n=0~7INC
direct ;direct可以是低128B的RAM單元或SFR地址INC
@Ri ;i=0或1INC
DPTR ;16位數(shù)據(jù)指針自加1這些指令都是自加1指令,執(zhí)行這些指令會(huì)影響某些標(biāo)志位,并且連續(xù)執(zhí)行自加1指令會(huì)造成目的操作數(shù)中的內(nèi)容回滾。例如順序執(zhí)行下面的指令:MOV
A,#0FEH ;FEH→(A)INC
A;執(zhí)行(A)+1=FFH→(A),(A)=0FFHINC
A ;執(zhí)行(A)+1=00H→(A),(A)=00HINC
A ;執(zhí)行(A)+1=01H→(A),(A)=01H其他8bit寄存器內(nèi)容自加1指令與這些指令相同。再如:MOV
DPTR,#0FFFEH
;FFFEH→(DPTR)INC
DPTR
;執(zhí)行(DPTR)+1=FFFFH→(DPTR),(DPTR)=0FFFFHINC
DPTR
;執(zhí)行(DPTR)+1=0000H→(DPTR),(DPTR)=0000HINC
DPTR
;執(zhí)行(DPTR)+1=0001H→(DPTR),(DPTR)=0001H雖然DPTR是由特殊功能寄存器DPH和DPL組成的,執(zhí)行DPTR自加1指令時(shí),DPL與DPH之間的進(jìn)位將自動(dòng)完成。
7.自減1指令(4條)DEC
ADEC
Rn;n=0~7DEC
direct;direct可以是低128B的RAM單元或SFR地址DEC
@Ri;i=0或1這些都是8bit寄存器中內(nèi)容的自減1指令,執(zhí)行這些指令會(huì)影響某些標(biāo)志位。與自加1指令一樣,連續(xù)執(zhí)行自減1指令會(huì)造成目的操作數(shù)中的內(nèi)容回滾。例如順序執(zhí)行下面的指令:MOVA,#01H;01H→(A)DEC
A;執(zhí)行(A)-1=00H→(A),(A)=00HDEC
A;執(zhí)行(A)-1=FFH→(A),(A)=0FFHDEC
A;執(zhí)行(A)-1=FEH→(A),(A)=0FEH其他自減1指令的例子如下:DEC
R2 ;(R2)-1=?→(R2)DEC
30H ;(30H)-1=?→(30H)DEC
@R1 ;((R1))-1=?→
((R1))
8.累加器中的內(nèi)容進(jìn)行十進(jìn)制調(diào)整指令(1條)DA
A當(dāng)執(zhí)行二進(jìn)制BCD碼運(yùn)算時(shí),往往需要運(yùn)算結(jié)果仍為BCD碼,這條指令是對累加器A中存儲(chǔ)的由前面二進(jìn)制BCD碼運(yùn)算的結(jié)果進(jìn)行十進(jìn)制調(diào)整,可以使A中的結(jié)果仍保持二進(jìn)制的BCD碼格式。該指令執(zhí)行時(shí)會(huì)受Cy和AC標(biāo)志位的影響,并且指令執(zhí)行后將影響Cy標(biāo)志位,但不影響AC標(biāo)志位。該指令的執(zhí)行過程可描述為:如果累加器A中的低4位(低半字節(jié))大于9,或者AC標(biāo)志位已經(jīng)被置位,那么將A中的低4位加6,如果加之后有進(jìn)位,則將進(jìn)位位加到A的高4位(高半字節(jié)),低4位調(diào)整完畢;然后調(diào)整高4位,如果累加器A中的高4位(高半字節(jié))大于9,或者Cy標(biāo)志位已經(jīng)被置位,那么將A中的高4位加6,如果加之后有進(jìn)位,則將進(jìn)位位Cy置位。例如:MOV
A,#34H ;34H→(A)MOV
R2,#89H ;89H→(R2)ADD
A,R2
;執(zhí)行(A)+(R2)=BDH→(A),(Cy)=0,(AC)=0DA
A
;(A)=0BDH,(Cy)=0并且(AC)=0,調(diào)整后,(A)=23H,(Cy)=1再如:SETB
C ;1→(Cy)MOV
A,#99H ;99H→(A)MOV
R2,#99H ;99H→(R2)ADDC
A,R2
;(A)+Cy+(R2)=33H→(A),(Cy)=1,(AC)=1DA
A
;(A)=33H,(Cy)=1并且(AC)=1,調(diào)整后,(A)=99H,(Cy)=13.2.3邏輯運(yùn)算類指令邏輯運(yùn)算類指令共有24條。
1.僅可以使用于累加器的單字節(jié)邏輯運(yùn)算指令(6條)①?CLRA將累加器A中的8個(gè)位一次性全部清零操作。指令執(zhí)行后標(biāo)志位P將被清零。②?CPLA將累加器A中的8個(gè)位同時(shí)按位取反操作。指令執(zhí)行標(biāo)志位P將被修改。③?RLA將累加器A中的8個(gè)位循環(huán)左移1位。該指令不影響Cy、AC、OV和P標(biāo)志位,其執(zhí)行過程如下圖所示:④?RRA將累加器A中的8個(gè)位循環(huán)右移1位。該指令不影響Cy、AC、OV和P標(biāo)志位,其執(zhí)行過程如下圖所示:⑤?RLC
A將累加器A中的8個(gè)位與Cy一起循環(huán)左移1位。該指令不影響AC和OV標(biāo)志位,但執(zhí)行后將影響Cy和P標(biāo)志位,其執(zhí)行過程如下圖所示:⑥?RRCA將累加器A中的8個(gè)位與Cy一起循環(huán)右移1位。該指令不影響AC和OV標(biāo)志位,但執(zhí)行后將影響Cy和P標(biāo)志位,其執(zhí)行過程如下圖所示:
2.字節(jié)按位邏輯與運(yùn)算指令(6條)ANL
A,Rn ;n=0~7ANL
A,direct
;direct可以是低128B的RAM單元或SFR地址ANL
A,@Ri ;i=0或1ANL
A,#data;data可以是任何8bit立即數(shù)ANL
direct,A
ANL
direct,#data前4條指令是實(shí)現(xiàn)將源操作數(shù)的內(nèi)容和累加器A中的內(nèi)容按位執(zhí)行邏輯與運(yùn)算,執(zhí)行后的結(jié)果存放在累加器A中,并且源操作數(shù)中的內(nèi)容保持不變;后2條指令是實(shí)現(xiàn)將源操作數(shù)的內(nèi)容和直接地址單元中的內(nèi)容按位執(zhí)行邏輯與運(yùn)算,執(zhí)行后的結(jié)果存放在直接地址單元中,并且源操作數(shù)中的內(nèi)容保持不變。例如:MOV
A,#38H ;38H→(A)MOV
R2,#4AH ;4AH→(R2)ANL
A,R2 ;(A)and(R2)=08H→(A)連續(xù)執(zhí)行這3條指令后的結(jié)果存放在累加器A中,結(jié)果為08H。這種單字節(jié)按位邏輯與運(yùn)算的過程如下圖所示:
3.字節(jié)按位邏輯或運(yùn)算指令(6條)ORL
A,Rn ;n=0~7ORL
A,direct
;direct可以是低128B的RAM單元或SFR地址ORL
A,@Ri ;i=0或1ORL
A,#data ;data可以是任何8bit立即數(shù)ORL
direct,A
ORL
direct,#data前4條指令是實(shí)現(xiàn)將源操作數(shù)的內(nèi)容和累加器A中的內(nèi)容按位執(zhí)行邏輯或運(yùn)算,執(zhí)行后的結(jié)果存放在累加器A中,并且源操作數(shù)中的內(nèi)容保持不變;后2條指令是實(shí)現(xiàn)將源操作數(shù)的內(nèi)容和直接地址單元中的內(nèi)容按位執(zhí)行邏輯或運(yùn)算,執(zhí)行后的結(jié)果存放在直接地址單元中,并且源操作數(shù)中的內(nèi)容保持不變。例如:MOV
A,#38H ;38H→(A)MOV
R2,#4AH ;4AH→(R2)ORL
A,R2 ;(A)or(R2)=7AH→(A)
4.字節(jié)按位邏輯異或運(yùn)算指令XRL
A,Rn ;n=0~7XRL
A,direct
;direct可以是低128B的RAM單元或SFR地址XRL
A,@Ri ;i=0或1XRL
A,#data ;data可以是任何8bit立即數(shù)XRL
direct,A
XRL
direct,#data前4條指令是實(shí)現(xiàn)將源操作數(shù)的內(nèi)容和累加器A中的內(nèi)容按位執(zhí)行邏輯異或運(yùn)算,執(zhí)行后的結(jié)果存放在累加器A中,并且源操作數(shù)中的內(nèi)容保持不變;后2條指令是實(shí)現(xiàn)將源操作數(shù)的內(nèi)容和直接地址單元中的內(nèi)容按位執(zhí)行邏輯異或運(yùn)算,執(zhí)行后的結(jié)果存放在直接地址單元中,并且源操作數(shù)中的內(nèi)容保持不變。例如:MOV
A,#38H ;38H→(A)MOV
R2,#4AH ;4AH→(R2)XRL
A,R2 ;(A)xor(R2)=7AH→(A)3.2.4控制轉(zhuǎn)移類指令控制轉(zhuǎn)換類指令共有17條。
1.無條件轉(zhuǎn)移指令(1條)AJMP
addr11這條指令可以控制程序在2KB(211)地址范圍內(nèi)無條件跳轉(zhuǎn)。使用該指令時(shí)是將64KB的程序存儲(chǔ)器空間分成32個(gè)塊,每個(gè)塊為2KB,那么將要跳轉(zhuǎn)的目標(biāo)地址必須與AJMP的下一條指令的第一個(gè)字節(jié)保持在2KB范圍內(nèi)(即將要跳轉(zhuǎn)的目標(biāo)地址與AJMP下一條指令的地址A15~A11相同)。執(zhí)行該指令時(shí),MCS-51單片機(jī)自動(dòng)先將PC加2(AJMP指令是2字節(jié)指令),然后把a(bǔ)ddr11送入程序計(jì)數(shù)器PC的PC.10~PC.0,同時(shí)保持PC.15~PC.11不變,最終跳轉(zhuǎn)到PC指定的地址繼續(xù)執(zhí)行程序。例如:…AJMP
here…;僅允許2KB的程序代碼here:…
2.相對轉(zhuǎn)移指令(1條)SJMP
rel這也是一種無條件跳轉(zhuǎn)指令,執(zhí)行該指令時(shí),MCS-51系列單片機(jī)自動(dòng)先將PC加2(SJMP指令是2字節(jié)指令),然后把帶有符號(hào)的地址偏移量rel加到PC中,得到將要跳轉(zhuǎn)的目標(biāo)地址在PC中。由于rel是8bit的帶有符號(hào)的地址偏移量,所以跳轉(zhuǎn)的目標(biāo)地址可以在SJMP下一條指令的之前128B到之后127B之間。
3.長跳轉(zhuǎn)指令(1條)LJMP
addr16該指令也是一條無條件跳轉(zhuǎn)指令,而且將要跳轉(zhuǎn)的目標(biāo)地址可以是64KB范圍內(nèi)的任意地址,該指令占用3字節(jié)程序存儲(chǔ)器。執(zhí)行該指令時(shí),MCS-51系列單片機(jī)自動(dòng)將指令的第2和3字節(jié)的內(nèi)容分別裝入PC的高8位和低8位中,然后無條件跳轉(zhuǎn)到PC確定的目標(biāo)地址。
4.散轉(zhuǎn)指令(1條)
JMP
@A+DPTR該指令可以實(shí)現(xiàn)無條件跳轉(zhuǎn),以DPTR的值(16bit的基地址)與A的值(8bit偏移地址)之和作為跳轉(zhuǎn)的目標(biāo)地址。顯然,受偏移量(8bit)的限制,將要跳轉(zhuǎn)的目標(biāo)地址必須位于基地址加256字節(jié)范圍內(nèi)。通過修改偏移量,可以改變跳轉(zhuǎn)的目標(biāo)地址,所以它是程序散轉(zhuǎn)處理。該指令是單字節(jié)指令,占用1個(gè)字節(jié)的程序存儲(chǔ)器。例如:0300H
LCALL
GetKey
;返回值在A中,A的內(nèi)容是鍵值,等于0~3(四個(gè)鍵)0303H
MOV
DPTR,#KeyPro
;基地址為函數(shù)表的起始地址(表頭)0306H
MOV
B,#03H ;03H→(B)0308H
MUL
AB ;執(zhí)行(A)×(B)→(A)0309H
JMP
@A+DPTR
;跳轉(zhuǎn)到以DPTR作為基地址、(A)內(nèi)容作為偏移量的地址
…KeyPro: ;函數(shù)表起始地址(表頭)0800H
LJMP
Key0Pro
;3字節(jié)地址指令,無條件長跳轉(zhuǎn)到“Key0Pro”目標(biāo)地址0803H
LJMP
Key1Pro
;3字節(jié)地址指令,無條件長跳轉(zhuǎn)到“Key1Pro”目標(biāo)地址0806H
LJMP
Key2Pro
;3字節(jié)地址指令,無條件長跳轉(zhuǎn)到“Key2Pro”目標(biāo)地址0809H
LJMP
Key3Pro;3字節(jié)地址指令,無條件長跳轉(zhuǎn)到“Key3Pro”目標(biāo)地址080CH
NOP
…
Key0Pro:;Key0Pro子過程的入口(標(biāo)號(hào)地址)
…
Key1Pro:;Key1Pro子過程的入口(標(biāo)號(hào)地址)
…
Key2Pro:;Key2Pro子過程的入口(標(biāo)號(hào)地址)
…
Key3Pro:;Key3Pro子過程的入口(標(biāo)號(hào)地址)
…
5.累加器是否為零的條件相對轉(zhuǎn)移指令(2條)
JZ
rel;如果累加器A等于零,則跳轉(zhuǎn)到目標(biāo)地址
JNZ
rel;如果累加器A不等于零,則跳轉(zhuǎn)到目標(biāo)地址這是一組條件相對轉(zhuǎn)移指令,執(zhí)行該指令是以“累加器A中的值是否為零”為條件。執(zhí)行指令時(shí),如果條件是“真”(即條件滿足),按照rel偏移量相對跳轉(zhuǎn);如果條件不滿足,則順序執(zhí)行其后的一條指令。將要跳轉(zhuǎn)的目標(biāo)地址可以在下一條指令的之前128B到之后127B之間。例如:XRL_A,#55H;執(zhí)行(A)xor55H→(A)JZ_IsEql;如果(A)=00H,跳轉(zhuǎn)到“IsEql”符號(hào)地址MUL_AB;如果(A)不為00H,則順序執(zhí)行…IsEql:;符號(hào)地址…
6.比較不相等的條件相對轉(zhuǎn)移指令(4條)
CJNE
A,direct,rel
CJNE
A,#data,rel
CJNE
Rn,#data,rel ;n=0~7
CJNE
@Ri,#data,rel ;i=0或1這是一組條件相對跳轉(zhuǎn)指令,這些指令都是以“比較兩個(gè)操作數(shù)是否相等”為條件。如果兩個(gè)操作數(shù)不相等(即條件為“真”),根據(jù)rel指定的偏移量相對跳轉(zhuǎn);如果條件不成立(即兩個(gè)操作數(shù)相等),則順序執(zhí)行下一條指令。注意,執(zhí)行這些指令判斷條件時(shí),會(huì)影響Cy標(biāo)志位,如果第一個(gè)操作數(shù)(無符號(hào)整型)小于第二個(gè)操作數(shù)(無符號(hào)整型),那么進(jìn)位標(biāo)志位Cy被自動(dòng)置位,否則進(jìn)位位自動(dòng)被清零,但是兩個(gè)操作數(shù)中的內(nèi)容都保持不變。例如:
MOV
A,#55H ;55H→(A)
CJNE
A,B,NotEql
;如果(A)不等于(B),跳轉(zhuǎn)到符號(hào)地址“NotEql”
… ;如果(A)=(B),則繼續(xù)執(zhí)行NotEql:
JC
BGreater ;如果(A)<(B),跳轉(zhuǎn)到符號(hào)地址“BGreater”
… ;如果(A)>(B),則繼續(xù)執(zhí)行BGreater:
… ;(A)<(B)時(shí),執(zhí)行下面的指令
7.自減1是否為零的條件相對轉(zhuǎn)移指令(2條)
DJNZ
Rn,rel;n=0~7
DJNZ
direct,rel這是一組條件相對跳轉(zhuǎn)指令,這些執(zhí)行是以“操作數(shù)自減1后是否為零”為條件。如果操作數(shù)自減1后不為零,根據(jù)rel指定的偏移量相對跳轉(zhuǎn);如果條件不成立(即操作數(shù)自減1后為零),則順序執(zhí)行下一條指令。例如下面的延時(shí)子程序:Delay: ;延時(shí)時(shí)間大約為(A)×100
PUSH
06H ;R6壓入堆棧
PUSH
07H ;R7壓入堆棧
MOV
R7,A ;延時(shí)循環(huán)計(jì)數(shù)器在A中,(A)→(R7)times:
MOV
R6,#100
;嵌套循環(huán)計(jì)數(shù)器初始值,100→(R6)times1:
DJNZ
R6,times1
;執(zhí)行(R6)-1→(R6),如果R6不為零,則跳轉(zhuǎn)到times1
DJNZ
R7,times
;執(zhí)行(R7)-1→(R7),如果R7不為零,則跳轉(zhuǎn)到times
POP
07H ;從堆棧中恢復(fù)R7的值
POP
06H ;從堆棧中恢復(fù)R6的值
RET ;子程序返回
8.調(diào)用子程序指令(2條)
ACALL
addr11
LCALL
addr16這是MCS-51系列單片機(jī)的兩條調(diào)用子程序的指令,ACALL指令允許在2KB范圍內(nèi)調(diào)用,而LCALL可以在64KB范圍內(nèi)調(diào)用。在執(zhí)行被調(diào)用的子程序過程中,遇到子程序返回指令(即RET指令),MCS-51系列單片機(jī)將自動(dòng)返回到ACALL或LCALL指令的下面一條指令繼續(xù)執(zhí)行程序。調(diào)用過程與無條件跳轉(zhuǎn)指令的惟一區(qū)別就是調(diào)用過程遇到RET后結(jié)束并返回,而無條件跳轉(zhuǎn)卻不能。執(zhí)行ACALL或LCALL指令的具體過程分三步:首先,當(dāng)前PC的值增加2或3;然后,將PC值分兩次壓入堆棧,PC的低字節(jié)先進(jìn)棧,之后PC的高字節(jié)進(jìn)棧;最后,修改PC的值為指令操作碼所指定的目標(biāo)地址,即PC的值等于被調(diào)用的子程序或子過程的首地址。該指令的執(zhí)行,由于PC值被修改,因而直接跳轉(zhuǎn)到被調(diào)用的子程序。遇到子程序返回指令(即RET指令),PC的值將自動(dòng)從堆棧中恢復(fù),于是程序?qū)⒎祷氐紸CALL或LCALL之后的一句指令繼續(xù)執(zhí)行程序。例如:GetKey:0100H
MOV
A,#04H
;04H→(A)0102H
JB
P1.0,GetKey1
;如果(P1.0)=1,沒有Key0,則跳轉(zhuǎn)到GetKey10105H
ACALL
Delay;PC值進(jìn)棧,跳轉(zhuǎn)到子程序“Delay”0107H
JB
P1.0,GetKey1
;如果(P1.0)=1,沒有Key0,則跳轉(zhuǎn)到GetKey1010AH
MOV
A,#00H
;有Key0鍵,返回值存放在A中…GetKey1:…Delay: ;子程序的首地址0300H
PUSH
06H ;R6壓入堆棧…0309H
POP
06H ;從堆棧中恢復(fù)R6的值030AH
RET;從堆棧中恢復(fù)PC的值,子程序返回
9.子程序返回和中斷返回指令(2條)
RET
RETI這兩條都是子過程的返回指令,其中RET作為一般的子程序返回使用,而RETI作為中斷服務(wù)程序(ISR,InterrupterServiceRoutine)返回專用。在執(zhí)行這兩條指令時(shí),MCS-51系列單片機(jī)首先自動(dòng)從堆棧中恢復(fù)PC的高字節(jié)和低字節(jié)的值,然后返回到PC指定的程序地址繼續(xù)執(zhí)行程序。例如:0000H
LJMP
main
;復(fù)位向量地址,無條件跳轉(zhuǎn)到main0003H
LJMP
INT0_ISR
;INT0中斷向量入口地址,跳轉(zhuǎn)到INT0_ISR0006H
NOP;空操作0007H
NOP;空操作
…ORG
0100H
;程序存放定位,main開始的程序從0100H地址開始存放main:0100H
MOV
SP,#07H
;堆棧指針指向07H,堆棧區(qū)從08H開始0103H
LACLL
Delay
;執(zhí)行該指令先將下一條指令的地址(0106H)壓入堆;棧,先將低8位進(jìn)棧,然后高8位進(jìn)棧(即堆棧區(qū);(08H)=06H(09H)=01H),保存PC之后立即跳到Delay;去執(zhí)行程序0106H
SETB
EX0 ;1→(EX0)0108H
SETB
EA ;1→(EA)010AH
MOV
R0,#30H ;30H→(R0)
…ORG
0200H
;程序存放定位,Delay開始的程序從0200H地址開始存放Delay:0200H
MOV
R6,#06H ;06H→(R6)Delay1:0202H
DJNZ
R6,Delay1 ;執(zhí)行(R6)-1→(R6),然后判斷是否跳轉(zhuǎn)0204H
RET
;子程序返回時(shí),首先從堆棧中恢復(fù)PC的值(0106H),;然后跳轉(zhuǎn)到PC指定的地址(0106H)繼續(xù)執(zhí)行程序
…ORG
0300H
;INT0_ISR開始的程序從0300H地址開始存放INT0_ISR:0300H
NOP ;空操作0301H
JB
P3.2,INT0_ISRret
;如果P3.2為高電平,跳轉(zhuǎn)到INT0_ISRret0304H
SETB
P1.6 ;將P1.6置位INT0_ISRret:0306H
RETI
;中斷服務(wù)程序返回時(shí),首先清除IE0標(biāo)志,并從堆棧中恢復(fù);PC的值,然后按照PC定義的程序地址去執(zhí)行程序
10.空操作指令(1條)NOP執(zhí)行該指令僅影響PC的值,完成(PC)+1→(PC)操作。3.2.5位操作類指令位操作類指令共有17條。
1.位傳送指令(2條)
MOV
C,bit
MOV
bit,C位傳送指令必須以Cy作為其中的一個(gè)操作數(shù),即位傳送指令是實(shí)現(xiàn)直接位地址中的位變量與Cy之間的傳送。例如:
MOV
C,30H;位地址(30H)→Cy
MOV
P1.3,C;將Cy的狀態(tài)寫入位地址P1.3
2.位變量修改指令(6條)
CLR C
SETB CCPL CCLR bit
SETB bit
CPL bit這組指令是將位操作數(shù)進(jìn)行清零、置位和取反操作,前面的3條指令是以Cy作為操作數(shù),后面的3條是以直接位尋址位作為操作數(shù)。例如:CLR
C ;Cy清零操作,0→(Cy)SETB
C ;Cy置位操作,1→(Cy)CPL
C ;Cy取反操作,not(Cy)→(Cy)CLR
30H ;直接位尋址位30H取反操作,0→(30H)SETB
P1.7 ;特殊功能寄存器可位尋址位P1.7置位操作,1→(P1.7)
3.位變量邏輯運(yùn)算指令(4條)
ANL
C,bit
ANL
C,/bit
ORL
C,bit
ORL
C,/bit這組指令都是以Cy作為目的操作數(shù),直接可位尋址位作為源操作數(shù),指令將源操作數(shù)與Cy進(jìn)行“邏輯與”或“邏輯或”,結(jié)果保存在Cy中,并且源操作數(shù)保持不變。如果源操作數(shù)前面帶有“/”符號(hào),表示執(zhí)行邏輯運(yùn)算時(shí),使用源操作數(shù)的反碼作為源操作碼,即使如此也不影響源操作數(shù)的值。例如:ANL
C,30H
;可位尋址位30H和Cy執(zhí)行“邏輯與”操作,結(jié)果存放在Cy中ANL
C,/30H
;可位尋址位30H的反碼和Cy執(zhí)行“邏輯與”操作,結(jié)果存放在Cy中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)學(xué)校學(xué)生停車場租賃協(xié)議
- 奧體中心租賃合同
- 風(fēng)景區(qū)建設(shè)起重機(jī)租賃合同
- 軟件開發(fā)企業(yè)的二手房交易合同
- 美發(fā)服務(wù)租賃合作合同
- 市政工程招投標(biāo)策略填空題
- 校園鋅鋼欄桿安全施工合同
- 電子競技選手聘用合同律師
- 醫(yī)療建筑建造師聘用合同模板
- 光伏醫(yī)院供電系統(tǒng)安裝協(xié)議
- 期末復(fù)習(xí)基礎(chǔ)卷(試題)-2024-2025學(xué)年一年級(jí)上冊數(shù)學(xué)人教版
- 第十章 專題 帶電粒子在電場中運(yùn)動(dòng)的綜合問題 集體備課說課稿模板 -2023-2024學(xué)年高二上學(xué)期物理人教版(2019)必修第三冊
- 高中數(shù)學(xué)64數(shù)列求和省公開課獲獎(jiǎng)?wù)n件市賽課比賽一等獎(jiǎng)?wù)n件
- 《基于單片機(jī)的送餐機(jī)器人定位功能設(shè)計(jì)》9800字(論文)
- 產(chǎn)品經(jīng)理100道面試題
- 胡頹子育苗技術(shù)規(guī)程-地方標(biāo)準(zhǔn)修訂說明
- 2024年度施工員(市政工程)專業(yè)技能知識(shí)考試題庫及答案(共四套)
- 2024年金融理財(cái)-金融理財(cái)師(AFP)考試近5年真題附答案
- 數(shù)字資產(chǎn)管理與優(yōu)化考核試卷
- 2024年內(nèi)部審計(jì)年度工作計(jì)劃范文(六篇)
- 四川省成都市2021-2022學(xué)年物理高一下期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
評論
0/150
提交評論