第2章 MCS-51指令系統(tǒng)及程序_第1頁
第2章 MCS-51指令系統(tǒng)及程序_第2頁
第2章 MCS-51指令系統(tǒng)及程序_第3頁
第2章 MCS-51指令系統(tǒng)及程序_第4頁
第2章 MCS-51指令系統(tǒng)及程序_第5頁
已閱讀5頁,還剩137頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第2章51單片機指令系統(tǒng)2.1匯編語言2.2MCS-51單片機的指令系統(tǒng)2.3匯編程序的設(shè)計標(biāo)號是程序員根據(jù)編程需要給指令設(shè)定的符號地址,可有可無;標(biāo)號由1-8個字符組成,第1個字符必須是英文字,不能是數(shù)字或其它符號;標(biāo)號后必須用冒號“:”。操作碼指明執(zhí)行什么性質(zhì)和類型的操作,如數(shù)據(jù)傳送操作,加法操作等。[標(biāo)號:]操作碼助記符[第一操作數(shù)][,第二操作數(shù)][;注釋]2.1匯編語言

2.1.1指令格式操作數(shù)指明操作的數(shù)本身或是操作數(shù)所在的地址。操作數(shù)一般有以下幾種形式:(1)沒有操作數(shù)項,操作數(shù)隱含在操作碼中,如NOP指令;(2)只有1個操作數(shù),如INCA指令;(3)有兩個操作數(shù),如MOVA,#20H指令,操作數(shù)之間以逗號相隔;(4)有三個操作數(shù),如CJNEA,#00H,NEXT指令,操作數(shù)之間也以逗號相隔。注釋是對指令的解釋說明,用以提高程序的可讀性;注釋前必須加分號“;”。[標(biāo)號:]操作碼助記符[第一操作數(shù)][,第二操作數(shù)][;注釋]2.1.2指令中的常用符號Rn:表示當(dāng)前工作寄存器R0~R7中的一個。@Ri:表示寄存器間接尋址,常常作間接尋址的地址指針。其中Ri代表R0和R1寄存器中的一個。Direct:表示內(nèi)部數(shù)據(jù)存貯器單元的地址及特殊功能寄存器SFR的地址,對SFR而言,既可使用它的物理地址,也可直接使用它的符號名字。#date:表示8位立即數(shù),即8位常數(shù),取值范圍為#00H~#0FFH#date16:表示16位立即數(shù),即16位常數(shù),取值范圍為#0000H~#0FFFFHaddr16:表示16位地址addr11:表示11位地址rel:用補碼形式表示的地址偏移量,取值范圍為-128~+127。Bit:表示內(nèi)部RAM和SFR中的具有位尋址功能的位地址。SFR中的位地址可以直接出現(xiàn)在指令中,為了閱讀方便,往往也可用SFR的名字和所在的數(shù)位表示。如:表示PSW中奇偶校驗位,可寫成D0H,也可寫成PSW.0的形式出現(xiàn)在指令中。@:表示間接尋址寄存器或基址寄存器的前綴符號。$:表示當(dāng)前指令的地址。/:位操作數(shù)的前綴,表示對該位操作數(shù)取反,如/bit。X:片內(nèi)RAM的直接地址或寄存器。(X):由X尋址的單元中的內(nèi)容。

尋址就是如何指定操作數(shù)所在的地址。所謂尋址方式,就是如何找到存放操作數(shù)的地址,把操作數(shù)提取出來的方法。

2.1.3指令系統(tǒng)的尋址方式

MCS-51單片機共有7種尋址方式,即:2.1.3指令系統(tǒng)的尋址方式1、立即尋址

立即尋址是指操作數(shù)在指令中直接給出,通常把出現(xiàn)在指令中的操作數(shù)稱為立即數(shù),立即數(shù)作為指令的一部分存放在代碼段里。例如2.1:MOVA,#30H;A←30HMOVDPTR,#1234H;DPTR←234H2、直接尋址直接尋址是將操作數(shù)的地址直接存放在指令中。例2.2:MOV PSW,#20H ;例2.3:MOVA,30H;A←(30H)注意:直接尋址方式只能使用8位二進制數(shù)表示的地址,故尋址范圍只限于內(nèi)部RAM,即低128單元(直接以單元地址給出)和專用寄存器(以單元地址或符號給出)。直接尋址是訪問專用寄存器的唯一方法。3、寄存器尋址將操作數(shù)存放于通用寄存器中,以寄存器的內(nèi)容為操作數(shù)的尋址方式。通用寄存器指A、B、DPTR以及R0~R7。

例2.4:CLRA INCDPTR ADDR5,#20H 4、寄存器間接尋址寄存器間接尋址是以寄存器中內(nèi)容為地址,以該地址中內(nèi)容為操作數(shù)的尋址方式,即操作數(shù)是通過寄存器間接得到的。用來存放操作數(shù)地址的寄存器稱為指針。指針只能用R0、R1和DPTR。

尋址范圍:(1)內(nèi)部數(shù)據(jù)存儲器——指針只能用R0或R1;(2)外部數(shù)據(jù)存儲器——指針用R0和R1或DPTR,外部低256單元的間址寄存器可用R0和R1或DPTR,其他只能用DPTR作為間址寄存器。例2.5:設(shè)(R0)=25H,內(nèi)部RAM(25H)=37H,MOVA,@R0

指令的執(zhí)行結(jié)果是:(A)=37H。其指令操作過程示意圖如圖所示。寄存器間接尋址示意圖

注意:為了與寄存器尋址區(qū)別開,寄存器間接尋址方式要在寄存器前加@;間接尋址不能對SFR尋址。5、變址尋址將基址寄存器與變址寄存器的內(nèi)容相加,結(jié)果作為操作數(shù)的地址。DPTR或PC是基址寄存器;累加器A是變址寄存器;該類尋址方式主要用于查表操作。例2.6:設(shè)(A)=02H,(DPTR)=2000H,外部ROM中,(2002H)=55H執(zhí)行指令MOVCA,@A+DPTR結(jié)果是(A)=55H程序器2000HDPTR02HA2002H55H02H2000H55H圖2.2變址尋址示意圖說明:(1)變址尋址只能針對程序存儲器進行尋址,尋址范圍64K;(2)變址尋址指令只有3條:MOVCA,@A+DPTR;MOVCA,@A+PC;ROM讀指令JMP@A+DPTR;無條件轉(zhuǎn)移指令(3)均為單字節(jié)指令6、相對尋址以當(dāng)前程序計數(shù)器PC的內(nèi)容為基礎(chǔ),加上指令給出的一字節(jié)補碼數(shù)(偏移量)形成新的PC值的尋址方式,新的PC值作為跳轉(zhuǎn)指令的轉(zhuǎn)移地址(也稱目的地址)。試問偏移量的范圍為多少?-128~+127相對轉(zhuǎn)移是以轉(zhuǎn)移指令所在的地址為基點,向前(地址增加)最大可轉(zhuǎn)移(127+轉(zhuǎn)移指令字節(jié))個單元地址,向后(地址減少)最大可轉(zhuǎn)移(128-轉(zhuǎn)移指令字節(jié))個單元地址。1000H操作碼1002HPC+2ROM38HA1001H1002H操作數(shù)103AH圖2-3相對尋址示意圖例2.7:1000H:SJMP38H7、位尋址

