版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
MCS-51單片機(jī)指令系統(tǒng)及匯編程序設(shè)計(jì)單片機(jī)原理及接口技術(shù)單片機(jī)原理及接口技術(shù)目錄3.1
指令系統(tǒng)概述3.2
尋址方式3.3
MCS-51單片機(jī)指令系統(tǒng)3.4
匯編語(yǔ)言程序設(shè)計(jì)單片機(jī)原理及接口技術(shù)3.1.1
匯編指令格式指令碼的結(jié)構(gòu)形式稱為指令格式,MCS-51單片機(jī)匯編語(yǔ)言指令格式由以下幾個(gè)部分組成:標(biāo)號(hào):為該指令的符號(hào)地址,符號(hào)后面必須緊跟冒號(hào)“:”。標(biāo)號(hào)可以省略,經(jīng)常用作轉(zhuǎn)移指令或CALL指令的操作數(shù),用以表示轉(zhuǎn)移的目的地址。操作碼:是由助記符表示的字符串,它表示計(jì)算機(jī)執(zhí)行該指令將進(jìn)行何種操作。程序匯編時(shí)匯編程序會(huì)將其翻譯成機(jī)器語(yǔ)言。它是語(yǔ)句中的關(guān)鍵字,因此不可省略。操作數(shù):是指參加本指令運(yùn)算的數(shù)據(jù)或數(shù)據(jù)所在的地址。根據(jù)指令要求可以有一個(gè)或多個(gè)操作數(shù),甚至不需要操作數(shù),多個(gè)操作數(shù)之間用逗號(hào)隔開(kāi),操作數(shù)與指令助記符之間用空格隔開(kāi)。注釋:是用來(lái)說(shuō)明一條指令或一段程序的功能,可以省略,注釋前必須加上分號(hào)“;”。匯編程序?qū)Ψ痔?hào)后面的內(nèi)容不匯編。3.1
指令系統(tǒng)概述單片機(jī)原理及接口技術(shù)3.1.2指令描述符號(hào)介紹(1)Rn:
工作寄存器,即R0~R7(n=0~7)。(2)Ri:
間址寄存器,即R0,R1(i=0、1)。
(3)DPTR:
數(shù)據(jù)地址指針,可用作16位的間址寄存器。(4)direct:8位內(nèi)部數(shù)據(jù)存儲(chǔ)器單元的地址,它可以是片內(nèi)RAM的單元地址(00H~7FH),或特殊功能寄存器的地址(80H~FFH)。
(5)#data:8位立即數(shù)。
(6)#data16:16位立即數(shù)。
(7)addr16:16位目標(biāo)地址。用于LCALL和LJMP指令中,地址范圍是64KB程序存儲(chǔ)器地址空間。
(8)addr11:11位目標(biāo)地址。用于ACALL和AJMP指令,地址范圍是下一條指令所在的2KB程序存儲(chǔ)器地址空間。
單片機(jī)原理及接口技術(shù)(9)rel:8位帶符號(hào)的偏移地址,用于SJMP和所有的條件轉(zhuǎn)移指令。其范圍是相對(duì)于下一條指令第1字節(jié)地址的-128~+127B。(10)bit:片內(nèi)RAM或?qū)S眉拇嫫鞯闹苯訉ぶ肺弧#?1)A:累加器ACC;(12)B:通用寄存器,用于MUL和DIV指令中。(13)Cy:進(jìn)位標(biāo)志位或布爾處理器中的累加器。(14)@:間接寄存器或基址寄存器的前綴,如@Ri、@DPTR、@A+PC、@A+DPTR。(15)$:當(dāng)前指令的地址;(16)/:位操作數(shù)的前綴,表示該位操作數(shù)取反。(17)(x):x中的內(nèi)容;(18)((x)):由x尋址的單元中的內(nèi)容。(19)←:箭頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所代替。單片機(jī)原理及接口技術(shù)3.2尋址方式所謂尋址就是尋找操作數(shù)的地址。MCS-51單片機(jī)中絕大多數(shù)指令都有一個(gè)或多個(gè)操作數(shù)。在執(zhí)行指令時(shí),CPU首先要根據(jù)地址尋找參加運(yùn)算的操作數(shù),然后才能對(duì)操作數(shù)進(jìn)行操作,并將結(jié)果存入相應(yīng)的存儲(chǔ)單元或寄存器中。因此,單片機(jī)在執(zhí)行指令時(shí)需要不斷地尋找操作數(shù)并進(jìn)行運(yùn)算,如何尋址是非常關(guān)鍵的。MCS-51單片機(jī)操作數(shù)的存放范圍非常廣,可以在片內(nèi)RAM/ROM或片外RAM/ROM的任何位置。為了適應(yīng)操作數(shù)在所有地址范圍內(nèi)尋址,MCS-51單片機(jī)共有7種尋址方式,即立即尋址、寄存器尋址、直接尋址、寄存器間接尋址、變址尋址、相對(duì)尋址和位尋址。3.2.1立即尋址
立即尋址是指指令中直接給出操作數(shù),不需要經(jīng)過(guò)別的途徑去尋找,故稱為立即尋址。匯編指令中,在一個(gè)數(shù)的前面加上符號(hào)“#”作為前綴,就表示該數(shù)為立即尋址。例如:MOVA,#40H ;將立即數(shù)40H送至A中單片機(jī)原理及接口技術(shù)INCR3 ;將R3中的內(nèi)容加1傳送至R3中
MOVA,R0 ;將R0中的內(nèi)容傳送至A中3.2.2
寄存器尋址寄存器尋址是指令所需操作數(shù)在累加器A、通用寄存器B、位累加器Cy、數(shù)據(jù)指針DPTR和某個(gè)工作寄存器R0~R7中。被尋址的寄存器中的內(nèi)容就是操作數(shù)。例如:在這類尋址方式的指令中,直接地址通常采用direct(或addr11或addr16)表示。例如:MOVA,direct。若用40H代替上述指令中的direct,則該指令變?yōu)镸OVA,40H。其示意圖如圖3-1所示。圖3-1
直接尋址示意圖單片機(jī)原理及接口技術(shù)3.2.4
寄存器間接尋址寄存器間接尋址是將指令中指定寄存器的內(nèi)容作為操作數(shù)的地址,再?gòu)拇说刂氛业讲僮鲾?shù)的尋址方式。這里需要強(qiáng)調(diào)的是:寄存器中的內(nèi)容不是操作數(shù)本身,而是操作數(shù)的地址,寄存器起地址指針的作用。在MCS-51單片機(jī)中,可作為寄存器間接尋址的寄存器有R0、R1,堆棧指針SP和數(shù)據(jù)指針DPTR。在指令助記符中,間接尋址用符號(hào)“@”來(lái)表示。當(dāng)訪問(wèn)片內(nèi)RAM或片外RAM低256字節(jié)空間時(shí),可用R0或R1作為間址寄存器。當(dāng)訪問(wèn)片外RAM64KB(0000H~FFFFH)空間時(shí),可用DPTR作為間址寄存器。當(dāng)執(zhí)行PUSH或POP指令時(shí),可用SP作為間址寄存器。例如:MOV@R0,A ;將A中的內(nèi)容送至R0作為地址所指的單元中MOVXA,@DPTR ;將DPTR所指的片外RAM單元中的內(nèi)容送至A中單片機(jī)原理及接口技術(shù)3.2.4寄存器間接尋址
寄存器間接尋址示意圖如圖3-2所示:
圖3-2寄存器間接尋址示意圖單片機(jī)原理及接口技術(shù)3.2.5變址尋址
將指令中指定的變址寄存器和基址寄存器的內(nèi)容相加形成操作數(shù)地址,這種尋址方式稱為變址尋址。在這種尋址方式中,累加器A作為變址寄存器,程序計(jì)數(shù)器PC或數(shù)據(jù)指針DPTR作為基址寄存器。變址尋址常用于查表操作,例如:MOV DPTR,#2000H ;DPTR←#2000HMOV A,#10H ;A←#10HMOVC A,@A+DPTR ;將A的內(nèi)容和DPTR內(nèi)容相加得到一個(gè)新地址,通過(guò);該地址取得操作數(shù)送入A中執(zhí)行后A的值為64H。單片機(jī)原理及接口技術(shù)3.2.5
變址尋址
圖3-3變址尋址示意圖指令的執(zhí)行過(guò)程如圖3-3所示:?jiǎn)纹瑱C(jī)原理及接口技術(shù)3.2.6
相對(duì)尋址
將當(dāng)前程序計(jì)數(shù)器PC值加上指令中給出的相對(duì)偏移量rel形成程序轉(zhuǎn)移的目的地址,這種尋址方式稱為相對(duì)尋址。相對(duì)偏移量是一個(gè)8位的帶符號(hào)數(shù),用補(bǔ)碼表示,其范圍為-128~+127。負(fù)數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。這種尋址方式一般用于訪問(wèn)程序存儲(chǔ)器,常出現(xiàn)在跳轉(zhuǎn)指令中。跳轉(zhuǎn)的地址(目的地址)為目的地址=當(dāng)前PC值+rel=指令存儲(chǔ)地址+指令字節(jié)數(shù)+rel例如:SJMPrel是一條雙字節(jié)轉(zhuǎn)移指令。若該指令的存儲(chǔ)地址為2000H,單片機(jī)執(zhí)行時(shí)先從2000H和2001H單元中取出指令碼(當(dāng)前PC值被加1兩次變?yōu)?002H),然后將程序計(jì)數(shù)器PC的值和rel相加,以形成目標(biāo)地址,重新送回PC。若rel=36H,則目的地址為2000H+02H+36H=2038H。這樣,當(dāng)單片機(jī)再根據(jù)PC取指令執(zhí)行時(shí),程序就轉(zhuǎn)到2038H處執(zhí)行。單片機(jī)原理及接口技術(shù)3.2.6
相對(duì)尋址
指令的執(zhí)行過(guò)程如圖3-4所示:圖3-4相對(duì)尋址示意圖單片機(jī)原理及接口技術(shù)3.2.7
位尋址
在計(jì)算機(jī)中,操作數(shù)不僅可以按字節(jié)為單位進(jìn)行存取和操作,也可以按位為單位進(jìn)行存取和操作。當(dāng)把位作為操作數(shù)看待時(shí),這個(gè)操作數(shù)的地址就稱為位地址,對(duì)位地址尋址簡(jiǎn)稱位尋址。指令的執(zhí)行過(guò)程如圖3-5所示。在MCS-51單片機(jī)中,位尋址區(qū)在片內(nèi)RAM中的兩個(gè)區(qū)域:一是片內(nèi)RAM的位尋址區(qū),地址范圍是20H~2FH,共16個(gè)字節(jié)單元,每一位都可以單獨(dú)作為操作數(shù),共有128位;二是特殊功能寄存器SFR區(qū)中字節(jié)地址能被8整除的特殊功能寄存器,共有11個(gè)。例如:MOV20H,C;將進(jìn)位Cy
的內(nèi)容傳送至20H地址所指示的位中MOVC,2FH.7 ;C←2FH.7圖3-5位尋址示意圖單片機(jī)原理及接口技術(shù)指令的集合或全體稱為指令系統(tǒng),計(jì)算機(jī)只能識(shí)別和執(zhí)行由二進(jìn)制數(shù)構(gòu)成的機(jī)器語(yǔ)言。為了方便人們的理解、記憶和使用,常用助記符來(lái)描述計(jì)算機(jī)的指令系統(tǒng)(即匯編語(yǔ)言指令)。3.3
MCS-51單片機(jī)指令系統(tǒng)3.3.1
數(shù)據(jù)傳送類指令MCS-51單片機(jī)指令系統(tǒng)中,數(shù)據(jù)傳送指令共有28條,是運(yùn)用最頻繁的一類指令。數(shù)據(jù)傳送操作可以在片內(nèi)RAM和SFR內(nèi)進(jìn)行,也可以在累加器A和片外存儲(chǔ)器之間進(jìn)行,指令中必須指定傳送數(shù)據(jù)的源地址和目標(biāo)地址,以便執(zhí)行指令時(shí)把源地址中內(nèi)容傳送到目標(biāo)地址中,但不改變?cè)吹刂分械膬?nèi)容。在這類指令中,只有以累加器A為目標(biāo)操作數(shù)時(shí)會(huì)對(duì)奇偶標(biāo)志位P有影響,其余指令執(zhí)行時(shí)都不會(huì)影響任何標(biāo)志位。1.內(nèi)部數(shù)據(jù)傳送指令這類指令的源操作數(shù)和目標(biāo)操作數(shù)地址都在單片機(jī)的內(nèi)部,可以是片內(nèi)RAM的地址,也可以是SFR的地址。指令的格式為MOV[dest],[src]單片機(jī)原理及接口技術(shù)1.內(nèi)部數(shù)據(jù)傳送指令指令功能是將源操作數(shù)的內(nèi)容傳送到目標(biāo)操作數(shù),源操作數(shù)的內(nèi)容不變。這類指令一般不影響標(biāo)志位。但當(dāng)目標(biāo)操作數(shù)為累加器A時(shí),會(huì)影響奇偶標(biāo)志。立即數(shù)不能為目標(biāo)操作數(shù)。數(shù)據(jù)傳送方向如圖3-6所示。圖3-6傳送指令傳送方向示意圖單片機(jī)原理及接口技術(shù)(1)以累加器A為目標(biāo)操作數(shù)的傳送指令(4條)
MOVA,#data ;A←dataMOVA,Rn ;A←Rn(n=0~7)MOVA,direct ;A←(direct)MOVA,@Ri ;A←(Ri)(i=0或1)(2)以Rn為目標(biāo)操作數(shù)的傳送指令(3條)MOVRn,#data ;Rn←dataMOVRn,A ;Rn←A(n=0~7)MOVRn,direct ;Rn←(direct)(3)以直接地址為目標(biāo)操作數(shù)的傳送指令(5條)
MOVdirect,#data ;(direct)←dataMOVdirect,A ;(direct)←AMOVdirect,Rn ;(direct)←RnMOVdirect1,direct2 ;(direct1)←(direct2)MOVdirect,@Ri ;(direct)←(Ri)單片機(jī)原理及接口技術(shù)(4)以寄存器間接地址為目標(biāo)操作數(shù)的傳送指令(3條)。MOV@Ri,#data ;(Ri)←dataMOV@Ri,A ;(Ri)←AMOV@Ri,direct ;(Ri)←(direct)注:直接地址和立即數(shù)在指令中均以數(shù)據(jù)形式出現(xiàn),但兩者含義不同,為了區(qū)別,在指令助記符中用#作為立即數(shù)的前綴。例如:MOVA,12H ;片內(nèi)RAM的12H單元內(nèi)容送入A中MOVA,#20H ;將立即數(shù)20H送入A中MOV12H,#34H ;將立即數(shù)34H送入片內(nèi)RAM的12H單元中MOV40H,30H ;將片內(nèi)RAM的30H單元的內(nèi)容送入40H單元中單片機(jī)原理及接口技術(shù)例3-2設(shè)片內(nèi)RAM中(20H)=10H,試分析下列程序運(yùn)行,求各存儲(chǔ)單元中的內(nèi)容。MOV 30H,#20H ;(30H)←20HMOV R0,#30H ;R0←30HMOV A,@R0 ;A←(R0)MOV R1,A ;R1←AMOV 40H,@R1 ;(40H)←(R1)MOV 50H,20H ;(50H)←(20H)解:程序運(yùn)行結(jié)果如下:A=20H,R0=30H,R1=20H,(50H)=10H,(40H)=10H,(30H)=20H。例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)2.外部數(shù)據(jù)傳送指令(7條)(1)16位數(shù)據(jù)傳送指令(1條)在MCS-51單片機(jī)中,只有唯一的一條16位數(shù)據(jù)傳送指令。MOVDPTR,#data16;DPTR←data16(2)外部RAM的字節(jié)傳送指令(4條)該指令用于CPU與外部數(shù)據(jù)存儲(chǔ)器之間的數(shù)據(jù)傳送。對(duì)外部數(shù)據(jù)存儲(chǔ)器的訪問(wèn)均采用間接尋址方式。MOVX A,@Ri ;A←(Ri)MOVX @Ri,A ;(Ri)←AMOVX A,@DPTR ;A←(DPTR)MOVX @DATR,A ;(DATR)←A單片機(jī)原理及接口技術(shù)外部RAM的字節(jié)傳送指令都要經(jīng)過(guò)累加器A,而且在累加器A與片外RAM進(jìn)行數(shù)據(jù)傳送時(shí),通過(guò)P0端口和P2端口進(jìn)行傳送地址,低8位地址由P0端口送出,高8位地址由P2端口送出,數(shù)據(jù)通過(guò)P0端口傳送。例3-3試編寫(xiě)程序?qū)⑼獠縍AM的80H單元的內(nèi)容12H傳送到外部RAM2000H單元中。解:外部RAM的80H單元的內(nèi)容不能直接傳送到外部RAM2000H單元中。先將80H單元的內(nèi)容讀入累加器A,再將A的內(nèi)容傳送到外部RAM2000H單元中。相應(yīng)程序如下:MOV DPTR,#2000H ;DPTR←2000HMOV R0,#80H ;R0←80HMOVX A,@R0 ;A←(R0),即A=12HMOVX @DPTR,A ;(DPTR)←A,即(2000H)=A例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)2.外部數(shù)據(jù)傳送指令(3)外部ROM字節(jié)傳送指令(2條)MCS-51單片機(jī)指令系統(tǒng)提供了兩條訪問(wèn)程序存儲(chǔ)器的指令,也稱為查表指令。MOVC A,@A+DPTR ;A←(A+DPTR)MOVC A,@A+PC ;A←(A+PC)前一條指令是采用DPTR作為基址寄存器,因此其尋址范圍為整個(gè)程序存儲(chǔ)器的64KB空間,表格可以放在程序存儲(chǔ)器的任何位置。后一條指令是用PC作為基址寄存器,而指令中PC的地址是可以變化的,它隨著指令在程序中的位置不同而不同。一旦位置確定,PC中的內(nèi)容也就被確定。由于在進(jìn)行查表時(shí),PC的當(dāng)前值并不一定就是表的首地址,因此常常需要在這條指令前安排一條加法指令,以便把PC中當(dāng)前值修改為表的首地址。單片機(jī)原理及接口技術(shù)例3-4若在片外ROM的2000H開(kāi)始的單元中存放了0~9的平方值,要求根據(jù)累加器A中的值0~9來(lái)查找對(duì)應(yīng)的平方值。解:若用DPTR作為基址寄存器,可編程如下:MOV DPTR,#2000H;DPTR←首地址MOVC A,@A+DPTR ;A←(A+DPTR)這時(shí),A+DPTR的值就是所查平方值存放的地址。若用PC作為基址寄存器,則應(yīng)在MOVC指令之前先用一條加法指令進(jìn)行地址調(diào)整。ADD A,#data ;data的值要根據(jù)MOVC指令所在的地址進(jìn)行調(diào)整MOVC A,@A+PC ;A←(A+DPTR)設(shè)將查表程序定位在1FF0H,則可以用下面的方法來(lái)確定data值。ADD指令要占用2個(gè)字節(jié),MOVC指令要占用1個(gè)字節(jié),則有例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)PC=PC+2+1=1FF0H+2+1=1FF3HPC當(dāng)前值+data=平方表首地址data=平方表首地址-PC當(dāng)前值=2000H-1FF3H=0DH因此,程序中的指令應(yīng)為ORG 1FF0HADD A,#0EH ;A←0EHMOVCA,@A+PC ;A←(A+PC)SJMP $修正值data其實(shí)就是查表指令所在位置與表的首地址之間的存儲(chǔ)單元個(gè)數(shù),因A是8位無(wú)符號(hào)數(shù)。因此,查表指令和所建立的表之間必須在同一頁(yè)(頁(yè)內(nèi)地址為00H~FFH)。單片機(jī)原理及接口技術(shù)3.堆棧操作指令堆棧操作指令是一種特殊的數(shù)據(jù)傳送指令,這類指令有以下兩條:PUSH direct ;SP←SP+1,(SP)←(direct)POP direct ;(direct)←(SP),SP←SP-1PUSH為壓棧指令,是將把direct地址單元的內(nèi)容壓入堆棧。具體操作是:先將堆棧指示器SP的內(nèi)容加1,指向堆棧頂?shù)囊粋€(gè)空單元,然后把direct中的內(nèi)容送到該空單元中。POP為出棧指令,是將當(dāng)前堆棧指針SP所指示的單元內(nèi)容彈出堆棧,具體操作是:先將堆棧指示器SP所指棧頂單元中的內(nèi)容彈到direct單元,然后將原棧頂?shù)刂窚p1,使之指向新的棧頂?shù)刂?。MCS-51單片機(jī)的堆棧規(guī)則是“先入后出”。由于上電或復(fù)位后,SP的值為07H,所以在使用堆棧時(shí),SP的初始值最好重新設(shè)定。一般SP的值可以設(shè)置在30H或30H以上的片內(nèi)RAM單元,但應(yīng)注意不要超出堆棧的深度,且還要避開(kāi)工作寄存器區(qū)和位尋址區(qū)。單片機(jī)原理及接口技術(shù)注意:由于堆棧操作只能以直接尋址方式來(lái)取操作數(shù),所以不能用累加器A或工作寄存器Rn作為操作數(shù)。如果要將累加器A的內(nèi)容壓入堆棧,應(yīng)用指令PUSHACC,這里ACC表示累加器的直接地址E0H。例3-5設(shè)SP=32H,A=10H,片內(nèi)RAM的30H~32H單元的內(nèi)容分別為10H、34H、12H,執(zhí)行下列指令后A、DPTR、SP為多少?PUSH ACCPOP DPHPOPDPL解:PUSH ACC ;SP←SP+1,(SP)←10H POP DPH ;(SP)=(33H)=10H→DPH;SP-1→SP POP DPL ;(SP)=(32H)=12H→DPL;SP-1→SP,SP=31H所以A=10H,DPTR=1012H,SP=31H。例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)4.數(shù)據(jù)交換指令數(shù)據(jù)交換指令共有4條,其中字節(jié)交換指令3條,半字節(jié)交換指令1條。(1)字節(jié)交換指令(3條)XCH A,Rn ;A←→RnXCH A,direct ;A←→(direct)XCH A,@Ri ;A←→(Ri)該指令的功能是將累加器A與片內(nèi)RAM單元的內(nèi)容相互交換。(2)半字節(jié)交換指令(1條)XCHD A,@Ri ;A3~0←→(Ri)3~0,高4位保持不變?cè)撝噶畹墓δ苁菍⒗奂悠鰽中低4位和Ri所指的片內(nèi)RAM單元中的低4位相互交換,高4位保持不變。單片機(jī)原理及接口技術(shù)例3-6已知20H單元中有一個(gè)0~9之間的數(shù),試編寫(xiě)程序?qū)⑵滢D(zhuǎn)換為相應(yīng)的ASCII碼。解:已知0~9的ASCII碼為30H~39H。進(jìn)行比較后可以看到,0~9和它們的ASCII碼僅相差30H,故可以利用半字節(jié)交換指令把0~9之間的數(shù)據(jù)配制成相應(yīng)ASCII碼。相應(yīng)程序如下:MOV R0,#20HMOV A,#30HXCHD A,@R0MOV @R0,A例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)3.3.2
算術(shù)運(yùn)算類指令MCS-51單片機(jī)的算術(shù)運(yùn)算類指令共有24條,主要有加法、減法、乘法、除法、加1、減1及十進(jìn)制調(diào)整指令。1.加法指令(1)加法指令(4條)ADDA,#data ;A←A+dataADDA,Rn;A←A+RnADDA,direct ;A←A+(direct)ADDA,@Ri ;A←A+(Ri)指令的功能是把源地址所指示的操作數(shù)和累加器A中的內(nèi)容進(jìn)行相加,相加結(jié)果再送回累加器A中。參加運(yùn)算的兩個(gè)操作數(shù)必須是8位二進(jìn)制數(shù),操作結(jié)果也是一個(gè)8位二進(jìn)制數(shù),且會(huì)影響PSW中的所有位。操作數(shù)可以是帶符號(hào)數(shù)也可以是不帶符號(hào)數(shù),但計(jì)算機(jī)總是按照帶符號(hào)數(shù)運(yùn)算法則進(jìn)行運(yùn)算,并產(chǎn)生PSW中的標(biāo)志位。單片機(jī)原理及接口技術(shù)例3-7執(zhí)行如下指令后,A和PSW中各標(biāo)志位的狀態(tài)。MOVA,#78HADDA,#56H解:運(yùn)算過(guò)程如下:
01111000(78H)+) 01010110(56H)11001110運(yùn)算結(jié)果:A=0CEH。標(biāo)志位:Cy=0,OV=D6CY⊕D7CY=1⊕0=1,AC=0,P=1。例題:(2)帶進(jìn)位加法指令(4條)ADDCA,#data ;A←A+data+CyADDCA,Rn ;A←A+Rn+Cy
ADDCA,@Ri ;A←A+(Ri)+Cy
ADDCA,direct ;A←A+(direct)+Cy
這4條指令的功能是把源地址所指示的操作數(shù)和累加器A中的內(nèi)容及進(jìn)位標(biāo)志位Cy進(jìn)行相加,相加結(jié)果再送回累加器A中。運(yùn)算結(jié)果對(duì)PSW中的所有位都有影響。單片機(jī)原理及接口技術(shù)(3)加1指令(5條)INCA ;A←A+1INCRn ;Rn←Rn+1INCdirect ;(direct)←(direct)+1INC@Ri ;(Ri)←(Ri)+1INCDPTR ;DPTR←DPTR+1前面四條指令是8位數(shù)加1指令,用于使源地址所規(guī)定的RAM單元中內(nèi)容加1再送回該單元。除了第一條指令能對(duì)奇偶標(biāo)志位P產(chǎn)生影響,其余三條指令執(zhí)行時(shí)都不會(huì)對(duì)任何標(biāo)志位產(chǎn)生影響。第五條指令的功能對(duì)DPTR中內(nèi)容加1,是MCS-51單片機(jī)唯一的一條16位算術(shù)運(yùn)算指令。3.3.2算術(shù)運(yùn)算類指令單片機(jī)原理及接口技術(shù)2.減法指令(1)帶借位減法指令(4條)SUBBA,#data ;A←A-data-Cy
SUBBA,Rn ;A←A-Rn-Cy
SUBBA,direct ;A←A-(direct)-Cy
SUBBA,@Ri ;A←A-(Ri)-Cy
這4條指令的功能是把累加器A中的內(nèi)容減去源地址所指的操作數(shù)和指令執(zhí)行之前的Cy,所得結(jié)果再送回累加器A中。參加運(yùn)算的兩個(gè)操作數(shù)必須是8位二進(jìn)制數(shù),操作結(jié)果也是一個(gè)8位二進(jìn)制數(shù),且對(duì)PSW中的所有位都有影響。操作數(shù)可以是帶符號(hào)數(shù)也可以是不帶符號(hào)數(shù),但計(jì)算機(jī)總是按照帶符號(hào)數(shù)運(yùn)算法則進(jìn)行運(yùn)算,并產(chǎn)生PSW中的標(biāo)志位。MCS-51單片機(jī)指令系統(tǒng)中沒(méi)有不帶Cy的減法指令,要計(jì)算不帶Cy的運(yùn)算時(shí),只需將Cy清零即可。單片機(jī)原理及接口技術(shù)(2)減1指令(4條)DECA ;A←A-1DECRn ;Rn←Rn-1DECdirect ;(direct)←(direct)-1DEC@Ri ;(Ri)←(Ri)-1減1指令的功能是將指定單元的內(nèi)容減1再送回該單元,這類指令不影響標(biāo)志位。例3-9兩個(gè)3字節(jié)數(shù)相減。設(shè)被減數(shù)放于20H起始的連續(xù)3個(gè)單元中(低位在前),減數(shù)放于30H起始的連續(xù)3個(gè)單元中(低位在前),相減的結(jié)果仍放于20H起始的單元中。單片機(jī)原理及接口技術(shù)解:CLR C ;Cy
清零MOV R0,#20H ;被減數(shù)首地址MOV R1,#30H ;減數(shù)首地址MOV A,@R0 ;A←被減數(shù)的低8位SUBB A,@R1 ;A←被減數(shù)的低8位-減數(shù)的低8位-CyMOV @R0,A ;20H←低8位的差I(lǐng)NC R0 ;修改地址指針R0INC R1 ;修改地址指針R1MOV A,@R0 ;A←被減數(shù)的中間8位SUBB A,@R1 ;A←被減數(shù)的中間8位-減數(shù)的中間8位-Cy例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)MOV @R0,A;21H←中間8位的差I(lǐng)NC R0 ;修改地址指針R0INC R1 ;修改地址指針R1MOV A,@R0 ;A←被減數(shù)的高8位SUBB A,@R1 ;A←被減數(shù)的高8位-減數(shù)的高8位-CyMOV @R0,A ;22H←高8位的差SJMP $ ;停機(jī)3.BCD碼調(diào)整指令(1條)“DAA”
這條指令是在進(jìn)行BCD碼加法運(yùn)算時(shí),用來(lái)對(duì)BCD碼的加法運(yùn)算結(jié)果自動(dòng)進(jìn)行調(diào)整。將該指令跟在加法指令之后即可。在計(jì)算機(jī)中,十進(jìn)制數(shù)字0~9一般可用BCD碼表示,它是以4位二進(jìn)制編碼的形式表示的。若在加法過(guò)程中低4位向高四位有進(jìn)位(即AC=1)或累加器A的低四位大于9,則累加器加6進(jìn)行調(diào)整,若在加法過(guò)程中最高位有進(jìn)位(即Cy=1)或累加器A的高四位大于9,則累加器加60H進(jìn)行調(diào)整,BCD碼調(diào)整指令只對(duì)進(jìn)位Cy產(chǎn)生影響。單片機(jī)原理及接口技術(shù)例3-11設(shè)片內(nèi)RAM30H,31H單元中分別存放著兩位BCD碼表示的被減數(shù)和減數(shù),兩數(shù)相減的差仍以BCD碼的形式存放在32H單元中??捎孟旅娴某绦?qū)崿F(xiàn):CLR CMOV A,#9AH ;用9AH代替兩位BCD碼數(shù)的模100SUBB A,31H ;求減數(shù)的十進(jìn)制補(bǔ)碼ADD A,30H ;作十進(jìn)制補(bǔ)碼加法DA A ;進(jìn)行BCD碼調(diào)整MOV 32H,A ;將BCD碼的差送存32H單元例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)4.乘法和除法指令(1)乘法指令(1條)MULAB;BA←A×B乘法指令的功能是將兩個(gè)8位無(wú)符號(hào)數(shù)進(jìn)行相乘操作。兩個(gè)無(wú)符號(hào)數(shù)分別存放在A和B中,乘積為16位,低8位存于A中,高8位存于B中。該指令將對(duì)Cy、OV和P三個(gè)標(biāo)志位產(chǎn)生影響。其中Cy總是為零;OV標(biāo)志位用來(lái)表示積的大小,若積大于255(即B≠0),則OV置1,否則OV清零;奇偶校驗(yàn)位仍然由累加器A中1的奇偶數(shù)確定。例3-12設(shè)A=38H,B=2AH,執(zhí)行如下指令:MULAB運(yùn)算結(jié)果:B=09H,A=30H,OV=1,Cy=0。例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)(2)除法指令(1條)DIVAB ;A←A/B(商),B←A/B(余數(shù)),Cy←0,OV←0除法指令的功能是實(shí)現(xiàn)兩個(gè)8位無(wú)符號(hào)數(shù)相除的操作。被除數(shù)放在累加器A中,除數(shù)放在B中,指令執(zhí)行后,商的整數(shù)部分存放在累加器A中,余數(shù)保留在B中。該指令對(duì)標(biāo)志位Cy和P的影響和乘法時(shí)相同。只有標(biāo)志位OV不一樣,當(dāng)除數(shù)為0時(shí),A和B的內(nèi)容為不確定值,此時(shí)OV置1,說(shuō)明除法溢出;其余情況下OV置0。乘法和除法指令是MCS-51單片機(jī)指令系統(tǒng)中執(zhí)行時(shí)間最長(zhǎng)的指令,需要4個(gè)機(jī)器周期。例3-13設(shè)A=48H,B=0AH,執(zhí)行如下指令:DIVAB運(yùn)算結(jié)果:A=07H,B=02H,Cy=OV=0。例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)邏輯運(yùn)算和移位指令共25條,包括與、或、異或、清零、取反及移位等操作指令。常用來(lái)對(duì)數(shù)據(jù)進(jìn)行邏輯處理,使之適合于傳送、存儲(chǔ)和輸出打印等。這類指令執(zhí)行時(shí),除了以累加器A為目標(biāo)操作數(shù)時(shí),影響奇偶標(biāo)志位,其余指令都不會(huì)影響PSW中的任何標(biāo)志位。3.3.3
邏輯運(yùn)算及移位指令A(yù)NLA,#data ;A←A∧dataANLA,Rn ;A←A∧RnANLA,@Ri ;A←A∧(Ri)ANLA,direct ;A←A∧(direct)ANLdirect,A ;(direct)←(direct)∧AANLdirect,#data ;(direct)←(direct)∧data1.邏輯“與”運(yùn)算指令單片機(jī)原理及接口技術(shù)例3-15
將A中的壓縮BCD碼拆分為兩個(gè)字節(jié),將A中的低4位送到P1端口的低4位,A中的高4位送到P2端口的低4位,P1、P2端口的高4位清零。解:根據(jù)題意,相應(yīng)程序如下:ORG 100HMOV B,A ;A的內(nèi)容暫存于B中ANL A,#0FH ;清高4位,保留低4位MOV P1,A ;低4位從P1端口輸出MOV A,B ;取原數(shù)據(jù)ANL A,#F0H ;保留高4位,清零低4位SWAP A ;累加器A的高4位移至低4位MOV P2,A ;高4位從P2端口輸出SJMP $END例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)ORLA,#data ;A←A∨dataORLA,@Ri ;A←A∨(Ri)ORLA,Rn ;A←A∨RnORLA,direct ;A←A∨(direct)ORLdirect,A ;(direct)←(direct)∨AORLdirect,#data ;(direct)←(direct)∨data邏輯或指令也稱邏輯加指令,可以用于對(duì)累加器A或者RAM單元的內(nèi)容,特別是對(duì)特殊功能寄存器的內(nèi)容進(jìn)行變換,使其中的某些位置位而其余位不變。2.邏輯“或”運(yùn)算指令單片機(jī)原理及接口技術(shù)XRLA,#data ;A←A⊕dataXRLA,@Ri ;A←A⊕(Ri)XRLA,Rn ;A←A⊕nXRLA,direct ;A←A⊕(direct)XRLdirect,A ;(direct)←(direct)⊕AXRLdirect,#data ;(direct)←(direct)⊕data3.邏輯“異或”運(yùn)算指令例3-16
若(A)=65H=01100101B,要求使A的高4位取反,低4位置1,并從P1端口輸出。解:根據(jù)題意,相應(yīng)程序如下:XRL A,#0F0H ;A的高4位取反,低4位保留,(A)=10010101B=95HORL A,#0FH ;A的高4位不變,低4位置1,(A)=10011111B=9FHMOV P1,A ;將變換后的結(jié)果從P1端口輸出單片機(jī)原理及接口技術(shù)MCS-51單片機(jī)中,專門(mén)安排了一條累加器清零和一條累加器取反指令,這兩條指令都是單字節(jié)單周期指令。雖然采用數(shù)據(jù)傳送指令或邏輯異或指令可以達(dá)到對(duì)累加器清零和取反的目的,但它們都需要至少兩個(gè)字節(jié)。CLRA;A←0CPLA;A←/A4.累加器清零和取反指令例3-17設(shè)(A)=6AH,且Cy=1,執(zhí)行下列指令后累加器A的值為何值?執(zhí)行指令RLA后,(A)=D4H。執(zhí)行指令RRA后,(A)=35H。執(zhí)行指令RLCA后,(A)=D5H。執(zhí)行指令RRCA后,(A)=B5H。用移位指令還可以實(shí)現(xiàn)算術(shù)運(yùn)算,左移一位相當(dāng)于原內(nèi)容乘以2,右移一位相當(dāng)于原內(nèi)容除以2,但這種運(yùn)算關(guān)系只對(duì)某些數(shù)成立。單片機(jī)原理及接口技術(shù)5.移位指令MCS-51單片機(jī)中移位指令比較少,移位只能對(duì)累加器A進(jìn)行,共有循環(huán)左移、循環(huán)右移、帶進(jìn)位的循環(huán)左移和帶進(jìn)位的循環(huán)右移四種:
循環(huán)左移:RLA
帶Cy循環(huán)左移:RLCA
循環(huán)右移:RRA帶Cy循環(huán)右移:RRCA單片機(jī)原理及接口技術(shù)例3-18
已知內(nèi)存RAM20H、21H單元中有一個(gè)16位數(shù)(低8位在20H中),試?yán)靡莆恢噶顚?shí)現(xiàn)將該16位數(shù)乘以2并保存到30H和31H中(低8位在30H中)。設(shè)乘2后的數(shù)小于65536。例題:ORG 0100HCLR C;Cy
清零MOV A,20H;取操作數(shù)低8位送累加器ARLC A;低8位帶Cy循環(huán)左移一位MOV 30H,A;保存到30H單元中MOV A,21H;取操作數(shù)高8位送累加器ARLC A;高8位帶Cy循環(huán)左移MOV 31H,A;保存到31H單元中SJMP $END分析:左移一位相當(dāng)于原內(nèi)容乘以2,如圖3-7所示,首先將Cy清零,將低8位帶Cy循環(huán)左移1位,然后再對(duì)高8位帶Cy循環(huán)左移1位即可。相應(yīng)程序如下:圖3-716位數(shù)移位示意圖單片機(jī)原理及接口技術(shù)6.累加器A高4位和低4位互換SWAP A ;A3~0←→A7~4該指令的功能是將累加器A高4位和低4位相互交換。例3-19
設(shè)片內(nèi)RAM的30H、31H單元中連續(xù)存放有4個(gè)壓縮型BCD碼數(shù)據(jù),試編制程序?qū)⑦@4個(gè)BCD碼倒序排列。解:一個(gè)壓縮型BCD碼占有4位二進(jìn)制數(shù),2個(gè)字節(jié)單元中共有4個(gè)BCD碼數(shù)據(jù)。要倒序就必須將兩個(gè)字節(jié)單元中的高四位與低四位互相交換。再將兩個(gè)字節(jié)單元的內(nèi)容互相交換即可。相應(yīng)程序如下:MOV A,30H ;A=(30H)=a0a1SWAP A ;A7~4←→A3~0,A=a1a0XCH A,31H ;A←→(31H),A=a2a3,(31H)=a1a0SWAP A ;A=a3a2MOV 30H,A ;(30H)=a3a2單片機(jī)原理及接口技術(shù)位操作指令共有12條,包括位傳送、位置位、位清零和位運(yùn)算等操作指令。此外,還有5條位控制轉(zhuǎn)移指令,本書(shū)將它們歸類到控制轉(zhuǎn)移類指令中。位操作指令的操作數(shù)不是字節(jié),而是字節(jié)中的某一位(該位只能是1或0),故又稱之為布爾變量操作指令。位操作指令的操作對(duì)象為片內(nèi)RAM的20H~2FH中的128個(gè)可尋址位和特殊功能寄存器中11個(gè)可位尋址的寄存器。3.3.4
位操作指令MOVC,bit ;Cy←bitMOVbit,C ;bit←Cy第一條指令的功能是將位地址bit中的內(nèi)容傳送到PSW中的進(jìn)位標(biāo)志位Cy中,第二條指令的功能是將PSW中的進(jìn)位標(biāo)志位Cy中的內(nèi)容傳送到位地址bit中。1.位傳送指令單片機(jī)原理及接口技術(shù)2.位置位和位清零指令SETBC ;Cy←1SETBbit ;bit←1CLRC ;Cy←0CLRbit ;bit←03.位運(yùn)算指令A(yù)NLC,bit ;Cy←Cy∧bitANLC,/bit ;Cy←Cy∧/bitORLC,bit ;Cy←Cy∨bitORLC,/bit ;Cy←Cy∨/bitCPLC ;Cy←/Cy
CPLbit ;bit←/bit單片機(jī)原理及接口技術(shù)例3-20
設(shè)D、E、F都代表位地址,試編程實(shí)現(xiàn)D、E內(nèi)容異或操作,結(jié)果送入F中。分析:可直接按F=D∧/E+/D∧E來(lái)編寫(xiě)。MOV C,DANL C,/E ;Cy←D∧/EMOV D,C ;暫存MOV C,EANL C,/D;Cy←/D∧EORL C,D ;Cy←/D∧E+D∧/EMOV F,C ;結(jié)果存入F中例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)這類指令通過(guò)改變程序計(jì)數(shù)器PC中的內(nèi)容來(lái)控制程序的執(zhí)行過(guò)程,能夠極大地提高程序的效率。控制轉(zhuǎn)移類指令共有22條,包括無(wú)條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令、循環(huán)轉(zhuǎn)移指令及調(diào)用和返回指令。這類指令一般不影響標(biāo)志位。3.3.5
控制轉(zhuǎn)移類指令LJMPaddr16 ;PC←addr16這條指令為三字節(jié)雙周期指令。指令的功能是將指令碼中的addr16送入程序計(jì)數(shù)器PC,使機(jī)器執(zhí)行下條指令時(shí)無(wú)條件轉(zhuǎn)移到addr16處執(zhí)行程序。addr16是16位的地址,因此該指令可以在64KB程序存儲(chǔ)器范圍內(nèi)轉(zhuǎn)移。1.無(wú)條件轉(zhuǎn)移指令
(1)長(zhǎng)轉(zhuǎn)移指令(1條)單片機(jī)原理及接口技術(shù)AJMPaddr11 ;PC←PC+2,PC10~0←addr11,PC15~11不變這條指令是11位地址的無(wú)條件轉(zhuǎn)移指令,為雙字節(jié)指令。指令執(zhí)行后,首先是PC的內(nèi)容加2,即PC+2→PC(這里的PC就是指令存放的地址,PC+2是因?yàn)樵撝噶顬殡p字節(jié)指令),然后PC+2后PC值的高5位和指令中給出的11位地址構(gòu)成轉(zhuǎn)移目標(biāo)地址。因?yàn)?1位地址的范圍為00000000000~11111111111,是一個(gè)帶符號(hào)二進(jìn)制數(shù),所以絕對(duì)轉(zhuǎn)移指令可以在2KB范圍內(nèi)向前或向后轉(zhuǎn)移,但轉(zhuǎn)移到的位置要和PC+2的地址在同一2KB區(qū)域,而不一定與AJMP指令在同一2KB區(qū)域。如果將單片機(jī)64KB尋址區(qū)劃分為32頁(yè)(每頁(yè)2KB),則PC15~11稱為頁(yè)面地址(即0頁(yè)~31頁(yè)),addr11稱為頁(yè)內(nèi)地址。1.無(wú)條件轉(zhuǎn)移指令(2)絕對(duì)轉(zhuǎn)移指令(1條)單片機(jī)原理及接口技術(shù)例3-21
若AJMP指令地址(PC)=2400H。執(zhí)行指令A(yù)JMP0FFH后,程序轉(zhuǎn)移的目標(biāo)地址是什么,并說(shuō)明是向前還是向后轉(zhuǎn)移?解:PC=2400H+2=2402H,PC的高五位和addr11構(gòu)成的地址為20FFH,所以轉(zhuǎn)移的目標(biāo)地址是20FFH,又因?yàn)?0FFH小于2400H,所以程序向前轉(zhuǎn)到20FFH單元開(kāi)始執(zhí)行的。例3-22
若AJMP指令地址(PC)=2FFFH。執(zhí)行指令A(yù)JMP0FFH后,程序轉(zhuǎn)移的目標(biāo)地址是什么,并說(shuō)明是向前還是向后轉(zhuǎn)移?解:PC=2FFFH+2=3001H,PC的高五位和addr11構(gòu)成的地址為30FFH,所以轉(zhuǎn)移的目標(biāo)地址是30FFH,又因?yàn)?0FFH大于2FFFH,所以程序向后轉(zhuǎn)到30FFH單元開(kāi)始執(zhí)行的。例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)SJMPrel ;PC←PC+2,PC←PC+rel這條指令為無(wú)條件相對(duì)轉(zhuǎn)移指令,也是雙字節(jié)指令,轉(zhuǎn)移的目的地址為目的地址=源地址+2+rel例如:在2000H單元有SJMP指令,若rel=28H(正數(shù)),則轉(zhuǎn)移目的地址為202AH(向后轉(zhuǎn));若rel=F6H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為1FF8H(向前轉(zhuǎn))。(3)短轉(zhuǎn)移指令(1條)(4)間接轉(zhuǎn)移指令(1條)JMP@A+DPTR ;PC←A+DPTR這條指令為單字節(jié)無(wú)條件轉(zhuǎn)移指令,轉(zhuǎn)移的地址由累加器A的內(nèi)容和數(shù)據(jù)指針DPTR內(nèi)容之和來(lái)決定,兩者都是無(wú)符號(hào)數(shù)。例如:當(dāng)DPTR為確定的值時(shí),可根據(jù)A值的不同來(lái)控制程序轉(zhuǎn)向不同的程序段,因此有時(shí)也稱為散轉(zhuǎn)指令。單片機(jī)原理及接口技術(shù)例3-23
已知累加器A中放有待處理命令編號(hào)0~3,程序存儲(chǔ)器中首地址為T(mén)ABLE的絕對(duì)轉(zhuǎn)移指令表。試編寫(xiě)程序使機(jī)器按照累加器A中的命令編號(hào)轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序。ORG 1000HRLA ;A←A*2MOV DPTR,#TABLE;表首地址送DPTRJMP @A+DPTR ;根據(jù)A值轉(zhuǎn)移…TABLE:AJMP TAB1 ;當(dāng)(A)=0時(shí)轉(zhuǎn)TAB1執(zhí)行AJMP TAB2 ;當(dāng)(A)=1時(shí)轉(zhuǎn)TAB2執(zhí)行AJMP TAB3 ;當(dāng)(A)=2時(shí)轉(zhuǎn)TAB3執(zhí)行AJMP TAB4 ;當(dāng)(A)=3時(shí)轉(zhuǎn)TAB3執(zhí)行END例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)JZrel ;若A=0,則PC←PC+2+rel
;若A≠0,PC←PC+2JNZrel ;若A≠0,則PC←PC+2+rel
;若A=0,PC←PC+2累加器A的內(nèi)容是否為0,是由這條指令以前的其它指令執(zhí)行的結(jié)果決定的,執(zhí)行這條指令不作任何運(yùn)算,也不影響標(biāo)志位。例3-24
已知片外RAM中首地址為DATA1的一個(gè)數(shù)據(jù)塊以零為結(jié)束標(biāo)志,試編程實(shí)現(xiàn)將該數(shù)據(jù)塊傳送到片內(nèi)RAM首地址為DATA2的存儲(chǔ)區(qū)中。2.條件轉(zhuǎn)移指令(1)累加器A判0轉(zhuǎn)移指令(2條)條件轉(zhuǎn)移指令是在執(zhí)行過(guò)程中需要判斷某種條件是否滿足來(lái)決定是否轉(zhuǎn)移的指令。當(dāng)條件滿足時(shí)就轉(zhuǎn)移,不滿足時(shí)就順序往下執(zhí)行原程序。單片機(jī)原理及接口技術(shù)
分析:外部RAM向內(nèi)部RAM的數(shù)據(jù)轉(zhuǎn)送一定要經(jīng)過(guò)累加器A,利用判零條件轉(zhuǎn)移正好可以判別是否要繼續(xù)傳送或者終止傳送。相應(yīng)程序如下:
ORG 0100H MOV R0,#DATA1 ;R0←外部RAM數(shù)據(jù)塊的地址指針MOV R1,#DATA2 ;R1←內(nèi)部RAM數(shù)據(jù)塊的地址指針LOOP:MOVXA,@R0 ;取外部RAM數(shù)據(jù)送入AJZ EXIT ;數(shù)據(jù)為零則終止傳送MOV@R1,A ;數(shù)據(jù)傳送至內(nèi)部RAM單元INC R0 ;修改指針,指向下一數(shù)據(jù)地址INC R1 ;修改指針,指向下一數(shù)據(jù)地址SJMP LOOP ;循環(huán)取數(shù)EXIT:SJMP $END例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)該類指令的功能是檢測(cè)指定位是1還是0,若條件符合,則CPU轉(zhuǎn)向指定的目標(biāo)地址去執(zhí)行程序;否則,順序執(zhí)行下條指令。JCrel ;若Cy=1,則PC←PC+2+rel
;若Cy=0,PC←PC+2JNCrel ;若Cy=0,則PC←PC+2+rel
;若Cy=1,PC←PC+2JBbit,rel ;若(bit)=1,則PC←PC+3+rel;若(bit)=0,PC←PC+3JNBbit,rel ;若(bit)=0,則PC←PC+3+rel;若(bit)=1,PC←PC+3JBCbit,rel;若(bit)=1,PC←PC+3+rel,且(bit)←0;若(bit)=0,PC←PC+3(2)判位轉(zhuǎn)移指令(5條)單片機(jī)原理及接口技術(shù)例3-25
設(shè)P1端口上的數(shù)據(jù)為11001010B,累加器A的內(nèi)容為01011010B,試判斷執(zhí)行下列指令后程序轉(zhuǎn)到LOOP1還是LOOP2去執(zhí)行。JB P1.4,LOOP1JNBACC.2,LOOP2執(zhí)行結(jié)果:程序轉(zhuǎn)到LOOP2去執(zhí)行。例3-26
設(shè)累加器A的值為01010101B,執(zhí)行下列指令后程序轉(zhuǎn)到LOOP1還是LOOP2去執(zhí)行。A的值為多少?JBCACC.1,LOOP1JBC ACC.2,LOOP2執(zhí)行結(jié)果:程序轉(zhuǎn)到LOOP2去執(zhí)行,且使A=01010001B=51H。例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)比較條件轉(zhuǎn)移指令共有4條,差別只在于操作數(shù)的尋址方式不同。CJNEA,direct,rel ;若A>(direct),則Cy=0且PC←PC+3+rel
;若A<(direct),則Cy=1且PC←PC+3+rel
;若A=(direct),PC←PC+3CJNEA,#data,rel ;若A>data,則Cy=0且PC←PC+3+rel
;若A<data,則Cy=1且PC←PC+3+rel;若A=data,PC←PC+3(3)比較轉(zhuǎn)移指令(4條)單片機(jī)原理及接口技術(shù)比較條件轉(zhuǎn)移指令共有4條,差別只在于操作數(shù)的尋址方式不同。CJNERn,#data,rel ;若Rn>data,則Cy=0且PC←PC+3+rel;若Rn<data,則Cy=1且PC←PC+3+rel;若Rn=data,PC←PC+3CJNE@Ri,#data,rel ;若(Ri)>data,則Cy=0且PC←PC+3+rel;若(Ri)<data,則Cy=1且PC←PC+3+rel;若(Ri)=data,PC←PC+3(3)比較轉(zhuǎn)移指令(4條)單片機(jī)原理及接口技術(shù)若兩個(gè)比較的操作數(shù)都是無(wú)符號(hào)數(shù),則可以直接根據(jù)比較后產(chǎn)生的Cy值來(lái)判別大?。喝鬋y=0,則A>B(設(shè)A為目的操作數(shù),B為源操作數(shù)),若Cy=1,則A<B。若是兩個(gè)有符號(hào)數(shù)進(jìn)行比較,則僅依據(jù)Cy是無(wú)法判別大小的,例如一個(gè)負(fù)數(shù)與一個(gè)正數(shù)相比使Cy=0,就不能說(shuō)明負(fù)數(shù)大于正數(shù)。在這種情況下若要正確判別,可采用圖3-8所示方法。若A為正數(shù),當(dāng)B為負(fù)數(shù)時(shí),A>B;若A為負(fù)數(shù),當(dāng)B為正數(shù)時(shí),A<B;若A為正數(shù),B也為正數(shù),若比較后Cy=0,則A>B,若Cy=1,則A<B;若A為負(fù)數(shù),B也為負(fù)數(shù),若比較后Cy=0,則A>B,若Cy=1,則A<B。因?yàn)樨?fù)數(shù)是用補(bǔ)碼表示,較大的負(fù)數(shù)表示成補(bǔ)碼后的值也比較大。因此,當(dāng)兩個(gè)數(shù)同是正數(shù)或同是負(fù)數(shù)時(shí),判別大小的方法是相同的。圖3-8帶符號(hào)數(shù)的比較單片機(jī)原理及接口技術(shù)循環(huán)轉(zhuǎn)移指令也叫減1條件轉(zhuǎn)移指令,這類指令共2條:DJNZRn,rel;若Rn-1≠0,則PC←PC+2+rel;若Rn-1=0,PC←PC+2DJNZdirect,rel;若(direct)-1≠0,則PC←PC+3+rel;若(direct)-1=0,PC←PC+3,這類指令的功能是先將操作數(shù)減1,并保存結(jié)果。若減1以后操作數(shù)不為零,則轉(zhuǎn)移到規(guī)定的目標(biāo)地址單元;若減1以后操作數(shù)為零,則順序執(zhí)行。(4)循環(huán)轉(zhuǎn)移指令(2條)例3-27試編寫(xiě)當(dāng)從P1口輸入數(shù)據(jù)為01H時(shí),程序繼續(xù)執(zhí)行,否則等待。分析:從P1口輸入數(shù)據(jù)與01H相比較,如果相同執(zhí)行后面程序,不相等就等待。相應(yīng)程序如下:MOVA,#01H ;立即數(shù)01H送AWAIT:CJNEA,P1,WAIT ;(P1)≠01H,則等待單片機(jī)原理及接口技術(shù)例3-28將內(nèi)部RAM首地址為DATA的20個(gè)單元中的無(wú)符號(hào)數(shù)相加,相加結(jié)果送SUM單元保存。設(shè)相加結(jié)果不超過(guò)8位二進(jìn)制數(shù)。解:相應(yīng)程序如下:MOV R0,#14H ;置循環(huán)次數(shù)MOV R1,#DATA ;R1作地址指針,指向數(shù)據(jù)塊首地址CLRA ;A清零LOOP:ADD A,@R1 ;加一個(gè)數(shù)INC R1 ;修改指針,指向下一個(gè)數(shù)DJNZ R0,LOOP ;R0減1,不為0循環(huán)MOV SUM,A ;存結(jié)果例題:?jiǎn)纹瑱C(jī)原理及接口技術(shù)3.子程序調(diào)用和返回指令為了使程序的結(jié)構(gòu)清晰,并減少重復(fù)指令所占用的內(nèi)存空間,在匯編語(yǔ)言程序中可以采用子程序結(jié)構(gòu),故需要有子程序調(diào)用指令。子程序調(diào)用要中斷原有的指令執(zhí)行順序,轉(zhuǎn)移到子程序的入口地址去執(zhí)行子程序。但子程序調(diào)用指令和轉(zhuǎn)移指令有一點(diǎn)重大的區(qū)別,即子程序執(zhí)行完畢后,要返回到原程序被中斷的位置,繼續(xù)往下執(zhí)行。因此,子程序調(diào)用指令還必須能將程序中斷位置的地址保存起來(lái),一般都是放在堆棧中保存。程序調(diào)用指令要完成兩個(gè)功能:保護(hù)斷點(diǎn)地址。斷點(diǎn)地址是子程序調(diào)用指令的下一條指令的地址,它可以是PC+2或PC+3,取決于調(diào)用指令的字節(jié)數(shù),這里PC是指調(diào)用指令所在的地址。將所調(diào)用子程序的入口地址送到程序計(jì)數(shù)器PC,以便實(shí)現(xiàn)子程序調(diào)用。單片機(jī)原理及接口技術(shù)3.子程序調(diào)用和返回指令由圖3-9可以看出,當(dāng)調(diào)用子程序1時(shí),先在堆棧中保存斷點(diǎn)地址1,程序轉(zhuǎn)去執(zhí)行子程序1,執(zhí)行過(guò)程中又要調(diào)用子程序2,于是又保存斷點(diǎn)地址2。在存放斷點(diǎn)地址時(shí),先保存地址低8位,后保存地址高8位。子程序2執(zhí)行完返回時(shí),先取出斷點(diǎn)地址2,繼續(xù)執(zhí)行子程序1,執(zhí)行完之后再取出斷點(diǎn)地址1,返回執(zhí)行主程序。(a)二級(jí)子程序嵌套示意圖(b)轉(zhuǎn)入子程序2時(shí)的堆棧圖3-9子程序嵌套及斷點(diǎn)地址存放單片機(jī)原理及接口技術(shù)MCS-51單片機(jī)中有2條子程序調(diào)用指令:ACALLaddr11 ;PC←PC+2
;SP←SP+1,(SP)←PC7-0SP←SP+1,(SP)←PC15-8;PC10-0←addr11LCALLaddr16 ;PC←PC+3
;SP←SP+1,(SP)←PC7-0,SP←SP+1,(SP)←PC15-8
;PC←addr16ACALL指令稱為絕對(duì)調(diào)用指令,是一條兩字節(jié)指令。子程序調(diào)用的范圍為2KB。若把64KB內(nèi)存空間以2KB字節(jié)為一頁(yè),共可分為32個(gè)頁(yè)面。正常情況下,絕對(duì)調(diào)用指令應(yīng)該和所調(diào)用的子程序在同一個(gè)頁(yè)面之內(nèi),即它們地址的高5位addr15~addr11應(yīng)該相同。(1)調(diào)用指令(2條)單片機(jī)原理及接口技術(shù)返回指令有兩條,但并不和兩條調(diào)用指令對(duì)應(yīng)。一條是一般的子程序返回指令,另一條是中斷服務(wù)子程序返回指令。但這兩條返回指令的功能完全相同,都是將堆棧中的斷點(diǎn)地址恢復(fù)到程序計(jì)數(shù)器PC中,從而使單片機(jī)返回到斷點(diǎn)地址處繼續(xù)執(zhí)行程序。堆棧指針SP的值將減2。RET;子程序返回 ;PC15-8←(SP),SP←SP-1,PC7-0←(SP),SP←SP-1RETI ;中斷服務(wù)子程序返回 ;PC15-8←(SP),SP←SP-1,PC7-4←(SP),SP←SP-1RET指令應(yīng)寫(xiě)在子程序的末尾,而RETI指令應(yīng)在中斷服務(wù)子程序的末尾。執(zhí)行RETI指令后,將清除中斷響應(yīng)時(shí)所置位的中斷優(yōu)先級(jí)狀態(tài)位。(2)返回指令(2條)4.空操作指令NOP ;PC←PC+1該指令為單字節(jié)單周期指令,在時(shí)間上占用一個(gè)機(jī)器周期。單片機(jī)原理及接口技術(shù)匯編語(yǔ)言是一種面向CPU硬件系統(tǒng)的程序設(shè)計(jì)語(yǔ)言,它采用指令助記符來(lái)表示操作碼和操作數(shù),用符號(hào)地址來(lái)表示操作數(shù)的地址,因而很容易為人們識(shí)別、記憶和讀/寫(xiě),給編程帶來(lái)很大方便。利用匯編語(yǔ)言編寫(xiě)的程序可以直接利用硬件系統(tǒng)的特性,直接對(duì)位、字節(jié)、字、寄存器、存儲(chǔ)單元和I/O端口等進(jìn)行處理。同時(shí),也能直接使用CPU指令系統(tǒng)和指令系統(tǒng)提供的各種尋址方式編寫(xiě)出高質(zhì)量的程序,所編寫(xiě)的程序不但占用內(nèi)存空間小,而且執(zhí)行速度快。因此很多高級(jí)計(jì)算機(jī)技術(shù)人員大量使用匯編語(yǔ)言來(lái)編寫(xiě)計(jì)算機(jī)系統(tǒng)程序,實(shí)時(shí)通信程序和實(shí)時(shí)控制程序等。3.4
匯編語(yǔ)言程序設(shè)計(jì)單片機(jī)原理及接口技術(shù)用匯編語(yǔ)言編寫(xiě)的源程序在輸入計(jì)算機(jī)后,需要將其翻譯成目標(biāo)程序,計(jì)算機(jī)才能執(zhí)行相應(yīng)命令,這個(gè)翻譯過(guò)程稱為匯編。匯編主要有手工匯編和機(jī)器匯編兩種方式。手工匯編是通過(guò)查閱每條指令的指令碼,編輯成單片機(jī)直接執(zhí)行的機(jī)器程序;機(jī)器匯編是通過(guò)PC運(yùn)行一種計(jì)算機(jī)軟件,把匯編語(yǔ)言源程序轉(zhuǎn)換成機(jī)器程序,這個(gè)軟件稱為匯編程序軟件。機(jī)器匯編時(shí),為便于機(jī)器操作,匯編程序會(huì)提供一些本身的操作指令,而有些匯編程序本身的操作指令出現(xiàn)在匯編語(yǔ)言源程序中,但它不是控制單片機(jī)操作的指令,而是控制匯編程序的指令,所以被稱為偽指令。偽指令自身并不產(chǎn)生機(jī)器碼,不屬于指令系統(tǒng),而僅僅是為匯編服務(wù)的一些指令。3.4.1
匯編語(yǔ)言偽指令格式:ORG16位地址功能:規(guī)定下面的目標(biāo)程序或數(shù)據(jù)存放的起始地址。指令中給出的通常為十六進(jìn)制地址,也可以是已定義的標(biāo)號(hào)地址。例如:ORG0100H ;指示后面的程序或數(shù)據(jù)塊以0100H為起始地址連續(xù)存放。1.定位偽指令ORG單片機(jī)原理及接口技術(shù)格式:字符名稱EQU數(shù)據(jù)或匯編符號(hào)功能:將一個(gè)數(shù)據(jù)或特定的匯編符號(hào)賦予規(guī)定的字符名稱。例如:EX1EQUR0 ;EX1與R0等值EX1EQU20H ;EX2與20H等值MOVA,EX1 ;(A)←(R0)MOVR1,#EX2 ;(R1)←20H這里將EX1等值為匯編符號(hào)R0,在指令中EX1就可以代替R0來(lái)使用。3.賦值偽指令EQU2.結(jié)束偽指令END格
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高鐵保健員聘用協(xié)議
- 網(wǎng)絡(luò)游戲玩家行為規(guī)范
- 基礎(chǔ)建設(shè)水利施工合同范本
- 產(chǎn)業(yè)升級(jí)二手廠房買(mǎi)賣合同模板
- 城市建設(shè)關(guān)聯(lián)交易公共資源分配
- 城市綠化景觀改造養(yǎng)護(hù)合同
- 地下綜合管廊工程勞務(wù)招標(biāo)
- 礦山環(huán)保認(rèn)證項(xiàng)目施工合同模板
- 地質(zhì)災(zāi)害治理合同
- 土地管理中的公民參與機(jī)制
- 安置房項(xiàng)目二次結(jié)構(gòu)磚砌體工程專項(xiàng)施工方案培訓(xùn)資料
- SB/T 10756-2012泡菜
- GB/T 36393-2018土壤質(zhì)量自然、近自然及耕作土壤調(diào)查程序指南
- GB/T 3045-2017普通磨料碳化硅化學(xué)分析方法
- 新疆維吾爾自治區(qū)公共建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn)實(shí)施細(xì)則2023
- 2022年西藏自治區(qū)中考英語(yǔ)真題卷(含答案與解析)
- 醫(yī)院輸血質(zhì)量管理考核標(biāo)準(zhǔn)
- 七年級(jí)語(yǔ)文上冊(cè):15、《古代詩(shī)歌四首》教案
- 氣道評(píng)估與處理課件
- 腦血管病的介入診療課件
- RCS-9626CN電動(dòng)機(jī)保護(hù)測(cè)控裝置
評(píng)論
0/150
提交評(píng)論