《MCS-51單片機(jī)原理及嵌入式系統(tǒng)應(yīng)用》課件第3章_第1頁
《MCS-51單片機(jī)原理及嵌入式系統(tǒng)應(yīng)用》課件第3章_第2頁
《MCS-51單片機(jī)原理及嵌入式系統(tǒng)應(yīng)用》課件第3章_第3頁
《MCS-51單片機(jī)原理及嵌入式系統(tǒng)應(yīng)用》課件第3章_第4頁
《MCS-51單片機(jī)原理及嵌入式系統(tǒng)應(yīng)用》課件第3章_第5頁
已閱讀5頁,還剩190頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論