位尋址是指對片內(nèi)RAM中20H~2FH中的128個位地址,以及SFR中的11個可進行位尋址的寄存器中的位地址尋址。例2.8:

MOVC,20H

②MOVA,20H

①指令是位尋址指令,它是將位尋址區(qū)中位地址為20H中的內(nèi)容,送給位累加器C,傳送的是一位二進制數(shù)。

②指令是字節(jié)地址尋址指令,此指令是將內(nèi)部RAM中20H單元中的內(nèi)容送給累加器A,傳送的是8位二進制數(shù)。8051單片機尋址方式小結(jié)對片內(nèi)外程序存儲器只能使用變址尋址方式,即變址尋址是一種專門用于程序存儲器的尋址方式。內(nèi)部數(shù)據(jù)存儲器的尋址方式較多。對于外部數(shù)據(jù)存儲器,只能使用寄存器間接尋址方式。立即數(shù)尋址方式只涉及到8位或16位數(shù)據(jù),已經(jīng)在指令中給出。8051單片機尋址方式小結(jié)相對尋址只解決程序轉(zhuǎn)移問題。在兩個操作數(shù)的指令中,把左邊操作數(shù)稱之為目的操作數(shù),而右邊操作數(shù)稱之為源操作數(shù)。我們所講的各種尋址方式都是針對源操作數(shù)的。但實際上源操作數(shù)和目的操作數(shù)都有尋址問題。8051單片機尋址方式小結(jié)2.2

MCS-51單片機的指令系統(tǒng)

51系列單片機指令系統(tǒng)由111條指令組成。

MCS-51指令系統(tǒng)可分為五大類:

數(shù)據(jù)傳送指令(28條);

算術(shù)運算指令(24條);

邏輯運算及移位指令(25條);

控制轉(zhuǎn)移指令(17條);

位操作指令或布爾操作(17條)2.2.1

數(shù)據(jù)傳送指令

數(shù)據(jù)傳送操作是把數(shù)據(jù)從源地址傳送到目的地址,指令執(zhí)行后源地址內(nèi)容不變,目的操作數(shù)被源操作數(shù)所代替。累加器A寄存器Rn寄存器DPTR直接地址direct間接地址@Ri立即數(shù)#data圖2-4MCS-51單片機片內(nèi)數(shù)據(jù)傳送圖1.內(nèi)部數(shù)據(jù)傳送指令(1)以累加器A為目的操作數(shù)的指令

匯編指令格式

操作 字節(jié)周期

MOV

A,Rn

;

(Rn)→A 11

MOV

A,direct

;

(direct)→A21

MOV

A,@Ri

;

((Ri))→A11

MOV

A,#data

;#data→A21

(2)以寄存器Rn為目的操作數(shù)的指令(3條)

匯編指令格式

操作字節(jié)周期MOV

Rn,A

;

(A)→Rn11

MOV

Rn,direct

;

(direct)→Rn22

MOV

Rn,#data;#data→Rn21

這組指令的功能是把源操作數(shù)所指定的內(nèi)容送到當(dāng)前工作寄存器組R0~R7中的某個寄存器。注意:89C51指令系統(tǒng)中沒有“MOV

Rn,Rn”傳送指令。問題:是否可以進行寄存器之間的直接尋址傳送?如欲進行MOV

R1,R2,可否用指令MOV

R1,02H?(3)以直接地址為目的操作數(shù)的指令(5條)

匯編指令格式

操作 字節(jié)周期MOV

direct,A

;(A)→direct21

MOV

direct,Rn

;(Rn)→direct22

MOV

direct,direct;(源direct)→32(目的direct)

MOV

direct,@Ri

;((Ri))→direct22

MOVdirect,#data

;#data→direct32(4)以間接地址為目的操作數(shù)的指令(3條)

匯編指令格式

操作

字節(jié)周期

MOV

@Ri,A

;

(A)→(Ri)11

MOV

@Ri,direct

;

(direct)→(Ri)22

MOV

@Ri,#data

;#data→(Ri)21

(Ri)表示Ri中的內(nèi)容為指定的RAM單元。

(5)以DPTR為目的操作數(shù)

(1條)

匯編指令格式

操作

字節(jié)周期MOV

DPTR,#DATA16;

dataH→DPH,32dataL→DPL

這是唯一的16位立即數(shù)傳送指令,其功能是把16位常數(shù)送入DPTR。DPTR由DPH和DPL組成。例如:MOV

DPTR,#1234H

結(jié)果為(DPTR)=1234H。(DPH)=12H,(DPL)=34H

2、外部RAM及I/O端口與累加器A之間的數(shù)據(jù)傳送

CPU訪問片外RAM只能采用寄存器間接尋址的方式,并且只能通過累加器。

指令格式

操作字節(jié)周期MOVX

A,@Ri

;((Ri))→A,且使/RD=0

12MOVX

A,@DPTR

;((DPTR))→A,使/RD=01

2MOVX

@Ri,A

;(A)→(Ri),使/WR=0

12MOVX

@DPTR,A

;(A)→(DPTR),使/WR=012

NOTE:在MCS-51系統(tǒng)中,由于擴展I/O端口與外部RAM統(tǒng)一編址,即擴展I/O端口地址占用外部RAM地址空間的某一單元,因此外部RAM及擴展I/O端口的讀寫操作指令、操作時序完全相同。只能通過累加器A存取外部RAM和擴展I/O端口。指令尋址空間分別為多少?①使用@DPTR尋址的指令,訪問64K范圍。②使用@Ri尋址的指令,訪問256B范圍。例2.13:已知片外RAM(2000H)=33H,讀外部RAM的2000H單元的程序段:MOVDPTR,#2000HMOVXA,@DPTR指令執(zhí)行后,(A)=33H例2.14:將累加器A的內(nèi)容送到外部2000H單元的程序段:MOVP2,#20HMOVR0,#00HMOVX@R0,A3、累加器A與程序存儲器ROM之間的數(shù)據(jù)傳送指令(查表指令,常用來查一個已做好在ROM中的表格)

MOVCA,@A+PC

MOVCA,@A+DPTR;均為單字節(jié)指令例2.15:

ORG8000H

8000H

MOV

A,

#30H;占用兩個字節(jié)單元

8002H

MOVCA,

@A+PC;取出MOVC指令后,(PC)=8003H…ORG8030HDB‘ABCDEFGHIJ’上述查表指令執(zhí)行后,將8003H+30H=8033H地址所對應(yīng)的程序存儲器中的內(nèi)容44H(字符‘D’的ASCII碼)送到累加器A中。如果R0中的值為2,則運行結(jié)果為(DPTR)=?(ACC)=?0102H44、數(shù)據(jù)交換指令(1)字節(jié)交換指令XCHA,Rn XCHA,direct XCHA,@Ri

