單片微型計(jì)算機(jī)原理及接口技術(shù) 課件 7 指令系統(tǒng)_第1頁(yè)
單片微型計(jì)算機(jī)原理及接口技術(shù) 課件 7 指令系統(tǒng)_第2頁(yè)
單片微型計(jì)算機(jī)原理及接口技術(shù) 課件 7 指令系統(tǒng)_第3頁(yè)
單片微型計(jì)算機(jī)原理及接口技術(shù) 課件 7 指令系統(tǒng)_第4頁(yè)
單片微型計(jì)算機(jī)原理及接口技術(shù) 課件 7 指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩98頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片微型計(jì)算機(jī)原理及接口技術(shù)(7)1/24內(nèi)容提綱一助記符語(yǔ)言二指令格式及分類(lèi)三尋址方式2/24助記符語(yǔ)言一3/241.助記符語(yǔ)言描述機(jī)器語(yǔ)言(MachineLanguage)是用二進(jìn)制數(shù)表示的指令,是CPU唯一能夠直接識(shí)別和執(zhí)行的程序形式。例如:248B機(jī)器語(yǔ)言的缺點(diǎn)是不直觀,不易識(shí)別、理解和記憶,因此編寫(xiě)、調(diào)試程序時(shí)都不采用這種形式的語(yǔ)言。為了解決這個(gè)問(wèn)題,引入了助記符。匯編語(yǔ)言的指令通常由操作碼和操作數(shù)組成。操作碼指出的是要對(duì)操作數(shù)進(jìn)行什么操作。操作數(shù)指出的是對(duì)什么數(shù)進(jìn)行操作以及將操作的結(jié)果放到何處。為便于閱讀和記憶,操作碼用規(guī)定的縮寫(xiě)英文字母組成,稱(chēng)為助記符。例如,MOV是數(shù)據(jù)的傳送,ADD是數(shù)據(jù)的相加運(yùn)算,ANL是數(shù)據(jù)的邏輯與運(yùn)算等。4/241.助記符語(yǔ)言描述例如,ADDA,#8BH該指令表示“把十六進(jìn)制數(shù)8BH和累加器A的內(nèi)容相加,將結(jié)果存在累加器A中”。其中ADD是操作碼符號(hào)。A和8BH是操作數(shù)。前者反映了該指令的功能是做加法,后者則表示相加的對(duì)象是A累加器中的內(nèi)容和十六進(jìn)制數(shù)8BH。指令A(yù)DDA,#8BH經(jīng)匯編后,就是248B(十六進(jìn)制,兩個(gè)字節(jié):24H和8BH)又如:MOVA,#76H這條指令,表示的是將十六進(jìn)制的數(shù)據(jù)76H送到累加器A中,它所對(duì)應(yīng)的二進(jìn)制機(jī)器語(yǔ)言是:01110100和01110110兩個(gè)8位二進(jìn)制數(shù),稱(chēng)為2個(gè)字節(jié),用十六進(jìn)制數(shù)表示就是:74H,76H。其中的74H表示操作碼,是指將一個(gè)數(shù)據(jù)傳送到累加器A中,被傳送的數(shù)據(jù)就是操作碼的下一個(gè)字節(jié),也就是第2個(gè)字節(jié),即76H。5/242.操作碼操作碼是指令功能的英文縮寫(xiě)。下表給出了8051內(nèi)核單片機(jī)指令系統(tǒng)中最常用的操作碼。操作碼含義1、數(shù)據(jù)傳送類(lèi)MOVMOVXMOVC

在內(nèi)部RAM中傳送字節(jié)變量(數(shù)據(jù)存儲(chǔ)器、I/O口)在外部RAM和A之間傳送數(shù)據(jù)將程序存儲(chǔ)器中的數(shù)據(jù)傳送給A2、數(shù)據(jù)操作類(lèi)ADDSUBBMULDIV

加帶借位減乘除3、程序控制類(lèi)AJMP(SJMP、LJMP)JZ、JC、JB(JNZ、JNC、JNB)ACALL(LCALL)RETCJNE

絕對(duì)轉(zhuǎn)移(短轉(zhuǎn)移、長(zhǎng)轉(zhuǎn)移)有條件轉(zhuǎn)移絕對(duì)調(diào)用(長(zhǎng)調(diào)用)子程序返回第一操作數(shù)與第二操作數(shù)比較不等則轉(zhuǎn)移4、邏輯操作類(lèi)ANLORLXRL

與或異或6/243.操作數(shù)

操作數(shù)是一條指令操作的對(duì)象。操作數(shù)可以是數(shù)據(jù),也可以是地址。不同功能的指令,操作對(duì)象形式不同。不同指令的操作數(shù)特點(diǎn)如下:(1)傳送類(lèi)指令,必須指明操作對(duì)象從哪兒來(lái)(源地址),傳到何處去(稱(chēng)為目的地址)。(2)數(shù)據(jù)操作類(lèi)指令,一般靠運(yùn)算器完成,數(shù)據(jù)操作類(lèi)指令的對(duì)象一般是兩個(gè)。(3)程序控制類(lèi)指令的操作對(duì)象是程序計(jì)數(shù)器PC和一個(gè)數(shù)。(4)邏輯操作類(lèi)有單操作數(shù)和雙操作數(shù)之分。7/243.操作數(shù)

注意:(1)數(shù)據(jù)只能是整數(shù),不能是小數(shù)。(2)當(dāng)匯編指令中的數(shù)據(jù)是十六進(jìn)制且是以字母開(kāi)頭時(shí),該數(shù)據(jù)應(yīng)加一個(gè)前導(dǎo)0,以表示后面的字母不是變量而是數(shù)字。(3)在8051內(nèi)核單片機(jī)中,一個(gè)數(shù)據(jù)的前面有前綴#號(hào)則表示后面的數(shù)據(jù)是立即數(shù),如果數(shù)據(jù)的前面沒(méi)有#號(hào),則說(shuō)明該數(shù)據(jù)表示的是直接地址。立即數(shù)可以寫(xiě)成十進(jìn)制的格式,也可以寫(xiě)成十六進(jìn)制數(shù)的格式,還可以寫(xiě)成二進(jìn)制數(shù)的格式。其區(qū)分是在數(shù)據(jù)的后面加上后綴以示區(qū)別:十進(jìn)制數(shù)據(jù)的后綴為D(可省略不寫(xiě)),十六進(jìn)制數(shù)據(jù)的后綴為H,二進(jìn)制數(shù)據(jù)的后綴為B。8/24指令格式及分類(lèi)二9/241.匯編語(yǔ)言的概念及格式

用助記符來(lái)描述機(jī)器指令的語(yǔ)言稱(chēng)為符號(hào)語(yǔ)言或匯編語(yǔ)言,匯編語(yǔ)言一般格式如下:

[標(biāo)號(hào):]操作碼助記符[第一操作數(shù)][,第二操作數(shù)][,第三操作數(shù)][;注釋]其中,帶有中括號(hào)的內(nèi)容是可以省略的內(nèi)容或者指令格式中不需要的內(nèi)容。標(biāo)號(hào)后面有一個(gè)冒號(hào)“:”,它實(shí)質(zhì)上是標(biāo)號(hào)所在行的指令的地址,根據(jù)程序設(shè)計(jì)的需要設(shè)置。標(biāo)號(hào)是由字母開(kāi)頭的有意義的字符串組成,例如:LOOPLOOP1TABLE。另外,在匯編語(yǔ)言程序中,標(biāo)號(hào)也用作子程序的名字。匯編語(yǔ)言中的操作碼助記符表示了指令的功能,操作數(shù)表示指令操作的對(duì)象。10/241.匯編語(yǔ)言的概念及格式

操作數(shù):根據(jù)指令的語(yǔ)法要求,一條指令中,可能有0~3個(gè)操作數(shù)。例如:RETI ;中斷返回,無(wú)操作數(shù)