(2)半字節(jié)交換指令(字節(jié)單元與累加器A進行低4位的半字節(jié)交換)XCHDA,@Ri A半字節(jié)RAM半字節(jié)半字節(jié)交換操作A一字節(jié)

源操作數(shù)一字節(jié)4、數(shù)據(jù)交換指令(3)累加器高低半字節(jié)交換指令SWAPA;

例如:(R0)=20H,(A)=3FH,(20H)=75H,分別執(zhí)行下列指令后,XCHA,R0;XCHA,@R0;XCHDA,@R0;SWAPA

4、堆棧操作

堆棧是在片內(nèi)RAM中按“先進后出,后進先出”原則設(shè)置的專用存儲區(qū)。設(shè)置堆棧操作的目的是為了保護斷點和現(xiàn)場,以便在子程序或中斷服務(wù)子程序運行結(jié)束后,能正確返回主程序。

數(shù)據(jù)的進棧、出棧由指針SP統(tǒng)一管理。堆棧的操作有如下兩條專用指令:PUSHdirect;SP←(SP+1),((SP))←(direct)POP direct;direct←((SP)),SP←SP-1

例2.16:

設(shè)(SP)=30H,(50H)=43,執(zhí)行指令

PUSH50H結(jié)果:(SP)=31H,(31H)=43H,執(zhí)行過程如圖2.5所示。例2.17:設(shè)(SP)=35H,(35H)=66H,執(zhí)行指令

POP40H結(jié)果:(40H)=66H,(SP)=34H,執(zhí)行過程如圖2.6所示。

圖2.5PUSH指令示意圖××片內(nèi)43H50H31H30HSP××40H執(zhí)行前片內(nèi)43H50H31H30H43H××SP40H執(zhí)行前PUSH指令后圖2.6POP指令示意圖片內(nèi)40H11H10HSP50H片內(nèi)50H35H10H66H××SP40H66H66H××××執(zhí)行前執(zhí)行POP指令后堆棧操作實際上是通過堆棧指針SP進行的讀寫操作,是以SP為間址寄存器的間接尋址方式。但因為在系統(tǒng)中SP是唯一的,所以在指令中把通過SP的間接尋址的操作數(shù)項隱含了,只表示出直接尋址的操作數(shù)項。例:2.2.2算術(shù)運算類指令

算術(shù)運算結(jié)果將進位CY、半進位AC、溢出位OV三個標(biāo)志位置位或復(fù)位,只有加1和減1指令不影響這些標(biāo)志位。(針對8位無符號二進制數(shù))1、加法指令

ADDA,Rn

;A←(A)+(Rn)ADDA,direct ;A←(A)+(direct)ADDA,@Ri

;A←(A)+((Ri))

ADDA,#data;A←(A)+#data使用加法指令時要注意對程序狀態(tài)字PSW的影響:如果位3有進位,則輔助進位標(biāo)志AC置1,反之AC清0;如果位7有進位,則進位標(biāo)志CY置1,反之CY清0;若位6有進位而位7沒有進位或者位7有進位而位6沒有進位,則溢出標(biāo)志OV置1,否則清0.溢出標(biāo)志的狀態(tài),只有在符號數(shù)加法運算時才有意義。當(dāng)兩符號數(shù)相加時,如果OV=1,則表示加法運算超出了累加器A所能表示的符號數(shù)有效范圍,即產(chǎn)生溢出,運算結(jié)果錯誤。例如:(A)=C2H,(R0)=A9H,執(zhí)行ADDA,R0指令。+1←運行結(jié)果:(A)=6BH,AC=0,CY=1,OV=1如果C2H和A9H為無符號數(shù),則結(jié)果正確。如果C2H和A9H為符號數(shù),則結(jié)果不正確。(兩個負數(shù)相加不可能得到正數(shù))2、帶進位加指令A(yù)DDCA,Rn ;A←(A)+(Rn)+CADDCA,direct;A←(A)+(direct)+CADDCA,@Ri ;A←(A)+(Ri)+CADDCA,#data;A←(A)+#data+C帶進位加指令對CY、AC、OV的影響與前述相同。該類型指令常用于多字節(jié)數(shù)的加法運算。例如:編寫三字節(jié)無符號數(shù)的加法程序。假設(shè)被加數(shù)放在內(nèi)部RAM20H~22H(低位在前),加數(shù)放在內(nèi)部RAM2AH~2CH單元(低位在前)。MOVR0,#20H;被加數(shù)首地址MOVR1,#2AH;加數(shù)首地址MOVR7,#03H;字節(jié)數(shù)CLRC;清進位標(biāo)志LOOP:MOVA,@R0;取被加數(shù)的一個字節(jié)ADDCA,@R1;與加數(shù)的一個字節(jié)相加MOV@R0,A;暫存中間結(jié)果INCR0;地址增量INCR1;DJNZR7,LOOP;次數(shù)減1,不為0轉(zhuǎn)移CLRAADDCA,#OOH;處理進位MOV@R0,A;存進位3、帶借位減指令SUBBA,Rn ;A←(A)-(Rn)-CSUBBA,direct;A←(A)-(direct)-CSUBBA,@Ri;A←(A)–(Ri)-CSUBBA,#data;A←(A)-data–C使用該指令時要注意對程序狀態(tài)字PSW的影響:

如果位3有借位,則輔助進位標(biāo)志AC置1,反之AC清0;如果位7有借位,則進位標(biāo)志CY置1,反之CY清0;若位6有借位而位7沒有借位或者位7有借位而位6沒有借位,則溢出標(biāo)志OV置1,否則清0.溢出標(biāo)志的狀態(tài),只有在符號數(shù)減法運算時才有意義。當(dāng)兩符號數(shù)相減時,如果OV=1,則表示減法運算超出了累加器A所能表示的符號數(shù)有效范圍,即產(chǎn)生溢出,運算結(jié)果錯誤。MSBLSB例如:(A)=C9H,(R2)=54H,CY=1執(zhí)行SUBBA,R2指令。運行結(jié)果:(A)=74H,CY=1,OV=1如果C9H和54H為無符號數(shù),則結(jié)果正確。如果C9H和54H為符號數(shù),則結(jié)果不正確。(負數(shù)減去正數(shù)不可能得到正數(shù))—14、乘法指令

MULAB

;BA←A×B功能:實現(xiàn)累加器A和B寄存器中的兩個8位無符號數(shù)相乘,16位乘積的低8位放在累加器A中,高8位放在B寄存器中。單字節(jié)指令,執(zhí)行時間最長(4個機器周期)影響PSW的狀態(tài):(1)進位標(biāo)志CY總是清0;(2)溢出標(biāo)志OV與乘積有關(guān),OV=1表示乘積超過255,即乘積分別在B與A中,否則OV=0,表示乘積只在A中,即乘積小于FFH(B=00H)。例2.20:

(A)=30H,(B)=60H,

執(zhí)行MULAB

結(jié)果:(A)=00H,(B)=12H。OV=?CY=?5、除法指令

DIVAB;功能:實現(xiàn)累加器A和B寄存器中的兩個8位無符號相除,其中商存放累加器A中,余數(shù)存放在B中。單字節(jié)指令,執(zhí)行時間最長(4個機器周期).影響PSW的狀態(tài):(1)進位標(biāo)志CY總是清0;(2)溢出標(biāo)志OV反映除數(shù)情況,當(dāng)除數(shù)為0,置OV=1,表明除法無意義,其他情況下OV=0。例2.21

(A)=0B4H(即180),(B)=18H(即24)

執(zhí)行DIVAB結(jié)果為(A)=07H…商(B)=0CH…余數(shù),CY=0,(OV)=0,(P)=16、加1指令I(lǐng)NCA ;A←(A)+1INCRn ;Rn←(Rn)+1INCdirect ;direct←(direct)+1INC@Ri ;(Ri)←((Ri))+1INCDPTR ;DPTR←(DPTR)+1INC指令不影響程序狀態(tài)字PSW的進位標(biāo)志CY,即使INCDPTR在加1過程中低8位有進位,也是直接進上高8位而不是置進位標(biāo)志CY。7、減1指令DECA ;A←(A)-1DECRn ;Rn←(Rn)-1DECdirect ;direct←(direct)-1DEC@Ri ;(Ri)←(Ri)-1DEC指令不影響程序狀態(tài)字PSW的進位標(biāo)志CY。對于數(shù)據(jù)指針DPTR,沒有減1指令,只能通過編程實現(xiàn)DPTR-1。加1減1指令,通常配合寄存器間接尋址指令,用于修改地址指針。8.十進制調(diào)整指令DAA

該指令專用于BCD碼加法運算的十進制調(diào)整。

該指令一般是跟在ADD或ADDC指令之后,并且是兩個壓縮型BCD數(shù)相加。使用該指令是為了把累加器A中和進行調(diào)整。調(diào)整的實質(zhì)是將十六進制的加法運算轉(zhuǎn)換成十進制,具體調(diào)整方法為:①若累加器A的低4位大于9(A-F),或者輔助進位位AC=1,則累加器A的內(nèi)容加06H(A←(A)+06H),且將AC置“1”。②若累加器A的高4位大于9(A-F),或進位位CY=1,則累加器A的內(nèi)容加60H(A←(A)+60H),且將CY置“1”。調(diào)整后,輔助進位位AC表示十進數(shù)中個位向十位的進位,進位標(biāo)志CY表示十位向百位的進位。例2.22:(A)=65BCD,(B)=78BCD,CY=0

ADD A,BDA A指令執(zhí)行后,(A)=43BCD,(CY)=1。2.2.3邏輯運算與循環(huán)類指令1、邏輯“與”指令

ANL

A,Rn

;A←(A)∧Rn)

ANL

A,direct;A←(A)∧(direct)

ANL

A,#data;A←(A)∧data

ANL

A,@Ri

;A←(A)∧((Ri))

ANL

direct,A;direct←(direct)∧(A)

ANL

direct,#data

;direct←(direct)∧#dataANL

A,#data該指令可用于對目的操作數(shù)的某一位或某幾位清零例2.23ANLP1,#0FHP1口鎖存器的高4位清零,低4位不變。2、邏輯“或”指令ORLA,Rn;A←(A)∨(Rn),n=0~7

ORLA,direct

;A←(A)∨(direct)

ORLA,#data

;A←(A)∨data

ORLA,@Ri;A←(A)∨((Ri)),i=0,1

ORLdirect,A

;direct←(direct)∨(A)

ORLdirect,#data;direct←(direct)∨#data

ORLA,#data

該指令可用于對目的操作數(shù)的某一位或某幾位取反

例2.25

(P1)=05H,(A)=33H,執(zhí)行指令

ORL

P1,A3、邏輯“異或”指令

XRL

A,Rn

;A←(A)⊕(Rn)

XRL

A,direct

;A←(A)⊕(direct)

XRL

A,@Ri

;A←(A)⊕((Ri)),i=0,1

XRL

A,#data

;A←(A)⊕#data

XRL

direct,A

;direct←(direct)⊕(A)

XRL

direct,#data

;direct←(direct)⊕#data

XRLA,#data

該指令可用于對目的操作數(shù)的某一位或某幾位置1

例2.26.

設(shè)(A)=90H,(R2)=72H指令執(zhí)行XRL

A,R2

結(jié)果:(A)=0E2H,(R2)=72H。

4、求反與清零指令①CLR

A

功能是累加器A清“0”。不影響Cy、Ac、OV等標(biāo)志。②CPL

A

功能是將累加器A的內(nèi)容按位邏輯取反,不影響標(biāo)志。

例2.28:設(shè)(A)=00110110B=36;

執(zhí)行指令:CPLA

結(jié)果:(A)=11001001B=C9H5、循環(huán)指令①RLA②RRA③RLCA④RRCAA.7 A.0A.7 A.0A.7 A.0CYCYA.7 A.0⑤累加器ACC半字節(jié)交換指令

SWAP

A

;(A0~3)(A4~7)

2.2.4程序轉(zhuǎn)移類指令 1、無條件轉(zhuǎn)移指令①

絕對(短)轉(zhuǎn)移指令A(yù)JMPaddr11;PC←PC+2,PC10~0←addr11

這是一條2K字節(jié)范圍內(nèi)的無條件跳轉(zhuǎn)指令,轉(zhuǎn)移的目標(biāo)地址必須與AJMP下一條指令的地址的高5位地址碼A15~A11相同。

執(zhí)行指令時,PC先加2,然后把addrll送入PC.10~PC.0,PC.15~PC.11保持不變。由于該指令只修改PC的部分內(nèi)容,所以通過該指令形成的目的地址只在2K內(nèi)變化。例如:2070HAJMP16AH結(jié)果為(PC)=216AH②

長轉(zhuǎn)移指令

LJMP addr16 ;PC←addr16功能:把指令第二、第三個字節(jié)的內(nèi)容即指令提供的16位目的地址送入PC,然后程序無條件地轉(zhuǎn)移到目標(biāo)地址處。

因為addr16是一個16位二進制地址,地址范圍0000H~FFFFH,因此可在64KB范圍內(nèi)轉(zhuǎn)移。③短(相對)轉(zhuǎn)移指令

SJMP rel ;PC←PC+2+rel功能:先使程序計數(shù)器PC加2,然后指令提供的有符號的地址偏移量rel和PC相加,得到目的地址。轉(zhuǎn)移的范圍為-128-+127字節(jié)。