CPL A ;累加器逐位取反,只有一個(gè)操作數(shù)

ADD A,#56H ;兩個(gè)操作數(shù)的情況

CJNE R2,#60H,LOOP ;三個(gè)操作數(shù)的情況注釋注釋是為了閱讀程序方便由編程人員加上的,并不影響程序的執(zhí)行和功能,所以,注釋部分不是必需的。注釋部分必須用分號(hào)“;”或“//”開(kāi)頭,也可以使用“/*...*/”的形式注釋某一段內(nèi)容。一般都寫(xiě)在它所注釋的指令的后面或者某段程序的開(kāi)始,注釋本身只用于對(duì)指令功能加以說(shuō)明,使閱讀程序時(shí)便于理解,所以注釋可以用中文或者英文甚至任何便于理解的字符表示。11/242.指令代碼的存儲(chǔ)格式

指令代碼是匯編語(yǔ)言中指令的二進(jìn)制表示方法,是指令在存儲(chǔ)器中存放的形式。在機(jī)器中為了方便表示,將8位二進(jìn)制碼表示為一個(gè)字節(jié)。8051內(nèi)核的單片機(jī)的指令長(zhǎng)度有單字節(jié)、雙字節(jié)、三字節(jié)三種,在存儲(chǔ)器中分別占有1~3個(gè)單元。其格式如下:

單字節(jié)指令:RET ;機(jī)器代碼:22H

雙字節(jié)指令:MOVA,#0FH;機(jī)器代碼:74H0FH

三字節(jié)指令:MOV74H,#0BH;機(jī)器代碼:75H74H0BH12/242.指令代碼的存儲(chǔ)格式

例如,程序中有如下兩條連續(xù)存放的指令:MOVA,#68H ;對(duì)應(yīng)的機(jī)器碼是:74H和68HMOVB,#73H ;對(duì)應(yīng)的機(jī)器碼是75H、F0H和73H假設(shè)這兩條指令存放的起始地址是1000H,則存放格式為:地址指令……1004H73H1003HF0H1002H75H1001H68H1000H74H……13/243.指令中的符號(hào)約定

表4-18051單片機(jī)指令中的常用符號(hào)及含義

符號(hào)含義A累加器ACCB寄存器BC進(jìn)(借)位標(biāo)志位,在位操作指令中作為累加器使用addr8直接地址,代表8位內(nèi)部RAM的地址bit位地址,內(nèi)部RAM中的可尋址位和SFR中的可尋址位#data88位常數(shù)(8位立即數(shù))#data1616位常數(shù)(16位立即數(shù))@間接尋址rel8位帶符號(hào)偏移量,其值為-128-+127。實(shí)際編程時(shí)通常使用標(biāo)號(hào),偏移量的計(jì)算由匯編程序自動(dòng)計(jì)算得出。Rn當(dāng)前工作區(qū)(0~3區(qū))的工作寄存器(n=0,1,…,7)Ri可用作地址寄存器的工作寄存器R0和R1(i=0,1)(X)X寄存器內(nèi)容((X))由X寄存器尋址的存儲(chǔ)單元的內(nèi)容→表示數(shù)據(jù)的傳送方向/表示位操作數(shù)取反∧表示邏輯與操作∨表示邏輯或操作⊕表示邏輯異或操作14/24尋址方式三15/24操作數(shù)是指令的重要組成部分,它指定了參與運(yùn)算的數(shù)或數(shù)所在的單元地址,而如何得到這個(gè)地址就稱(chēng)為尋址方式。8051內(nèi)核的單片機(jī)共有7種尋址方式,描述如下:1.立即尋址指令中的源操作數(shù)是立即數(shù),這種尋址方式叫做立即尋址。立即數(shù)的類(lèi)型可以是數(shù)字也可以是字符,一般字長(zhǎng)為8位或16位。例MOVA,#28H ;把十六進(jìn)制的立即數(shù)28H送入到累加器A中,機(jī)器碼:74H28HMOVDPTR,#0050H;把十六進(jìn)制的16位立即數(shù)0050H送入到DPTR中MOVA,#28H執(zhí)行示意圖16/242.寄存器尋址指定寄存器的內(nèi)容為操作數(shù),對(duì)寄存器ACC、B、DPTR和CY(進(jìn)位標(biāo)志,也是布爾處理機(jī)的累加器)尋址時(shí),具體的寄存器已隱含在其操作碼中。而對(duì)選定的8個(gè)工作寄存器R7~R0,則用指令操作碼的低3位指明所用的寄存器。例INCR5 ;把寄存器R5的內(nèi)容加1后再送回R5INCR5指令執(zhí)行示意圖17/243.直接尋址直接尋址就是在指令中包含了操作數(shù)的地址,即在指令中直接包含了參加運(yùn)算或傳送的單元或位的地址。直接尋址可訪問(wèn)三種地址空間:1) 特殊功能寄存器SFR:直接尋址是唯一的訪問(wèn)形式。2) 內(nèi)部數(shù)據(jù)RAM中的00H~7FH的128個(gè)字節(jié)單元。3) 位地址空間。例MOVA,45H ;把45H單元的內(nèi)容送入累加器A中MOVA,45H指令執(zhí)行示意圖18/244.寄存器間接尋址指令指定某一寄存器的內(nèi)容作為操作數(shù)地址??捎脕?lái)間接尋址的寄存器有:選定工作寄存器區(qū)的R0、R1、堆棧指針SP或者16位的數(shù)據(jù)指針DPTR,使用時(shí)前面加@表示間接尋址。例MOVA,@R0 ;將R0中的內(nèi)容所表示的地址單元中的內(nèi)容送給A

MOVX@DPTP,A ;將A中的內(nèi)容送到DPTR指向的外部RAM單元中MOVA,@R0指令示意圖19/245.變址尋址由指令指定的偏移量寄存器和基址寄存器DPTR或PC相加所得結(jié)果作為操作數(shù)地址。第一類(lèi)用PC作基地址寄存器加上累加器A的內(nèi)容形成操作數(shù)的地址A+PC。例

MOVCA,@A+PC ;讀取A+PC指向的程序存儲(chǔ)器單元的值送給A其中A作為偏移量寄存器(稱(chēng)為變址寄存器),PC作為基址寄存器,A中內(nèi)容為無(wú)符號(hào)數(shù)和PC相加,從而得到其真正的操作數(shù)地址。例如:…01007402MOVA,#02010283MOVCA,@A+PC010300NOP010400NOP010564DB64H…20/245.變址尋址第二類(lèi)變址尋址使用DPTR作基地址寄存器,加上累加器A的內(nèi)容形成操作數(shù)的地址A+DPTR(常用)。例如:

… MOVA,#02H MOVDPTR,#TABLE MOVCA,@A+DPTR …TABLE: DB30H DB31H DB32H …變址尋址的執(zhí)行過(guò)程21/246.相對(duì)尋址該尋址方式主要用于相對(duì)跳轉(zhuǎn)指令。把指令中給定的地址偏移量與本指令所在單元地址(即程序計(jì)數(shù)器PC中的內(nèi)容)相加,得到真正的程序轉(zhuǎn)移地址。與變址方式不同,該偏移量有正、負(fù)號(hào),在該機(jī)器指令中必須以補(bǔ)碼形式給出,所轉(zhuǎn)移的范圍為相對(duì)于當(dāng)前PC值的-128~+127之間。例JC80H

JC80H執(zhí)行示意圖22/247.位尋址支持位單元存取操作是8051內(nèi)核單片機(jī)的一個(gè)主要特點(diǎn)。位操作指令可以對(duì)位地址空間的每一位進(jìn)行運(yùn)算和傳送操作。例MOVC,P1.0 ;將P1.0的狀態(tài)傳送到進(jìn)位標(biāo)志CY

SETB20H.6 ;將20H單元的第6位置為1

CLR25H;將25H位的內(nèi)容清零比較:

MOV A,60HMOV C,60H

23/24下一講內(nèi)容

1、數(shù)據(jù)傳送類(lèi)指令

2、邏輯操作類(lèi)指令

3、算術(shù)運(yùn)算類(lèi)指令24/24單片微型計(jì)算機(jī)原理及接口技術(shù)(8)25/42內(nèi)容提綱一數(shù)據(jù)傳送類(lèi)指令二邏輯操作類(lèi)指令三算術(shù)運(yùn)算類(lèi)指令26/42數(shù)據(jù)傳送類(lèi)指令一27/42數(shù)據(jù)傳送類(lèi)指令簡(jiǎn)介

數(shù)據(jù)傳送類(lèi)指令是使用頻率最高的一類(lèi)指令。主要用來(lái)給8051單片機(jī)系統(tǒng)的內(nèi)部和外部資源賦值、進(jìn)行堆棧的存取操作等。數(shù)據(jù)傳送類(lèi)指令執(zhí)行前后,對(duì)程序狀態(tài)字PSW一般不產(chǎn)生影響。按其操作方式,又可把它們分為三種:數(shù)據(jù)傳送數(shù)據(jù)交換棧操作。28/421.傳送指令——MOVMOV指令的作用區(qū)間主要是內(nèi)部數(shù)據(jù)存儲(chǔ)器和特殊功能寄存器。格式為MOV<目的字節(jié)>,<源字節(jié)>把第二操作數(shù)指定的字節(jié)變量傳送到由第一操作數(shù)指定的單元中,源字節(jié)內(nèi)容不變,一般不影響別的寄存器或標(biāo)志。(1)立即數(shù)送累加器A和Rn、內(nèi)部RAM、SFR。共有4條指令:

MOVA,#data8 ;(A)←#data8MOVaddr8,#data8 ;(addr8)←#data8MOV@Ri,#data8 ;((Ri))←#data8MOVRn,#data8 ;(Rn)←#data8@符號(hào)表示間接尋址,Ri中i=0或i=1

29/42例 MOVR0,#60H ;將立即數(shù)60H送到寄存器R0中

MOV@R0,#56H ;將立即數(shù)56H送入到R0間接尋址的單元中, ;執(zhí)行后60H單元的內(nèi)容變?yōu)?6H利用直接尋址可把立即數(shù)送入片內(nèi)RAM任意單元或任意特殊功能寄存器,如:

MOV20H,#56H ;將立即數(shù)56H送入20H單元中

MOVP2,#80H ;把立即數(shù)80H直接送入P2口中

30/42(2)Rn、內(nèi)部RAM、SFR與累加器A傳送數(shù)據(jù)。共有6條指令:MOVA,addr8 ;(A)←(addr8)MOVA,@Ri ;(A)←((Ri))MOVA,Rn ;(A)←(Rn)MOVaddr8,A ;(addr8)←(A)MOV@Ri,A ;((Ri))←(A)MOVRn,A ;(Rn)←(A)間接尋址@Ri是以Ri的內(nèi)容作為地址進(jìn)行尋址,由于Ri為8位寄存器,所以其尋址范圍可為00H~FFH。例如,指令序列:MOVR1,#82HMOVA,@R1上述指令組合對(duì)于STC8H8K64U單片機(jī)而言,其功能是將內(nèi)部RAM的82H單元中的內(nèi)容送到A中。內(nèi)部80H~FFH的RAM單元,只能使用這種間接尋址方式進(jìn)行訪問(wèn)。MOVA,82H和MOVA,DPL是等價(jià)的!

31/42(3)Rn、SFR和內(nèi)部RAM之間的數(shù)據(jù)傳送。共有5條指令:MOVaddr8,addr8 ;(addr8目)←(addr8源)MOVaddr8,@Ri ;(addr8)←((Ri))MOVaddr8,Rn ;(addr8)←(Rn)MOV@Ri,addr8 ;((Ri))←(addr8)MOVRn,addr8 ;(Rn)←(addr8)例

用立即尋址指令可直接給片內(nèi)RAM中30H和P1口上置數(shù):

MOV30H,#25HMOVP1,#0CAH執(zhí)行后使(30H)=25H,(P1)=0CAH。(4)目標(biāo)地址傳送:功能:把16位常數(shù)裝入數(shù)據(jù)指針。只有一條指令:MOVDPTR,#data16例MOVDPTR,#2050H;表示把16位常數(shù)裝入數(shù)據(jù)指針。執(zhí)行后,DPTR=2050H,其中DPH=20H,DPL=50H。

32/42

2.外部數(shù)據(jù)存儲(chǔ)器(或擴(kuò)展并行I/O口)與累加器A傳送指令——MOVXMOVX指令主要用于累加器A和外部RAM或擴(kuò)展并行I/O口進(jìn)行數(shù)據(jù)傳送。這種傳送只有一種尋址方式,就是寄存器間接尋址。寄存器間接尋址有兩種方式:(1)用R1或R0進(jìn)行寄存器間接尋址可訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器(或擴(kuò)展并行I/O口)256個(gè)字節(jié)中的一個(gè)字節(jié)。需使用P2口輸出高8位地址,需要先給P2和Ri賦值,然后執(zhí)行MOVX指令。MOVXA,@Ri ;(A)←((Ri))MOVX@Ri,A ;((Ri))←(A)(2)用16位的數(shù)據(jù)存儲(chǔ)器地址指針DPTR進(jìn)行寄存器間接尋址

這種方式

能遍訪64KB的外部數(shù)據(jù)存儲(chǔ)器(或擴(kuò)展并行I/O口)的任何單元。MOVXA,@DPTR ;(A)←((DPTR))MOVX@DPTR,A ;((DPTR))←(A)例

假設(shè)片外數(shù)據(jù)存儲(chǔ)器單元中:(1000H)=(60H),(1001H)=(2FH)

MOVDPTR,#1000HMOVXA,@DPTR ;執(zhí)行后,累加器(A)=60H33/42

3.程序存儲(chǔ)器向累加器A傳送指令——MOVC對(duì)于程序存儲(chǔ)器的訪問(wèn),單片機(jī)提供了兩條極其有用的查表指令:指令格式:MOVCA,@A+PC ;PC←(PC)+1,(A)←((A)+(PC))MOVCA,@A+DPTR ;(A)←((A)+(DPTR))這兩條指令采用變址尋址,以PC或DPTR為基址寄存器,以累加器A為變址寄存器,基址寄存器與變址寄存器內(nèi)容相加得到程序存儲(chǔ)器某單元的地址值,MOVC指令把該存儲(chǔ)單元的內(nèi)容傳送到累加器A中。指令主要用于查表,即完成從程序存儲(chǔ)器讀取數(shù)據(jù)的功能。由于兩條指令使用的基址寄存器不同,因此使用范圍也不同。第一條指令以PC作為基址寄存器,指令查表范圍只能在以PC當(dāng)前值開(kāi)始后的256個(gè)字節(jié)范圍內(nèi),使表格地址空間分配受到限制。第二條指令以數(shù)據(jù)指針DPTR為基址寄存器,由于DPTR可以通過(guò)指令來(lái)設(shè)置,表格常數(shù)可設(shè)置在64K程序存儲(chǔ)器的任何地址空間。若DPTR已有它用,在將表首地址賦給DPTR之前必須保護(hù)現(xiàn)場(chǎng),執(zhí)行完查表后再予以恢復(fù)。34/42例4-2:試編制根據(jù)累加器A中的數(shù)(0~9之間)查其平方表的子程序。解:可用下列程序代碼:GETSQ:

PUSH DPH PUSH DPL ;保護(hù)DPTR內(nèi)容

MOV DPTR,#TABLE ;賦表首址→DPTR MOVC A,@A+DPTR ;據(jù)A中內(nèi)容查表

POP DPL POP DPH ;恢復(fù)DPTR原內(nèi)容

RET ;返回TABLE:DB00,01,04,09,16,25,36,49,64,81其中,DB是偽指令,其作用是將它后面的值(00、01等)存入由標(biāo)號(hào)TABLE開(kāi)始的連續(xù)單元中。若累加器A的原內(nèi)容為07,則執(zhí)行上述程序后,返回時(shí)(執(zhí)行RET指令),累加器的值將變?yōu)?9。為了便于閱讀,定義字節(jié)數(shù)據(jù)時(shí),采用了十進(jìn)制表示。35/42

4.?dāng)?shù)據(jù)交換指令(1)字節(jié)交換指令XCHA,addr8 ;(A)←→(addr8)XCHA,@Ri ;(A)←→((Ri))XCHA,Rn ;(A)←→(Rn)指令把累加器A中的內(nèi)容與第二操作數(shù)的內(nèi)容互相交換。例:

設(shè)(R0)=20H,(A)=3FH,(20H)=75H,執(zhí)行指令

XCHA,@R0 ;執(zhí)行結(jié)果(A)=75H,(20H)=3FH(2)半字節(jié)交換指令XCHDA,@Ri ;(A3~0)←→((Ri)3~0)指令把累加器A的低4位和寄存器間接尋址的內(nèi)部RAM單元的低4位交換,高4位內(nèi)容不變,不影響標(biāo)志位。例:設(shè)R1的內(nèi)容為30H,A的內(nèi)容為69H,內(nèi)部RAM中30H的內(nèi)容為87H,執(zhí)行指令

XCHDA,@R1 ;結(jié)果:(A)=67H,(30H)=89H36/425.棧操作指令堆棧區(qū)是將內(nèi)部存儲(chǔ)器的一部分區(qū)域劃作專(zhuān)門(mén)用于堆棧的區(qū)域。堆棧區(qū)的操作規(guī)則是后進(jìn)先出(LIFO—LastInFirstOut),即最后存入的數(shù)據(jù)將被最先取出。堆棧區(qū)當(dāng)前的棧頂?shù)刂酚枚褩V羔樇拇嫫鱏P中的值表示,即SP始終指向棧頂。

37/42相關(guān)概念主程序子程序調(diào)用子程序壓棧出棧斷點(diǎn)地址保護(hù)現(xiàn)場(chǎng)恢復(fù)現(xiàn)場(chǎng)38/425.棧操作指令PUSHaddr8 ;(SP)←(SP)+1,((SP))←(addr8)POPaddr8 ;(addr8)←((SP)),(SP)←(SP)-1上述兩條指令完成兩種基本堆棧操作:壓入堆棧(PUSH),彈出堆棧(POP)。堆棧中的數(shù)據(jù)以“后進(jìn)先出”的方式處理,這種“后進(jìn)先出”的特點(diǎn)由堆棧指針SP來(lái)控制,SP用來(lái)自動(dòng)跟蹤棧頂?shù)刂?。入棧和出棧操作過(guò)程如下:(1)入棧操作:先(SP)+1→(SP),指向棧頂?shù)纳弦粋€(gè)空單元,然后把直接尋址單元的內(nèi)容壓入SP所指的單元中。(2)出棧操作:先彈出棧頂內(nèi)容到直接尋址單元,然后(SP)-1→(SP),形成新的堆棧指針。

39/42

PUSHACC;保護(hù)累加器ACC中內(nèi)容PUSHPSW ;保護(hù)標(biāo)志寄存器內(nèi)容 ;執(zhí)行其他程序POPPSW;恢復(fù)標(biāo)志寄存器內(nèi)容POPACC;恢復(fù)累加器ACC中內(nèi)容該程序執(zhí)行后,累加器ACC和PSW寄存器中的內(nèi)容可得到正確的恢復(fù)。若為:

PUSHACCPUSHPSW;其他程序POPACCPOPPSW執(zhí)行后,將使得ACC和PSW中的內(nèi)容互換。40/42數(shù)據(jù)傳送類(lèi)指令的注意事項(xiàng)

在數(shù)據(jù)傳送類(lèi)操作中應(yīng)注意以下幾點(diǎn):1)除了用POP或MOV指令將數(shù)據(jù)傳送到PSW外,傳送操作一般不影響標(biāo)志位。當(dāng)向累加器中傳送數(shù)據(jù)時(shí),會(huì)影響PSW中的P標(biāo)志。2)執(zhí)行傳送類(lèi)指令時(shí),把源地址單元的內(nèi)容送到目的地址單元后,源地址單元中的內(nèi)容不變。3)對(duì)特殊功能寄存器SFR的操作必須使用直接尋址,也就是說(shuō),直接尋址是訪問(wèn)SFR的唯一方式。4)對(duì)于8052單片機(jī)內(nèi)部RAM的80H~FFH單元只能使用@Ri間接尋址方式訪問(wèn)。5)將累加器A壓入堆?;驈棾龆褩r(shí),應(yīng)使用PUSHACC和POPACC指令,不能使用PUSHA和POPA指令。否則,程序編譯會(huì)出錯(cuò)。因?yàn)槔奂悠鲗?xiě)成A或ACC在匯編語(yǔ)言指令中是有區(qū)別的,使用A時(shí),表示使用的是寄存器尋址方式;而使用ACC時(shí),表示使用的是直接尋址方式。41/42邏輯操作類(lèi)指令二42/42邏輯操作類(lèi)指令包括與、或、清除、求反、左右移位等邏輯操作,共有24條。按操作數(shù)的個(gè)數(shù)可劃分為單操作數(shù)和雙操作數(shù)兩種。表4-2給出了邏輯操作類(lèi)指令的助記符。43/421.對(duì)累加器A進(jìn)行邏輯操作

對(duì)累加器A進(jìn)行的邏輯操作包括清零、求反和移位。(1)累加器A清0指令:CLRA ;(A)←0功能:把00H送入累加器A中(2)累加器A求反指令:CPLA ;(A)←()功能:把累加器內(nèi)容求反后送入累加器A中。例如,設(shè)累加器A原來(lái)內(nèi)容為67H,則執(zhí)行CLRA后將變成00H,再執(zhí)行CPLA后將變?yōu)?FFH。44/42(3)累加器A左右移位RLA ;累加器左循環(huán)移位RLCA ;累加器通過(guò)進(jìn)位標(biāo)志CY左循環(huán)移位RRA ;累加器右循環(huán)移位RRCA ;累加器通過(guò)進(jìn)位標(biāo)志CY右循環(huán)移位SWAPA ;交換累加器兩個(gè)半字節(jié)左移一位相當(dāng)于乘2,右移一位相當(dāng)于除2例:MOVA,#0A5HSWAPA ;執(zhí)行結(jié)果

(A)=5AH指令SWAP交換A中低和高半字節(jié)(位3~0和位7~4),所以也看作是一個(gè)4位循環(huán)移位指令,不影響標(biāo)志。45/42

【例4-3】在40H和41H中存放1個(gè)雙字節(jié)數(shù)據(jù)(即16位數(shù)據(jù)),高位字節(jié)數(shù)據(jù)在41H中,低位字節(jié)數(shù)據(jù)在40H中,試將其除以2。解:利用循環(huán)右移指令可以將1個(gè)字節(jié)的數(shù)據(jù)除以2。如果將雙字節(jié)數(shù)據(jù)除以2,可以考慮使用帶進(jìn)位標(biāo)志CY的循環(huán)右移指令。程序代碼如下:CLR C ;先將進(jìn)位標(biāo)志清0,為第一次移位做準(zhǔn)備MOV A,41HRRC AMOV 41H,A ;高位字節(jié)MOV A,40HRRC AMOV 40H,A46/422.雙操作數(shù)的邏輯指令