偏移量rel計算:向前轉(zhuǎn)移——rel=目的地址-(源地址+2)=地址差-2向后轉(zhuǎn)移——rel=(目的地址-(源地址+2))補=FEH-地址差例如:835AHSJMP35H向前還是向后轉(zhuǎn)移?目的地址:向前轉(zhuǎn)移8391H再如:835AHSJMP0E7H向前還是向后轉(zhuǎn)移?目的地址:向后轉(zhuǎn)移8343H④間接轉(zhuǎn)移指令(散轉(zhuǎn)指令)JMP@A+DPTR ;PC←A+DPTR功能:將累加器A中8位無符號數(shù)二進制數(shù)與數(shù)據(jù)指針DPTR的內(nèi)容相加,以形成目的地址送入PC,實現(xiàn)無條件轉(zhuǎn)移操作。特點:轉(zhuǎn)移地址可以在程序運行中加以改變。因此這條指令具有多分支轉(zhuǎn)移的功能,該功能稱為散轉(zhuǎn)功能,間接長轉(zhuǎn)移指令又稱為散轉(zhuǎn)指令。例2.30RLAMOVDPTR,#TAB;將TAB代表的地址送入DPTRJMP@A+DPTR;跳轉(zhuǎn)AJMPROUT0;跳轉(zhuǎn)ROUT0開始的程序段AJMPROUT1;跳轉(zhuǎn)ROUT1開始的程序段AJMPROUT2;跳轉(zhuǎn)ROUT2開始的程序段AJMPROUT3;跳轉(zhuǎn)ROUT3開始的程序段...ROUT0:...ROUT1:...ROUT2:...ROUT3:TAB:TAB+2:TAB+4:TAB+6:為什么需要RLA?去掉可不可以2、條件轉(zhuǎn)移指令

條件轉(zhuǎn)移指令的操作是判斷指定的條件,如果條件滿足則轉(zhuǎn)移,不滿足則順序執(zhí)行。

該類指令都采用相對尋址方式,轉(zhuǎn)移范圍共256字節(jié)(-128~127B)。當(dāng)條件滿足時,把PC的當(dāng)前值(下一條指令的第一個字節(jié)的地址)與相對偏移量rel相加形成轉(zhuǎn)移的目標(biāo)地址。

①累加器判零轉(zhuǎn)移指令

JZrel;A=0,(PC)←(PC)+2+relJNZrel;A≠0,(PC)←(PC)+2+rel②比較轉(zhuǎn)移指令CJNEA,#data,rel;累加器內(nèi)容與立即數(shù)不等轉(zhuǎn)移CJNEA,direct,rel:累加器內(nèi)容與內(nèi)部RAM單元內(nèi)容不等轉(zhuǎn)移CJNERn,#data,rel;寄存器內(nèi)容與立即數(shù)不等轉(zhuǎn)移CJNE@Ri,#data,rel;內(nèi)部RAM前128單元內(nèi)容與立即數(shù)不等轉(zhuǎn)移功能說明:程序轉(zhuǎn)移:若左操作數(shù)=右操作數(shù),則程序順序執(zhí)行,PC←(PC)+3,CY←0若左操作數(shù)>右操作數(shù),則程序轉(zhuǎn)移,PC←(PC)+3+rel,CY←0若左操作數(shù)<右操作數(shù),則程序轉(zhuǎn)移,PC←(PC)+3+rel,CY←1數(shù)值比較例2.31:MOVA,R0CJNEA,#10H,L1;MOVR1,#0; AJMPL3

L1:JCL2 MOVR1,#0AAH; AJMPL3L2:MOVR1,#0FFH

L3:AJMPL3因此最終結(jié)果是:本程序執(zhí)行前,

如果R0=10H,則R1=00H;如果R0>10H,則R1=0AAH;

如果R0<10H,則R1=0FFH。③減1非0轉(zhuǎn)移指令

DJNZRn,rel

;Rn←(Rn)-1,

若(Rn)≠0,(PC)←(PC)+2+rel;

若(Rn)=0,(PC)←(PC)+2

指令功能:工作寄存器Rn減1不等于0,則,轉(zhuǎn)移到偏移量所指向的地址,否則程序往下執(zhí)行。

DJNZdirect,rel

;direct←(direct)-1,

若direct≠0,(PC)←(PC)+2+rel;

若direct=0,(PC)←(PC)+2

指令功能:直接地址單元中的內(nèi)容減1不等于0,則轉(zhuǎn)移到偏移量所指向的地址,否則程序往下執(zhí)行④位轉(zhuǎn)移指令

JC rel 若Cy=1,則轉(zhuǎn)移PC←PC+2+rel;否則程序順序執(zhí)行JNC rel

若Cy=0,則轉(zhuǎn)移PC←PC+2+rel;否則程序順序執(zhí)行JB bit,rel若(bit)=1,則轉(zhuǎn)移PC←PC+3+rel;否則程序順序執(zhí)行JNB bit,rel

若(bit)=0,則轉(zhuǎn)移,PC←PC+3+rel;否則程序順序執(zhí)行(1)調(diào)用子程序指令

在程序設(shè)計中,通常將反復(fù)出現(xiàn)、具有通用性和功能相對獨立的程序段設(shè)計成子程序。子程序可以有效地縮短程序長度、節(jié)約存儲空間;可被其他程序共享以及便于模塊化、便于閱瀆、調(diào)試和修改。子程序主程序斷點主程序圖2.7子程序調(diào)用示意圖2.2.5調(diào)用子程序及返回指令①長調(diào)用指令

LCALLaddr16

;三字節(jié)指令

PC←PC+3,SP←SP+1,(SP)←PC7~0;SP←SP+1,(SP)←PC15~8,PC←addr16

長調(diào)用指令的16位目標(biāo)地址由指令直接給出,所以子程序可放在64KB空間的任何地方。

指令的執(zhí)行過程是把本指令的第2、3個字節(jié)分別裝入PC的高8位和低8位)獲得子程序的入口地址,并把該斷點地址入棧(斷點地址保護),即該指令在執(zhí)行過程需要完成兩項操作,即斷點保護與構(gòu)造目的地址。例如:(SP)=60H,標(biāo)號START為0100H,標(biāo)號MIR為8100H,執(zhí)行START:LCALLMIR。結(jié)果為(SP)=62H,(61H)=03H,(62H)=01H,(PC)=8100H②絕對調(diào)用指令

ACALLaddr11

;PC←PC+2,SP←SP+1,(SP)←PC7~0;SP←SP+1,(SP)←PC15~8,PC10~0←addr11指令執(zhí)行過程:

PC加2(本指令代碼為兩個字節(jié))獲得下一條指令的地址,把該斷點地址(當(dāng)前的PC值)入棧,將斷點地址的高五位與11位目標(biāo)地址(指令代碼第一字節(jié)的高3位,以及第二字節(jié)的八位)連接構(gòu)成16位的子程序入口地址,使程序轉(zhuǎn)向子程序。注意:

調(diào)用子程序的入口地址和ACALL指令的下一條指令的地址,其高五位必須相同,因此子程序的入口地址和ACALL指令下一條指的第一個字節(jié)必須在同一個2KB范圍內(nèi)。2返回指令