雙操作數(shù)的邏輯操作包括與(ANL)、或(ORL)、異或(XRL)三種基本操作??梢赃M(jìn)行累加器A與立即數(shù)、內(nèi)部RAM之間以及直接地址單元與累加器A、立即數(shù)之間的邏輯操作。邏輯操作是按位進(jìn)行的,所以,ANL指令常用來(lái)屏蔽字節(jié)中的某些位,欲清0某位可與0,欲保留某位可與1;ORL指令常用來(lái)使字節(jié)中的某些位置1,欲保留(不變)某位可或0,欲置位某位可或1;XRL指令用來(lái)對(duì)字節(jié)中某些位取反,欲取反某位可異或1,欲保留某位可異或0。47/422.雙操作數(shù)的邏輯指令

ANL(ORL,XRL)A,(1)累加器A與立即數(shù)、內(nèi)部存儲(chǔ)器之間的按位邏輯操作#data8addr8@RiRn上述格式是邏輯與、或、異或三種基本操作指令格式的統(tǒng)一介紹邏輯與、或、異或的定義分別如下所示:“與”:A∧B代碼組合 0×1=1×0=0×0=0 ;有0即0 1×1=1 ;全1為1“或”:A∨B代碼組合 1+0=0+1=1+1 ;有1即1 0+0=0 ;全0為0“異或”A⊕B代碼組合 0⊕1=1⊕0=1 ;相異為10⊕0=1⊕1=0 ;相同為048/42(2)直接地址單元(內(nèi)部RAM、SFR)與累加器A、立即數(shù)之間的按位邏輯操作

ANL(ORL,XRL)addr8,AANL(ORL,XRL)addr8,#data8指令完成內(nèi)部數(shù)據(jù)RAM或SFR中直接尋址單元與累加器A、立即數(shù)之間的邏輯與(或,異或)操作,執(zhí)行結(jié)果送回內(nèi)部數(shù)據(jù)RAM或SFR中。例,設(shè)50H單元的內(nèi)容為0AAH,A中內(nèi)容為15H,則順序執(zhí)行下面指令時(shí)的結(jié)果如下:ANL50H,#0F0H ;(50H)=0A0H,屏蔽50H單元的低4位(清0)ORL50H,#0FH ;(50H)=0AFH,將50H單元的低4位置1XRL50H,A ;(50H)=0BAH注意:當(dāng)用邏輯與、或、異或指令修改一個(gè)并行I/O口輸出內(nèi)容時(shí),則原始值將從該輸出口的鎖存器中讀取,而不是從該輸出口的引腳上讀取。49/42例4-4:設(shè)兩位用ASCII碼表示的數(shù)分別保存在40H、41H單元中,編程把其轉(zhuǎn)換成兩位BCD數(shù),并以壓縮形式存入40H單元中。解:可編程序如下:

ANL40H,#0FH;40H的ASCⅡ碼變成BCD碼

MOVA,41HANLA,#0FH ;41H的ASCⅡ碼變成BCD碼RLA ;左移4位RLARLARLAORL40H,A;結(jié)果存40H單元中

若使用SWAP指令,將會(huì)使程序更簡(jiǎn)煉。ANL40H,#0FH;40H的ASCⅡ碼變成BCD碼MOVA,41HANLA,#0FH;41H的ASCⅡ碼變成BCD碼SWAPA;高、低4位交換ORL40H,A;結(jié)果存40H單元中50/42算術(shù)運(yùn)算類(lèi)指令三51/42算術(shù)運(yùn)算類(lèi)指令簡(jiǎn)介

算術(shù)運(yùn)算類(lèi)指令主要完成加、減、乘、除四則運(yùn)算,以及增量、減量和二十進(jìn)制調(diào)整操作。除增量、減量指令外,大多數(shù)算術(shù)運(yùn)算指令會(huì)影響到狀態(tài)標(biāo)志寄存器PSW。表4-3反映了算術(shù)運(yùn)算類(lèi)指令對(duì)標(biāo)志位的影響。指令助記符影響標(biāo)志備注CYOVACADD(加)××דה表示可置1或清0“0”表示總清0ADDC(帶進(jìn)位加)×××SUBB(帶借位減)×××MUL(乘)0×

DIV(除)0×

DA(二-十進(jìn)制調(diào)整)×

表4-3算術(shù)運(yùn)算類(lèi)指令對(duì)標(biāo)志的影響52/421.

加減運(yùn)算指令

加減運(yùn)算中,以累加器A為第一操作數(shù),并存放操作后的結(jié)果。第二操作數(shù)可以是立即數(shù)、工作寄存器、寄存器間接尋址字節(jié)或直接尋址字節(jié)。(1)加法指令:ADDA,#data8 ;(A)←(A)+#data8ADDA,addr8 ;(A)←(A)+(addr8)ADDA,@Ri ;(A)←(A)+((Ri))ADDA,Rn ;(A)←(A)+(Rn)上述指令,把源字節(jié)變量(立即數(shù)、直接地址單元、間接地址單元、工作寄存器內(nèi)容)與累加器相加,結(jié)果保存在累加器中,影響標(biāo)志AC、CY、OV、P。例:

執(zhí)行指令:

MOVA,#0C3HADDA,#0AAH

運(yùn)算后,CY=1,OV=1,AC=0,(PSW)=85H,(A)=6DH溢出標(biāo)志OV取決于帶符號(hào)數(shù)運(yùn)算,和的第6、7位中有一位產(chǎn)生進(jìn)位而另一位不產(chǎn)生進(jìn)位,則使OV置1,否則OV被清0。OV=1表示兩正數(shù)相加,和變成負(fù)數(shù),或兩負(fù)數(shù)相加,和變成正數(shù)的錯(cuò)誤結(jié)果。53/42

(2)帶進(jìn)位加法指令A(yù)DDCA,#data8 ;(A)←(A)+#data8+(CY)ADDCA,addr8 ;(A)←(A)+(addr8)+(CY)ADDCA,@Ri ;(A)←(A)+((Ri))+(CY)ADDCA,Rn ;(A)←(A)+(Rn)+(CY)除了相加時(shí)應(yīng)考慮進(jìn)位標(biāo)志外,其他與一般加法指令完全相同。例:設(shè)累加器A內(nèi)容為0AAH,R0內(nèi)容為55H,CY內(nèi)容為1,執(zhí)行指令:ADDCA,R0

將使得:

(A)=00000000BAC=1,CY=1,OV=0例4-5:利用ADDC指令可以進(jìn)行多字節(jié)加法運(yùn)算。設(shè)雙字節(jié)加法中,被加數(shù)的低位字節(jié)保存在20H單元,高位字節(jié)保存在21H單元(以下采用類(lèi)似的保存方法);加數(shù)放30H、31H單元,和存放在40H、41H單元,若高字節(jié)相加有進(jìn)位則轉(zhuǎn)OVER處執(zhí)行。試編程實(shí)現(xiàn)之。解:程序代碼如下:

ADDM:

MOV A,20H ;取低字節(jié)被加數(shù) ADD A,30H;低位字節(jié)相加 MOV 40H,A ;結(jié)果送40H單元 MOV A,21H ;取高字節(jié)被加數(shù) ADDC A,31H;加高字節(jié)和低位來(lái)的進(jìn)位 MOV 41H,A ;結(jié)果送41H單元 JC OVER ;有進(jìn)位去OVER處執(zhí)行 ……

OVER: …… ;54/42