RET

;PC15~8←(SP),SP←SP-1

;PC7~0←(SP),SP←SP-1

返回指令的功能是恢復(fù)斷點地址,即從堆棧中取出斷點地址送給PC,子程序通過RET指令返回主程序。RETI

;PC15~8←(SP),SP←SP-1

;PC7~0←(SP),SP←SP-1

功能與RET指令相似,兩指令不同之處是該指令清除了中斷響應(yīng)時被置“1”的內(nèi)部中斷優(yōu)先級寄存器的優(yōu)先級狀態(tài)。2.2.6位操作指令1、位數(shù)據(jù)傳送指令MOV C,bit ;C←(bit)MOV bit,C ;bit←C例2.32

MOV

C,06H

;(20H).6→Cy

06H是內(nèi)部RAM20H字節(jié)位6的位地址。

例2.33

MOV

P1.0,C

;Cy→P1.02、位狀態(tài)修改指令注意:沒有MOVbit,bit指令CLR C ;C←0CLR bit ;(bit)←0CPL C ;C←CPL bit ;(bit)←(bit)SETB C ;C←1SETB bit ;(bit)←1該組指令將操作數(shù)指定的位清“0”、求反、置“1”,

不影響其它標(biāo)志。例2.34:

SETB3DH;將27H.5位置1 CLRC;Cy位清02、位狀態(tài)修改指令3、位邏輯運算指令A(yù)NL C,bit ;C←C∧(bit)ANL C,/bit ;C←C∧(bit)ORL C,bit ;C←C∨(bit)ORL C,/bit ;C←C∨(bit例如:程序如下,試說明該程序的功能。E、B和D均為位地址。MOVC,BANLC,/EMOVD,CMOVC,EANLC,/BORLC,DMOVD,C通過位邏輯運算可以對各種組合邏輯電路進行模擬,即用軟件的方法來獲得組合邏輯電路的功能補充內(nèi)容

——I/O口訪問指令使用說明8051有4個8位雙向I/O口,供單片機輸入/輸出數(shù)據(jù)使用。端口的每一位均由鎖存器、輸出驅(qū)動器和輸入緩沖器組成。對這些口可以進行按口尋址,進行字節(jié)操作;也可以按口線尋址,進行位操作。使用過程要注意對口的操作的一些特殊問題,(A)I/O的結(jié)構(gòu)P0口:字節(jié)地址80H,位地址80H~87HP0口某一位電路包括:1個數(shù)據(jù)輸出鎖存器,用于數(shù)據(jù)位鎖存2個三態(tài)數(shù)據(jù)輸入緩沖器,分別用于鎖存器數(shù)據(jù)和和引腳數(shù)據(jù)的輸入緩沖。1個多路轉(zhuǎn)換開關(guān)MUX:在控制信號的作用下,由MUX實現(xiàn)鎖存器輸出和地址/數(shù)據(jù)線之間的接通轉(zhuǎn)接。數(shù)據(jù)輸出的驅(qū)動和控制電路,由2個場效應(yīng)管組成,上面的場效應(yīng)管構(gòu)成上來電路。開關(guān)輸入來自鎖存器和“地址/數(shù)據(jù)”,輸入轉(zhuǎn)接由“控制”信號控制。其作用是使P0口既可作為通用I/O口,又可以作為單片機的地址/數(shù)據(jù)線使用。在傳輸?shù)刂坊驍?shù)據(jù)時,CPU發(fā)出控制信號,打開上面的與門,使MUX打向上邊,使內(nèi)部地址/數(shù)據(jù)線與下面的FET處于反相接通狀態(tài),此時的輸出驅(qū)動電路由于上下兩個FET處于反相,行程推拉式電路結(jié)構(gòu),提高了負載能力。當(dāng)輸入數(shù)據(jù)時,數(shù)據(jù)信號直接從引腳通過輸入緩沖器進入內(nèi)部總線。P0口作為通用I/O使用時,控制信號為0,封鎖了與門,并將輸出驅(qū)動電路的上拉FET截止,MUX打向下邊,與D鎖存器的/Q端接通。P0作為輸出口時,來自CPU的“寫入”脈沖加在D鎖存器的CP端,內(nèi)部總線的數(shù)據(jù)寫入D鎖存器,并向端口引腳輸出。由于輸出電路是漏極開路,須外接上拉電阻才能有高電平輸出。P0作為輸入口使用時,應(yīng)區(qū)分讀引腳和讀端口(讀鎖存器)。(1)讀引腳:直接讀取引腳P0.X的狀態(tài),此時由讀引腳信號把下方的緩沖器打開,引腳的狀態(tài)經(jīng)過緩沖器讀入內(nèi)部總線。(2)讀端口:讀鎖存器信號打開上面的緩沖器把鎖存器Q端的狀態(tài)讀入內(nèi)部總線。P1口:只能作為通用I/O口字節(jié)地址90H,位地址90H~97HP1口位結(jié)構(gòu)電路原理如圖所示。使用P1口時,應(yīng)注意:(1)P1作為輸出時,不需要外接上拉電阻;(2)作為輸入時,應(yīng)先向鎖存器寫入1,使其輸出驅(qū)動電路FET截止。P2口:字節(jié)地址A0HP2口的位結(jié)構(gòu)電路原理圖如圖所示。注意:MUX其中一個輸入端是單一的“地址”。P2口只作為地址線使用,口的輸出用不著是三態(tài),即P2為準雙向口;作為通用I/O,MUX接通鎖存器Q端。P3口:字節(jié)地址B0H(1)對于作為第二功能輸出的引腳,當(dāng)作為通用I/O時,電路中的“第二輸出功能”線應(yīng)保持高電平,與非門開通,使鎖存器的Q端輸出保持暢通。當(dāng)輸出第二功能信號,該鎖存器應(yīng)預(yù)先置1,使與非門對“第二功能”信號的輸出是暢通的,從而實現(xiàn)第二功能信號輸出。(2)對于作為第二功能輸入的引腳,在口線引腳內(nèi)部增加了1個緩沖器,輸入的信號從此緩沖器的輸出端獲得。而作為通用I/O使用的數(shù)據(jù)輸入,仍取自三態(tài)緩沖器的輸出端。P3口無論作為輸入口還是第二功能信號的輸入,鎖存器輸出和第二輸出功能線都應(yīng)保持高電平。(B)對口操作的指令按口操作指令:凡是能對專用寄存器尋址的指令都能用于口的操作,其中典型代表是口輸入/輸出(MOV指令)。輸出數(shù)據(jù)時,用MOV指令把輸出數(shù)據(jù)寫入各口線電路的鎖存器。輸入數(shù)據(jù)時,用MOV指令把各口線的引腳狀態(tài)讀入。例如:MOVPm,AMOVA,PmMOVPm,#dataMOVdirect,PmMOVPm,direct按口線操作的指令:對口來說,尋址的就是口線。例如MOVPm.n,CMOVC,Pm.nSETBPm.n(C)讀引腳數(shù)據(jù)前須先寫“1”8051的4個I/O口在數(shù)據(jù)輸入時均呈準雙向口特性,這種口在引腳信號輸入操作中存在一個特殊問題。即如果口線引腳的原狀態(tài)為低電平,則外界輸入的任何信號均被引腳拉低為低電平,這樣就不能反映出外界輸入的真實狀態(tài),這實際上是封鎖了口線,外界信號不能輸入。當(dāng)外界輸入為高電平時,在拉低過程中會產(chǎn)生大電流,有可能把晶體管燒壞。解決辦法:在進行引腳數(shù)據(jù)輸入操作之前,須先向電路中的鎖存器寫入“1”,使FET截止,以避免鎖存器為0態(tài)時對引腳讀入的干擾。例如:ORLP1,#03H;將P1.0和P1.1置1,準備輸入信號MOVC,P1.0MOV20H,CMOVC,P1.1MOV21H,C(D)讀端口操作時的“讀-改-寫”功能讀端口:指通過鎖存器上面的緩沖器讀鎖存器Q端的狀態(tài)。對口的操作指令中,有些指令的操作過程是:先讀出口的數(shù)據(jù),然后對讀出的數(shù)據(jù)進行運算或修改操作,最后把結(jié)果回送給口。例如:ORLP0,#0FH這類讀改寫指令不直接讀引腳而是讀鎖存器,以避免錯誤發(fā)生。2.2.7空操作指令