(3)帶借位減法指令SUBBA,#data8 ;(A)←(A)-#data8-(CY)SUBBA,addr8 ;(A)←(A)-(addr8)-(CY)SUBBA,@Ri ;(A)←(A)-((Ri))-(CY)SUBBA,Rn ;(A)←(A)-(Rn)-(CY)在減法中CY=1則表示有借位,CY=0表示無(wú)借位。OV=1表示帶符號(hào)數(shù)相減時(shí),從一個(gè)正數(shù)中減去一個(gè)負(fù)數(shù)得出了一個(gè)負(fù)數(shù)或從一個(gè)負(fù)數(shù)中減去一個(gè)正數(shù)時(shí)得出一個(gè)正數(shù)的錯(cuò)誤情況。若運(yùn)算兩數(shù)為無(wú)符號(hào)數(shù),則其溢出與否和“OV”狀態(tài)無(wú)關(guān),而靠CY是否有進(jìn)位予以判別,OV僅表明帶符號(hào)數(shù)運(yùn)算時(shí)是否溢出。由于減法只有帶借位減1條指令,所以在首次進(jìn)行單字節(jié)相減時(shí),須先清借位位,以免相減后結(jié)果出錯(cuò)。例:設(shè)累加器內(nèi)容為D9H,R0內(nèi)容為87H,求兩者相減結(jié)果。CLRCSUBBA,R0 ;執(zhí)行后(A)=52H,CY=0,OV=055/42

例4-6:兩字節(jié)數(shù)相減,設(shè)被減數(shù)放20H、21H單元,減數(shù)放30H、31H單元,差放在40H、41H單元,若高字節(jié)有借位則轉(zhuǎn)OVER處執(zhí)行。試編程實(shí)現(xiàn)之。解:程序代碼如下:

SUBM: CLR C ;低字節(jié)減無(wú)借位,CY清0 MOV A,20H ;初減數(shù)送ASUBB A,30H ;低位字節(jié)相減 MOV 40H,A ;結(jié)果送40H單元 MOVA,21H ;被減數(shù)高字節(jié)送ASUBB A,31H ;高字節(jié)相減 MOV 41H,A ;結(jié)果送41H單元JC OVER ;若高字節(jié)減有借位,則轉(zhuǎn)OVER處執(zhí)行 ……OVER: …… ……56/422.乘除運(yùn)算指令

乘除運(yùn)算指令在累加器A和寄存器B之間進(jìn)行,運(yùn)算結(jié)果保存在累加器A和寄存器B中。(1)乘法指令

MUL AB該指令把累加器A和寄存器B中的8位無(wú)符號(hào)整數(shù)相乘,16位乘積的低字節(jié)在累加器A中,高字節(jié)在寄存器B中,如果乘積大于255(0FFH),則溢出標(biāo)志位置1,否則清0,運(yùn)算結(jié)果總使進(jìn)位標(biāo)志CY清0。例:設(shè)(A)=82H(130),(B)=38H(56),執(zhí)行指令:

MUL AB執(zhí)行結(jié)果:乘積為1C70H(7280),(A)=70H,(B)=1CH,OV=1,CY=057/42

例4-7:利用單字節(jié)乘法指令進(jìn)行多字節(jié)乘法運(yùn)算。設(shè)雙字節(jié)數(shù)低8位存30H,高8位存31H單元,單字節(jié)數(shù)存在40H單元,編程實(shí)現(xiàn)雙字節(jié)乘以單字節(jié)的運(yùn)算,乘積按由低位到高位依次存在50H、51H、52H單元中。解:雙字節(jié)數(shù)乘以單字節(jié)數(shù),設(shè)雙字節(jié)數(shù)用X表示,單字節(jié)數(shù)用Y表示,則其乘法可表示為:(X2·28+X1)·Y=X2·Y·28+X1·Y程序代碼如下:

MOV A,30HMOV B,40HMUL AB ;X1·YMOV 51H,B ;積高字節(jié)存51HMOV 50H,A ;積低字節(jié)存50HMOV A,31HMOV B,40HMUL AB ;X2·YADDA,51H ;X2·Y低8位與X1·Y高8位相加作為積的第二字節(jié)MOV51H,AMOV A,B ADDCA,#00H ;最高字節(jié)加低位進(jìn)位MOV 52H,A ;最高字節(jié)存52H單元58/42

(2)除法指令DIVAB該指令把累加器A中的8位無(wú)符號(hào)整數(shù)除以寄存器B中8位無(wú)符號(hào)整數(shù),所得商放在累加器A中,余數(shù)存在寄存器B中,標(biāo)志位CY和OV均清0。若除數(shù)(B中內(nèi)容)為00H,則執(zhí)行后結(jié)果為不定值,并置位溢出標(biāo)志OV。例:

設(shè)累加器內(nèi)容為147(93H),B寄存器內(nèi)容為13(0DH),則執(zhí)行命令:DIVAB ;將使(A)=0BH,(B)=04H,OV=0,CY=059/423.增量、減量指令

增量指令I(lǐng)NC完成加1運(yùn)算(相當(dāng)于C語(yǔ)言中的++),減量運(yùn)算DEC完成減1運(yùn)算(相當(dāng)于C語(yǔ)言中的--)。這兩條指令均不影響標(biāo)志位(但對(duì)累加器A的操作將影響P標(biāo)志)。(1)增量指令I(lǐng)NC A ;(A)←(A)+1INC addr8 ;(addr8)←(addr8)+1INC @Ri ;((Ri))←((Ri))+1INC Rn ;(Rn)

←(Rn)+1INC DPTR ;(DPTR)←(DPTR)+1

INC指令將指定變量加1,結(jié)果送回原地址單元,原來(lái)內(nèi)容若為0FFH,加1后將變成00H,運(yùn)算結(jié)果不影響任何標(biāo)志位(但對(duì)累加器A的操作將影響P標(biāo)志)。

60/42

例:設(shè)(R0)=7EH,內(nèi)部數(shù)據(jù)RAM中(7EH)=0FFH,(7FH)=40H,則執(zhí)行指令:

INC @R0

;(7EH)←00HINCR0 ;(R0)←7FHINC @R0 ;(7FH)←41H例:指令序列:

MOVDPTR,#1FFEH ;(DPTR)←1FFEHINCDPTR ;(DPTR)←1FFFH INCDPTR ;(DPTR)←2000H61/42DEC A ;(A)←(A)-1DEC addr8 ;(addr8)←(addr8)-1DEC @Ri ;((Ri))←((Ri))-1DEC Rn ;(Rn)←(Rn)-1

(2)減量指令上述指令將指定變量減1,結(jié)果送回原地址單元,原地址單元內(nèi)容若為00H,減1操作后變成0FFH,不影響任何標(biāo)志位(但對(duì)累加器A的操作將影響P標(biāo)志)。例:

MOV R1,#7FH ;(R1)←#7FHMOV 7EH,#00H ;(7EH)←#00HMOV 7FH,#40H ;(7FH)←#40HDEC @R1

;(7FH)←3FHDEC R1

;(R1)←7EHDEC @R1

;(7EH)←0FFH62/424.二-十進(jìn)制調(diào)整指令DAA本指令是對(duì)二―十進(jìn)制的加法進(jìn)行調(diào)整的指令。兩個(gè)壓縮型BCD碼按二進(jìn)制數(shù)相加,必須經(jīng)過(guò)本條指令調(diào)整后才能得到壓縮型的BCD碼和數(shù)。

指令的操作過(guò)程為:若相加后累加器低4位大于9或半進(jìn)位標(biāo)志AC=1,則加06H修正;若相加后累加器高4位大于9或進(jìn)位標(biāo)志CY=1,則加60H修正;若兩者同時(shí)發(fā)生或高4位雖等于9但低4位修正有進(jìn)位,則應(yīng)加66H修正。對(duì)用戶(hù)而言,只要保證參加運(yùn)算的兩數(shù)為BCD碼,并先對(duì)BCD碼執(zhí)行二進(jìn)制加法運(yùn)算(用ADD、ADDC指令),然后緊跟一條DAA指令即可。DAA指令不能對(duì)減法進(jìn)行十進(jìn)制調(diào)整。63/42例4-8:設(shè)計(jì)6位BCD碼加法程序。設(shè)被加數(shù)存在內(nèi)部RAM中32H、31H、30H單元,加數(shù)存于42H、41H、40H單元,相加之和存于52H、51H、50H單元,若相加有進(jìn)位(溢出)時(shí)轉(zhuǎn)符號(hào)地址OVER處執(zhí)行。解:程序代碼如下:

BCDADD:MOV A,30H ;第一字節(jié)加

ADD A,40H

DA A

MOV 50H,A ;存第一字節(jié)和(BCD碼)MOV A,31H ;第二字節(jié)加

ADDC A,41H

DA A

MOV 51H,A ;存第二字節(jié)和(BCD碼)MOV A,32H ;第三字節(jié)加

ADDC A,42H

DA A

MOV 52H,A ;存第三字節(jié)和(BCD碼)

JCOVER ;若有進(jìn)位,則轉(zhuǎn)OVER處執(zhí)行 ……OVER: …… ……64/42例4-9:設(shè)有兩個(gè)十進(jìn)制數(shù),設(shè)被減數(shù)存30H單元,減數(shù)存40H單元。編程實(shí)現(xiàn)二者的減法運(yùn)算,結(jié)果存50H單元中。解:利用十進(jìn)制加法調(diào)整指令作十進(jìn)制減法調(diào)整,必須采用補(bǔ)碼相加的方法,用9AH(即十進(jìn)制的100)減法減數(shù)即得以10為模的減數(shù)補(bǔ)碼。程序代碼如下:

BCDSUB:CLR C ;清進(jìn)位標(biāo)志

MOVA,#9AH ;求減數(shù)補(bǔ)碼

SUBBA,40H

ADD A,30H ;進(jìn)行補(bǔ)碼相加

DA A

MOV50H,A ;結(jié)果(差)存50H單元65/42下一講內(nèi)容

1、位操作指令

2、控制轉(zhuǎn)移類(lèi)指令66/42單片微型計(jì)算機(jī)原理及接口技術(shù)(9)67/37內(nèi)容提綱一位操作指令二控制轉(zhuǎn)移類(lèi)指令68/37位操作指令一69/37位操作指令簡(jiǎn)介位操作指令以位為處理對(duì)象,分別完成位傳送、位狀態(tài)控制、位邏輯操作、位條件轉(zhuǎn)移等功能,共有17條??杀粎R編程序所識(shí)別的位地址表示方式如下:1)直接用位地址(十進(jìn)制或十六進(jìn)制數(shù))表示,或?qū)懗晌坏刂繁磉_(dá)式表示。2)寫(xiě)成“字節(jié)地址.位號(hào)”的形式。例如0B8H.0,20H.1等。3)位寄存器的定義名稱(chēng),如C、EA等。4)對(duì)于可位尋址寄存器,使用“字節(jié)寄存器名.位號(hào)”的形式。例如P1.0,PSW.4等。5)用戶(hù)使用偽指令事先定義過(guò)的符號(hào)地址。70/37位操作指令簡(jiǎn)介表4-4位操作指令的操作碼助記符及對(duì)應(yīng)的操作數(shù)操

作功

能操

碼操

數(shù)備

注位傳送

MOVC,bit或者bit,C源地址和目的地址可互換位狀態(tài)控制位清0CLRC或bitbit表示直接尋址位位取反CPL位置位SETB位邏輯操作邏輯與操作ANLC

∧bit(或/bit)→C/bit表示直接尋址位的非邏輯或操作ORLC∨bit(或/bit)→C位跳轉(zhuǎn)判C轉(zhuǎn)移JCrelrel為相對(duì)偏移量JNC判直接尋址位轉(zhuǎn)移JBbit,relJNB為0轉(zhuǎn)移,JB為1轉(zhuǎn)移JNBJBC尋址位為1轉(zhuǎn)移并清0該位71/371.

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

MOV C,bit ;(C)←(bit)MOV bit,C ;(bit)←(C)指令的功能是把第二操作數(shù)所指出的布爾變量送到由第一操作數(shù)指定的布爾變量中。其中一個(gè)操作數(shù)必為位累加器(進(jìn)位標(biāo)志CY),另一個(gè)可以是任何直接尋址位(bit)。指令執(zhí)行結(jié)果不影響其他寄存器或標(biāo)志。例:設(shè)片內(nèi)數(shù)據(jù)RAM中(20H)=79H,執(zhí)行指令:

MOVC,07H;07H是位地址,即字節(jié)地址20H的第7位,將使(C)=0。72/372.位狀態(tài)控制指令位狀態(tài)控制指令包括位的清零、取反和置位。(1)位清0指令CLR bit ;(bit)←0CLR C ;(C)←0上述指令可使直接尋址位(bit)或位累加器C清零,不影響其他標(biāo)志。例: 片內(nèi)數(shù)據(jù)RAM字節(jié)地址25H的內(nèi)容為34H(00110100B),執(zhí)行指令:

CLR2AH;2AH為字節(jié)地址25H第2位的位地址

25H的內(nèi)容變?yōu)?0H(00110000B)。73/37例:

執(zhí)行指令序列MOV 25H,#5DH ;(25H)=(01011101B)CPL 2BH ;(25H)=(01010101B)CPL P1.2 ;P1.2求反(2)位求反指令CPL bit ;(bit)←(/bit)CPL C ;(C)←(/C)上述指令可把直接尋址位(bit)或位累加器C內(nèi)容取反,不影響其他標(biāo)志。(3)位置位指令SETBbit ;(bit)←1SETBC ;CY←1例如,輸出口P1原已寫(xiě)入了49H(01001001B),則執(zhí)行:SETBP1.7將使P1口輸出數(shù)據(jù)變?yōu)镃9H(11001001B)。74/373.位邏輯操作指令位邏輯操作有兩種:位邏輯與,位邏輯或。(1)位邏輯“與”指令A(yù)NLC,bit ;(C)∧(bit)ANLC,/bit ;(C)∧(/bit

)上述指令將直接尋址位的內(nèi)容或直接尋址位內(nèi)容取反后(不改變?cè)瓋?nèi)容)與位累加器C相與,結(jié)果保存在C中。“/bit”表示對(duì)將位內(nèi)容取反后再參與位操作。“與”邏輯操作示意圖如圖所示。例當(dāng)位地址(7FH)=1并且累加器中(ACC.7)=1時(shí),進(jìn)位標(biāo)志CY置1,否則CY清0,可編程序如下:

MOV C,7FH ;(7FH)=1送CANLC,ACC.7;(C)∧(ACC.7)→(C)75/37(2)位邏輯“或”指令ORLC,bit ;(C)←(C)∨(bit)ORLC,/bit ;(C)←(C)∨(/bit)上述指令把直接尋址位的內(nèi)容或直接尋址位的內(nèi)容取反后(不改變?cè)瓋?nèi)容)與位累加器C進(jìn)行邏輯“或”,結(jié)果保存在C中。位邏輯“或”操作的示意圖如圖所示:。例:

位地址7FH中的內(nèi)容和累加器ACC.7中的內(nèi)容相“或”的程序如下:

MOVC,7FHORLC,ACC.7 ;相“或”的結(jié)果存C中。76/374.位條件轉(zhuǎn)移指令

位條件轉(zhuǎn)移指令分為判進(jìn)位標(biāo)志C或判直接尋址位狀態(tài)轉(zhuǎn)移兩種。(1)判進(jìn)位標(biāo)志C轉(zhuǎn)移指令JC rel ;若(CY)=1,則(PC)←(PC)+rel,否則順序執(zhí)行。 JNC rel ;若(CY)=0,則(PC)←(PC)+rel,否則順序執(zhí)行。前一條若進(jìn)位標(biāo)志為1,后一條若進(jìn)位標(biāo)志為0,可使程序轉(zhuǎn)向目標(biāo)地址,否則順序執(zhí)行下一條指令。目標(biāo)地址為第二字節(jié)中的帶符號(hào)的偏移量與PC當(dāng)前值之和,不影響任何標(biāo)志。77/37