NOP;PC←PC+1

該指令除了使PC加1,消耗1個機器周期外,沒有執(zhí)行任何操作??捎糜诙萄訒r。2.3匯編語言程序設(shè)計匯編語言特點:(1)匯編語言能編寫出最優(yōu)化程序;(2)匯編語言編程難度高;(3)能直接管理和控制硬件設(shè)備;(4)通用性差,不易移植。使用匯編語言設(shè)計程序時,要求設(shè)計者能對單片機硬件結(jié)構(gòu)了解深入,要對系統(tǒng)硬件資源進行合理分配使用,編程技巧性高。2.3匯編語言程序設(shè)計2.3.1常用的偽指令(程序員發(fā)給匯編程序的命令)匯編語言程序的機器匯編是由計算機自動完成的。為此,在源程序中應(yīng)有向匯編程序發(fā)出指示信息,告訴它如何完成匯編工作,這一任務(wù)是通過使用偽指令來實現(xiàn)的。

偽指令具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空間等功能。偽指令無對應(yīng)的機器碼,匯編得到目標(biāo)程序后,在目標(biāo)程序中是沒有與偽指令對應(yīng)的機器碼。2.3匯編語言程序設(shè)計2.3.1常用的偽指令(程序員發(fā)給匯編程序的命令)1.ORG匯編起始地址命令(用于規(guī)定目標(biāo)程序的起始地址)

標(biāo)號:ORGADDRESS例2.35:ORG

1000HST:MOV

A,R1…

上述指令規(guī)定了其后一段程序的起始地址為1000H,并指定了標(biāo)號ST的地址為1000H。2.END匯編結(jié)束命令

用于匯編語言源程序的末尾,表示源程序到此結(jié)束。在機器匯編時,對END后面的指令不予處理。一個源程序只能有一條END命令。3.DB定義字節(jié)數(shù)據(jù)命令格式:[標(biāo)號:]DBn1,n2,n3,………,nN例如ORG

1000H

TAB1:DB‘ABC’,100,32H從1000H開始的存儲單元的內(nèi)容如圖所示。

…32H64H43H

41H42H1000HROM1001H1002H1003H1004HDB命令常用于存放數(shù)據(jù)表格,比如存放數(shù)碼管的十六進制數(shù)的字形碼。4.DW定義字數(shù)據(jù)命令格式:[標(biāo)號:]DWnn1,nn2,……,nnN功能:用于從指定地址開始,在程序存儲器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如ORG

2000H

TAB2:DW1020H,1234H,100匯編后存儲單元的內(nèi)容如圖所示。00H34H12H

10H20H2000HROM2001H2002H2003H2004H

…64H2005H5.DS定義存儲區(qū)命令格式:[標(biāo)號:]DSX功能:從指定的地址開始,保留X字節(jié)的存儲單元。例:

ORG

6000HL1:DS

02HL2:DB88H,35H匯編后,從6000H開始保留2個字節(jié)單元,從6002H單元開始按DB命令給內(nèi)存單元賦值:(6002H)=88H(6003H)=35H注意:(1)DB、DW、DS命令只能對程序存儲器使用,而不能對RAM使用。(2)DB一般用于定義數(shù)據(jù),DW用來定義地址。6.EQU(Equat)賦值命令

格式:字符名EQU數(shù)或匯編符號

功能:把字符名賦予一個數(shù)或特定的匯編符號。賦值后,指令中可用該符號名來表示數(shù)或匯編符號。例:CH1EQU2000HXEQUR1通過EQU命令把CH1等值為數(shù)值2000H,X等值于寄存器R1。7.DATA數(shù)據(jù)地址賦值命令

格式:字符名DATAnn

功能:將數(shù)據(jù)地址或代碼地址賦予規(guī)定的字符名稱。DATA與EQU命令的區(qū)別:后者定義的字符名須先定義后使用,而DATA定義的字符名無此限制。8.BIT定義位地址符號命令格式:字符名BITbit

將位地址bit賦予所定義的字符名。例3.40:

L0BITP1.1

該指令把位地址P1.1賦給了變量L02.3.2匯編程序設(shè)計方法1.程序設(shè)計的一般流程(1)任務(wù)分析;(2)分析問題,確定算法和工作步驟;(4)分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址,畫出程序流程圖;(5)編寫匯編語言的源程序;(6)上機調(diào)試、修改,最終確定程序。2.匯編程序基本結(jié)構(gòu)形式順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序中斷服務(wù)子程序程序執(zhí)行時,程序流向不變,按順序一條一條地執(zhí)行指令。分支程序含有轉(zhuǎn)移指令,可分為無條件分支和有條件分支程序。對于有條件分支程序又可分為單分支選擇結(jié)構(gòu)和多分支選擇結(jié)構(gòu)。程序含有可重復(fù)執(zhí)行的程序段,匯編沒有專門的循環(huán)指令,一般可使用條件轉(zhuǎn)移指令通過條件判斷來控制循環(huán)的執(zhí)行。將那些需多次應(yīng)用、完成相同的某種運算操作的程序段從整個程序中獨立出來,單獨編成一個程序段,需要時通過指令調(diào)用。子程序須以返回指令RET結(jié)束。中斷服務(wù)子程序是為響應(yīng)某中斷源的中斷請求服務(wù)的獨立程序段,與子程序類似,但中斷服務(wù)子程序須以RETI指令結(jié)束。(1)順序程序設(shè)計:程序按順序一條一條地執(zhí)行指令。例1:

兩個4位BCD碼分別放在片內(nèi)RAM30H、31H和40H、41H中,求它們的和并將和存放在片內(nèi)RAM50H、51H、52H中,低地址放低位數(shù)。參考程序如下:(考慮最高位可能有進位)

ORG1000H

MOVA,30H

;最低位送入累加器A

ADDA,40H

DAA;BCD碼調(diào)整

MOV50H,A

;存放和的最低位

MOVA,31H

ADDCA,41H

DAA;BCD碼調(diào)整

MOV51H,A

;存放和的高位

CLRC

MOVA,#00H

ADDCA,#00H;保留最高位進位MOV52H,A

SJMP$;暫停

END 例2、把片外8000H中的數(shù)拆成高、低半字節(jié),分別送入40H、41H兩個單元中。

ORG0000H

MOVR0,#40H;設(shè)R0為地址指針

MOVDPTR,#8000H ;指定的字節(jié)

MOVXA,@DPTR

MOVB,A ;暫存

SWAPA

;交換

ANLA,#0FH

;屏敝高位

MOV@R0,A

INCR0

MOVA,B

ANLA,#0FH

;指定字節(jié)的內(nèi)容屏敝高位

MOV@R0,ALOOP:SJMPLOOP

END(2)分支程序程序分支是根據(jù)條件對程序的執(zhí)行進行判斷,滿足條件則進行程序轉(zhuǎn)移,不滿足條件就順序執(zhí)行程序。分支程序又分為單分支和多分支結(jié)構(gòu)。在8051中,可實現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ、JNZ、CJNE、DJNZ、JB、JNB、JBC等。

(2)分支程序

單分支程序

例1

假設(shè)有兩個數(shù)在內(nèi)部RAM單元的40H和41H中現(xiàn)在要求找出其中較大的一個數(shù)并將較大的數(shù)存入40H中,將較小的一個數(shù)存入41H中。

ORG1000H

MOVA,40H

CLRC

SUBBA,41H

JNCWAIT

MOVA,40H

XCHA,41H

MOV40H,AWAIT:SJMP$

ENDNY開始兩數(shù)交換兩數(shù)相減A←(40H)Cy清0結(jié)束Cy=0?例2求單字節(jié)有符號數(shù)的二進制補碼分析:正數(shù)補碼是其本身,負數(shù)補碼是其反碼加1,故程序首先判斷被轉(zhuǎn)換數(shù)的符號。設(shè)二進制數(shù)存放在累加器A中,其補碼也放回到A中。參考程序:CMPT:JNBACC.7,RETURN;(A)>0,返回MOVC,ACC.7;符號位保存CPLAADDA,#01H;(A)求反,加1MOVACC.7,C;符號位存在A的最高位RETURN:RET單分支結(jié)構(gòu)其他形式練習(xí):假定在外部RAM中有ST1、ST2、ST3共3個連續(xù)單元,其中ST1和ST2分別存放兩個8位無符號二進制數(shù),要求找出其中的大數(shù)并存入ST3中。參考程序:(2)多分支程序結(jié)構(gòu)

多分支程序通過多個條件來實現(xiàn)轉(zhuǎn)移,一個條件形成兩路分支,在其中的一個分支繼續(xù)進行條件判斷,形成下一級分支,從而實現(xiàn)分支的嵌套。51單片機無多分支轉(zhuǎn)移指令,無法使用單條指令完成多分支轉(zhuǎn)移。

實現(xiàn)方法:

多次使用條件轉(zhuǎn)移指令,如CJNEA,#data,rel指令,JZ,JC等指令使用JZ、JB實現(xiàn)跳轉(zhuǎn)使用查表方法.

使用查地址表方法實現(xiàn)多分支程序的轉(zhuǎn)移。使用查轉(zhuǎn)移指令表的方法實現(xiàn)多分支程序轉(zhuǎn)移。使用CJNE指令實現(xiàn)程序多分支轉(zhuǎn)移

用多條CJNE語句,逐次比較,實現(xiàn)多分支程序的轉(zhuǎn)移。

優(yōu)點:簡單、易懂

缺點:速度慢使用CJNE指令實現(xiàn)程序多分支轉(zhuǎn)移分析:

T54≦Ta≦T55

溫度下限T54溫度上限T55低于T54高于T55則升溫則降溫NNYYYNNY參考程序例2

求符號函數(shù)Y

ORG0100HSTART:

MOV

A,30H

JZ

MM

JNB

ACC.7,LL

MOV

A,#0FFH;

AJMP

MM

LL:

MOV

A,#01H

MM:

MOV

31H,

A

END圖2.9符號函數(shù)程序流程圖開始(31H)←A取x即(30H)→A結(jié)束YNYNA←1A←-1A=0?A﹥0?使用JZ、JB指令實現(xiàn)程序多分支轉(zhuǎn)移使用查地址表法實現(xiàn)多分支轉(zhuǎn)移首先要在程序中建立一個差值表,并將各分支入口地址與該表首地址的差值按序排列其中。差值表首地址送入DPTR,分支號送入A中。然后就可通過轉(zhuǎn)移指令JMP@A+DPTR進行分支。使用查表法實現(xiàn)程序多分支轉(zhuǎn)移例1:有BR0,BR1,BR2,BR3共4個分支程序段,各分支程序段的功能依次是BR0:從內(nèi)部RAM取數(shù)BR1:從外部RAM中低256B范圍取數(shù)BR2:從外部RAM中4KB范圍取數(shù)BR3:從外部RAM中64KB范圍取數(shù)并假定R0中存放取數(shù)地址低8位地址,R1中存放高8位地址,R3中存放分支序號值,假定以BRTAB作為差值表首地址,BR0_BRTAB~BR0_BRTAB為差值.

例1:利用四分支程序,實現(xiàn)在①內(nèi)部RAM取數(shù)②在外部RAM低256B范圍取數(shù).③在外部

RAM4KB取數(shù).④在外部RAM64KB范圍取數(shù).

R0低8位地址.R1高8位地址R3分支序號0,1,2,3.

BR0BR1BR3BR20213查轉(zhuǎn)移指令表的方式實現(xiàn)多分支

與方法不同的是,表中放的是轉(zhuǎn)移指令。使用變址尋址轉(zhuǎn)移指令(間接轉(zhuǎn)移指令)

JMP@A+DPTR;(PC)←(A)+(DPTR)

具體方法:(A)將轉(zhuǎn)移指令直接放入表中,即表示由轉(zhuǎn)移指令組成指令表。(B)該表的首址送DPTR。DPTR的基地址存轉(zhuǎn)移指令表的起始地址,A為表的偏移量。通過此指令實現(xiàn)程序的分支轉(zhuǎn)移。例如:MOVA,R3;R3存分支號RLA;分支號乘2,形成偏移量MOVDPTR,#BRTAB;轉(zhuǎn)移指令表首址JMP@A+DPTRAJMPROUT0AJMPROUT1AJMPROUT2……

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論