實(shí)際應(yīng)用中,一般在rel的位置寫(xiě)入欲跳轉(zhuǎn)到的標(biāo)號(hào)地址,偏移量由匯編程序自動(dòng)進(jìn)行計(jì)算。這樣做有兩個(gè)好處,一是程序的可讀性好,二是不必進(jìn)行偏移量的計(jì)算。例如,ADDA,#30H;加法指令,影響標(biāo)志位CJC YESC ;若C=1(有進(jìn)位),則轉(zhuǎn)YESC,否則,繼續(xù)執(zhí)行

… YESC: … 78/37(2)判直接尋址位轉(zhuǎn)移指令JBbit,rel ;若(bit)=1,(PC)←(PC)+relJNBbit,rel ;若(bit)=0,(PC)←(PC)+relJBCbit,rel ;若(bit)=1,(PC)←(PC)+rel,(bit)←0

上述指令檢測(cè)直接尋址位,若位變量為1(第一、三條指令)或位變量為0(第二條指令),則程序轉(zhuǎn)向目標(biāo)地址去執(zhí)行,否則順序執(zhí)行下條指令。

目標(biāo)地址為PC當(dāng)前值((PC)←(PC)+3)與第三字節(jié)所給帶符號(hào)的相對(duì)偏移量之和。測(cè)試位變量時(shí),不影響任何標(biāo)志,前兩條指令不影響原變量值,但后一條指令不管原變量為何值,檢測(cè)后即行清0。79/37在實(shí)際應(yīng)用中,一般在rel的位置寫(xiě)入欲跳轉(zhuǎn)到的標(biāo)號(hào)地址,偏移量由匯編程序自動(dòng)進(jìn)行計(jì)算。例

指令序列:MOV P1,#0CAH ;(P1)←0CAH(11001010B)MOV A,#56H ;(A)←56H(01010110B)JB P1.2,P12SET ;(P1.2)=0不轉(zhuǎn),繼續(xù)執(zhí)行JNB ACC.3,ACC3CLR ;(ACC.3)=0轉(zhuǎn)ACC3CLR處執(zhí)行P12SET:…… ACC3CLR:……

80/37指令序列:

MOVA,#43H ;A←43H(01000011B)

JBCACC.6,ACC6CLR;ACC.6=1轉(zhuǎn)ACC6CLR,且ACC.6←0 … ACC6CLR:… 執(zhí)行后使程序轉(zhuǎn)向ACC6CLR處,并把ACC.6清0。81/37控制轉(zhuǎn)移類(lèi)指令二82/37控制轉(zhuǎn)移類(lèi)指令簡(jiǎn)介控制轉(zhuǎn)移類(lèi)類(lèi)指令用于控制程序的走向。控制轉(zhuǎn)移類(lèi)指令可分為兩種:一種是程序轉(zhuǎn)移指令,另一種稱(chēng)為子程序調(diào)用和返回指令。83/371.程序轉(zhuǎn)移指令(1)無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令操作碼助記符中的基本部分是“JMP”(轉(zhuǎn)移或者跳轉(zhuǎn)),它表示要把目標(biāo)地址(要轉(zhuǎn)去的某段程序第一條指令的地址號(hào))送入程序計(jì)數(shù)器PC,根據(jù)轉(zhuǎn)移距離和尋址方式不同又可分為L(zhǎng)JMP(長(zhǎng)轉(zhuǎn)移)、AJMP(絕對(duì)轉(zhuǎn)移)、SJMP(相對(duì)短轉(zhuǎn)移)和JMP(間接轉(zhuǎn)移)。1)長(zhǎng)轉(zhuǎn)移指令LJMPaddr16;(PC)←addr16

指令提供16位目標(biāo)地址,將指令中第二、第三字節(jié)地址碼分別裝入PC的高8位和低8位中,程序無(wú)條件轉(zhuǎn)向指定的目標(biāo)地址去執(zhí)行,不影響標(biāo)志位。例:

如果在程序存儲(chǔ)器0000H單元存放一條指令

LJMP0100H

則復(fù)位后程序?qū)⑻?100H單元去執(zhí)行。84/372)絕對(duì)轉(zhuǎn)移指令A(yù)JMPaddrlla10a9a800001a7~a0;(PC)←(PC)+2,(PC11~15)不變;(PC0~10)←addr0~10第二字節(jié)存放的是低8位地址,第一字節(jié)5、6、7位存放著高3位地址a8~a10。指令執(zhí)行時(shí)分別把高3位和低8位地址值取出送入程序計(jì)數(shù)器PC的低11位,維持PC的高5位((PC)+2后的)地址值不變,實(shí)現(xiàn)2K范圍內(nèi)的程序轉(zhuǎn)移,如圖所示。AJMP為雙字節(jié)指令,當(dāng)程序真正轉(zhuǎn)移時(shí)PC值已加2了,因此,目標(biāo)地址應(yīng)與AJMP后面相鄰指令的第一字節(jié)地址在同一2K字節(jié)范圍內(nèi)。如果超過(guò)了2K范圍,匯編程序會(huì)提示出錯(cuò)(可以采用多級(jí)跳轉(zhuǎn)的方式解決該錯(cuò)誤)。本指令不影響標(biāo)志位。跳轉(zhuǎn)范圍有限,很少使用。85/373)相對(duì)短轉(zhuǎn)移指令SJMPrel;(PC)←(PC)+2,(PC)←(PC)+rel其中,rel為相對(duì)偏移量,是一個(gè)8位帶符號(hào)的數(shù)

指令控制程序無(wú)條件轉(zhuǎn)向指定地址。該指定地址由指令第二字節(jié)的相對(duì)地址和程序計(jì)數(shù)器PC的當(dāng)前值(執(zhí)行SJMP前的PC值加2)相加形成。由于AJMP和SJMP指令的跳轉(zhuǎn)范圍有限,而LJMP(長(zhǎng)轉(zhuǎn)移指令)不受跳轉(zhuǎn)范圍的限制,因此,一般情況下都可使用LJMP指令代替AJMP和SJMP指令。4)間接轉(zhuǎn)移指令JMP@A+DPTR ;(PC)←(A)+(DPTR)該指令把累加器里的8位無(wú)符號(hào)數(shù)與作為基址寄存器DPTR中的16位數(shù)據(jù)相加,所得的值裝入程序計(jì)數(shù)器PC做為轉(zhuǎn)移的目標(biāo)地址。由于執(zhí)行16位加法,從低8位產(chǎn)生的進(jìn)位將傳送到高位去。指令執(zhí)行后不影響累加器和數(shù)據(jù)指針中的原內(nèi)容,不影響任何標(biāo)志。86/37程序轉(zhuǎn)移指令是一條極其有用的多分支選擇轉(zhuǎn)移指令,其轉(zhuǎn)移地址不是匯編或編程時(shí)確定的,而是在程序運(yùn)行時(shí)動(dòng)態(tài)決定的。因此,可在DPTR中裝入多分支轉(zhuǎn)移程序的首地址,而由累加器A的內(nèi)容來(lái)動(dòng)態(tài)選擇其中的某一個(gè)分支予以轉(zhuǎn)移,這就可用一條指令代替眾多轉(zhuǎn)移指令,實(shí)現(xiàn)以DPTR內(nèi)容為起始的256個(gè)字節(jié)范圍的選擇轉(zhuǎn)移。對(duì)比C語(yǔ)言中的switch…case語(yǔ)句?87/37例:

要求當(dāng)(A)=0轉(zhuǎn)處理程序CASE_0,(A)=1轉(zhuǎn)處理程序CASE_1,(A)=2轉(zhuǎn)處理程序CASE_2(A)=3轉(zhuǎn)處理程序CASE_3,(A)=4轉(zhuǎn)處理程序CASE_4。程序代碼如下:MOVDPTR,#JUMP_TABLE ;表首址送入DPTR中MOVA,INDEX_NUMBER ;取得跳轉(zhuǎn)索引號(hào)RLA ;將索引號(hào)乘以2(由于AJMP指

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論