




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、3.1 MCS-51單片機(jī)匯編語(yǔ)言與指令格式3.2 尋址方式3.3 MCS-51單片機(jī)指令系統(tǒng)3.4 匯編語(yǔ)言及匯編語(yǔ)言程序設(shè)計(jì)3.5 基本程序設(shè)計(jì)方法本章小結(jié)習(xí)題 3.1.1 單片機(jī)的匯編語(yǔ)言由于計(jì)算機(jī)只能識(shí)別二進(jìn)制機(jī)器語(yǔ)言代碼,它是一種用二進(jìn)制數(shù)0、1組成的代碼,不易辨識(shí)、記憶和書寫,因此難以直接用它來(lái)進(jìn)行程序設(shè)計(jì)。為了既能體現(xiàn)機(jī)器語(yǔ)言的特點(diǎn),又便于人們理解、記憶和書寫,計(jì)算機(jī)常采用助記符來(lái)編寫指令。助記符是根據(jù)機(jī)器指令的不同功能和操作對(duì)象來(lái)描述指令的,它采用有關(guān)的英文縮寫來(lái)描述指令的特征,因此便于記憶、理解和分類。這種采用助記符和其他一些符號(hào)所編寫的指令程序稱為匯編語(yǔ)言源程序。3.1 M
2、CS-51單片機(jī)匯編語(yǔ)言與指令格式 3.1.2 指令格式MCS-51的指令有111條,分別表征30多種基本指令功能。其匯編指令格式如下:標(biāo)號(hào):操作碼 目的操作數(shù),源操作數(shù) ;注釋標(biāo)號(hào)是該指令的符號(hào)地址,表明該指令在程序中的位置,在其他指令中可被引用,經(jīng)常出現(xiàn)在轉(zhuǎn)移指令中,可根據(jù)需要設(shè)置。標(biāo)號(hào)后用“:”與操作碼分隔開。標(biāo)號(hào)的命名應(yīng)符合字符集,即英語(yǔ)的大小寫字母(az,AZ)、數(shù)字09。標(biāo)號(hào)嚴(yán)禁使用保留字符,如指令助記符、偽指令、常數(shù)等語(yǔ)言規(guī)范中已經(jīng)使用了的符號(hào),長(zhǎng)度不能超過(guò)8個(gè)字符。操作碼和操作數(shù)是指令的核心部分,二者之間用空格分隔。操作碼的作用是命令CPU作何操作;操作數(shù)則是該操作指令的作用對(duì)
3、象,分為目的操作數(shù)和源操作數(shù),二者之間用“,”分開。有些指令中無(wú)操作數(shù),有些只有一個(gè)操作數(shù)。注釋是對(duì)該指令功能的解釋,主要是便于理解和閱讀程序,可根據(jù)需要適當(dāng)添加,編譯器對(duì)注釋是不作處理的。注釋之前要用“;”與操作指令分開。從指令的二進(jìn)制代碼表示的角度看,指令格式以8位二進(jìn)制(1B)為基礎(chǔ),分為單字節(jié)、雙字節(jié)和三字節(jié)指令。 1. 單字節(jié)指令 單字節(jié)指令的二進(jìn)制代碼只有一個(gè)字節(jié)。單字節(jié)指令分為兩類:一類是無(wú)操作數(shù)的單字節(jié)指令,其指令碼只有操作碼字段,操作數(shù)是隱含在操作碼中的;另一類是含有操作數(shù)寄存器編號(hào)的單字節(jié)指令,其指令碼由操作碼字段和用來(lái)指示操作數(shù)所在寄存器號(hào)的地址碼組成。其格式如下:2.
4、雙字節(jié)指令 雙字節(jié)指令的二進(jìn)制代碼有兩個(gè)字節(jié):第一個(gè)字節(jié)是操作碼(或操作碼加操作數(shù)所在寄存器的地址碼),第二個(gè)字節(jié)是數(shù)據(jù)或數(shù)據(jù)所在的地址碼。其格式如下:3. 三字節(jié)指令三字節(jié)指令中,第一字節(jié)是操作碼,第二和第三字節(jié)是操作數(shù)或操作數(shù)地址。其格式如下:3.1.3 指令中的常用符號(hào)在分類介紹各類指令之前,下面先對(duì)描述指令的一些符號(hào)的意義進(jìn)行簡(jiǎn)單約定。(1) Ri和Rn:R表示當(dāng)前工作寄存器區(qū)中的工作寄存器;i表示0或1,即R0和R1;n表示07,即R0R7。當(dāng)前工作寄存器的選定是由PSW的RS1位和RS0位決定的。(2) #data:#表示立即數(shù),data為8位常數(shù)。#data是指包含在指令中的8位
5、立即數(shù)。(3) #data16:包含在指令中的16位立即數(shù)。(4) rel:相對(duì)地址,以補(bǔ)碼形式表示的地址偏移量,范圍為-128+127,主要用于無(wú)條件相對(duì)短轉(zhuǎn)移指令SJMP和所有的條件轉(zhuǎn)移指令中。(5) addr16:16位目的地址。目的地址可在全部程序存儲(chǔ)器的64 KB空間范圍內(nèi),主要用于無(wú)條件長(zhǎng)轉(zhuǎn)移指令LJMP和子程序長(zhǎng)調(diào)用指令LCALL中。(6) addr11:11位目的地址。目的地址應(yīng)與下一條指令處于相同的2 KB程序存儲(chǔ)器地址空間范圍內(nèi),主要用于絕對(duì)轉(zhuǎn)移指令A(yù)JMP和子程序絕對(duì)調(diào)用指令A(yù)CALL中。(7) direct:表示直接尋址的地址,即8位內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM的單元地址(01
6、27/255),或特殊功能寄存器SFR的地址。對(duì)于SFR,可直接用其名稱來(lái)代替其直接地址。(8) bit:內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM和特殊功能寄存器SFR中的可直接尋址位地址。(9) :間接尋址寄存器或基地址寄存器的前綴(如Ri、DPTR),表示寄存器間接尋址。 (10) (x):表示x中的內(nèi)容。(11) (x):表示由x尋址的單元中的內(nèi)容,即(x)為地址,該地址的內(nèi)容用(x)表示。(12) /和符號(hào):/表示對(duì)該位操作數(shù)取反,但不影響該位的原值;表示指令操作流程,將箭頭一方的內(nèi)容送入箭頭另一方的單元中。3.2.1 寄存器尋址指令中的操作數(shù)是放在寄存器中的,找到了寄存器就可得到操作數(shù),這種尋址方式稱為
7、寄存器尋址。寄存器尋址的工作寄存器指的是R0R7、累加器A、寄存器B、數(shù)據(jù)指針DPTR、CY(作為位處理累加器)等。例如:機(jī)器碼 助記符11101011 MOV A,R33.2 尋 址 方 式 這條指令表示寄存器送數(shù)給累加器,為一條單字節(jié)指令,低3位011代表工作寄存器R3的地址,高5位11101代表從寄存器往累加器A送數(shù)據(jù)的操作。該指令的低3位可從000到111變化,分別代表了R0R7。設(shè)R3中的操作數(shù)是B9H,上述指令的尋址過(guò)程如圖3.1所示。圖3.1 寄存器尋址方式示意圖3.2.2 立即尋址指令的源操作數(shù)是一個(gè)數(shù)值,這種操作數(shù)被稱做立即數(shù),在指令中用“#”作為其前綴。含有立即數(shù)的指令的指
8、令碼中,操作碼后面的字節(jié)內(nèi)容就是操作數(shù)本身,不需要到其他地址單元去取,這種尋址方式被稱為立即尋址方式。例如:機(jī)器碼 助記符 注釋74 FA MOV A,#0FAH ;A FAHFAH是立即數(shù),74H是操作碼,指令功能是將立即數(shù)送入累加器A。程序存儲(chǔ)器中指令以機(jī)器碼的形式存放(機(jī)器碼由系統(tǒng)自動(dòng)生成,實(shí)際編程不需要寫出),上述指令的尋址過(guò)程如圖3.2所示。圖3.2 立即尋址方式示意圖在MCS-51指令系統(tǒng)中還有一條16bit立即尋址指令。例如:機(jī)器碼 助記符 注釋90 30 01 MOV DPTR,#3001H ;DPH 30H,DPL 01H 上述指令的功能是將16bit立即數(shù)3001H送給數(shù)據(jù)
9、指針DPTR。3.2.3 寄存器間接尋址寄存器的內(nèi)容不是操作數(shù)本身,而是存放操作數(shù)的地址,要獲取操作數(shù)需要通過(guò)寄存器間接得到,這種尋址方式稱為寄存器間接尋址。寄存器間接尋址只能使用寄存器R0或R1作為間接地址寄存器來(lái)尋址內(nèi)部RAM(00HFFH)中的數(shù)據(jù)。寄存器前用符號(hào)“”表示采用間接尋址方式。對(duì)于內(nèi)部RAM有256B的52系列單片機(jī),其高128B(80HFFH)只能采用寄存器間接尋址方式,以避免和同樣采用此區(qū)地址的SFR發(fā)生沖突。寄存器間接尋址也適用于訪問(wèn)外部RAM,用DPTR作為間接尋址寄存器可尋址64KB空間。對(duì)于外部RAM的低256B單元,也可用R0、R1作為間接尋址寄存器。值得注意的
10、是,寄存器間接尋址方式不能用于尋址特殊功能寄存器。例如: MOV A,R1 ;A(R1)上述指令的功能是把R1所指出的內(nèi)部RAM單元中的內(nèi)容送到累加器A。若R1的內(nèi)容為40H,內(nèi)部RAM的40H單元中的內(nèi)容是0A6H,則指令“MOV A,R1”的功能是將0A6H這個(gè)數(shù)送到累加器A,如圖3.3所示。圖3.3 寄存器間接尋址示意圖若R1的內(nèi)容是90H,則“MOV A,R1”是將內(nèi)部RAM 90H(52子系列)單元的值送給累加器A。又因?yàn)?0H是特殊功能寄存器P1的地址,所以要尋址P1的話,需要采用直接尋址的方式,即“MOV A,90H”才表示將P1的內(nèi)容送到累加器A,請(qǐng)注意區(qū)別。3.2.4 直接尋
11、址指令中直接給出操作數(shù)所在的存儲(chǔ)器地址,以供尋址取數(shù)或存數(shù)的尋址方式稱為直接尋址。例如:MOV A,50H ;(A)(50H)該指令的功能是把內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM 50H單元內(nèi)的內(nèi)容送到累加器A。該指令直接給出了源操作數(shù)的地址50H。該指令的機(jī)器碼為E5H 50H。MCS-51系列單片機(jī)的直接尋址可用于訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器,也可用于訪問(wèn)程序存儲(chǔ)器。直接尋址可訪問(wèn)內(nèi)部RAM的低128B單元(00H7FH),同時(shí)也是訪問(wèn)高128B單元的特殊功能寄存器SFR的唯一方法。由于SFR占用片內(nèi)RAM 80HFFH間的地址,因此對(duì)于MCS-51系列單片機(jī),片內(nèi)RAM只有128B單元,與SFR的地址沒(méi)有重疊,對(duì)
12、于MCS-52系列,片內(nèi)RAM有256B單元,其高128B單元與SFR的地址是重疊的。為避免混淆,單片機(jī)規(guī)定:直接尋址的指令不能訪問(wèn)片內(nèi)RAM的高128B單元(80HFFH)。若要訪問(wèn)這些單元,則只能用寄存器間接尋址指令,而要訪問(wèn)SFR只能用直接尋址指令。另外,訪問(wèn)SFR可在指令中直接使用該寄存器的名字來(lái)代替地址,如“MOV A,80H”可以寫成“MOV A,P0”,因?yàn)镻0口的地址為80H。直接尋址還可直接訪問(wèn)片內(nèi)221個(gè)位地址空間。直接尋址訪問(wèn)程序存儲(chǔ)器的有長(zhǎng)轉(zhuǎn)移指令LJMP addr16、絕對(duì)轉(zhuǎn)移指令A(yù)JMP addr11、長(zhǎng)調(diào)用指令LCALL addr16與絕對(duì)調(diào)用指令A(yù)CALL ad
13、dr11,它們都直接給出了程序存儲(chǔ)器的16位地址(尋址范圍覆蓋64 KB)或11位地址(覆蓋2 KB)。執(zhí)行這些指令后,程序計(jì)數(shù)器PC的低16位或低11位地址將更換為指令直接給出的地址,機(jī)器將改為訪問(wèn)以所給地址為起始地址的存儲(chǔ)器區(qū)間。3.2.5 變址尋址這種尋址方式常用于訪問(wèn)程序存儲(chǔ)器中的數(shù)據(jù)表格。變址尋址把基址寄存器(DPTR或PC)和變址寄存器A的內(nèi)容作為無(wú)符號(hào)數(shù)相加形成16位的地址,該地址單元中所存放的數(shù)據(jù)為所需的操作數(shù)。例如:MOVC A,A+DPTR ;A(DPTR)+()MOVC A,A+PC ;A(PC)+()A中為無(wú)符號(hào)數(shù),指令功能是把A的內(nèi)容和DPTR的內(nèi)容或當(dāng)前PC的內(nèi)容相
14、加得到程序存儲(chǔ)器的有效地址,把該存儲(chǔ)器單元中的內(nèi)容送到A?!癕OVC A,A+DPTR”的指令碼是93H,尋址過(guò)程如圖3.4所示。圖3.4 基址寄存器加變址寄存器間接尋址示意圖3.2.6 相對(duì)尋址程序的執(zhí)行中往往有相對(duì)轉(zhuǎn)移的需要,即以當(dāng)前指令的位置(PC值)為基準(zhǔn)點(diǎn),加上指令中給出的相對(duì)偏移量(rel)來(lái)獲得操作數(shù)所在的實(shí)際地址。這類尋址方式稱為相對(duì)尋址,是轉(zhuǎn)移指令中用到的尋址方式。偏移量rel是符號(hào)數(shù),在-128+127范圍內(nèi),用補(bǔ)碼表示為80H7FH,實(shí)際應(yīng)用中常用符號(hào)地址代替。例如:指令 JC rel ;C=1跳轉(zhuǎn) 上述指令的機(jī)器碼為40H rel。第一字節(jié)為操作碼,第二字節(jié)就是相對(duì)于程
15、序計(jì)數(shù)器PC當(dāng)前地址的偏移量rel。注意:這里的“PC當(dāng)前地址”是指執(zhí)行完這條“JC rel”指令后的PC值,而不是指向該條指令的PC值。若轉(zhuǎn)移指令操作碼存放在0500H單元,偏移量存放在0501H單元,則該指令執(zhí)行后PC已為0502H。若偏移量rel為05H,則轉(zhuǎn)移到的目標(biāo)地址為0507H,即當(dāng)C=1時(shí),將去執(zhí)行0507H單元中的指令。具體過(guò)程見(jiàn)后面相關(guān)的指令介紹。 3.2.7 位尋址MCS-51系列單片機(jī)具有位尋址功能,即指令中直接給出位地址,可以對(duì)內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM中的128位和特殊寄存器SFR中的93位進(jìn)行尋址,并且位操作指令可對(duì)地址空間的每一位進(jìn)行傳送與邏輯操作。例如:SETB P
16、SW.3 ;(PSW.3)1該指令的功能是給程序狀態(tài)字PSW中的RS0置1。該指令為雙字節(jié)指令,機(jī)器代碼為D2H D3H,指令的第二字節(jié)直接給出位地址D3H (PSW.3的位地址)。綜上所述,在MCS-51系列單片機(jī)的存儲(chǔ)空間中,指令究竟對(duì)哪個(gè)存儲(chǔ)器空間進(jìn)行操作是由指令操作碼和尋址方式確定的。7種尋址方式及使用空間如表3.1所示。表3.1 7種尋址方式及使用空間3.3.1 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令共29條,是指令系統(tǒng)中最活躍、使用最多的一類指令。一般的操作是把源操作數(shù)傳送到目的操作數(shù),即指令執(zhí)行后目的操作數(shù)改為源操作數(shù),而源操作數(shù)保持不變。若要求在進(jìn)行數(shù)據(jù)傳送時(shí),不丟失目的操作數(shù),則可以用
17、交換型傳送指令。3.3 MCS-51單片機(jī)指令系統(tǒng)數(shù)據(jù)傳送類指令不影響進(jìn)位標(biāo)志CY、半進(jìn)位標(biāo)志AC和溢出標(biāo)志OV,但當(dāng)傳送或交換數(shù)據(jù)后影響累加器A的值時(shí),奇偶標(biāo)志P的值應(yīng)按A的值重新設(shè)定。按數(shù)據(jù)傳送類指令的操作方式,又可把傳送類指令分為3種類型:數(shù)據(jù)傳送、數(shù)據(jù)交換和堆棧操作,并使用8種助記符(MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH及POP)。表3.2給出了各種數(shù)據(jù)傳送類指令的助記符和對(duì)應(yīng)的操作數(shù)。表3.2 數(shù)據(jù)傳送類指令的助記符與操作數(shù)1內(nèi)部數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送指令內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM區(qū)是數(shù)據(jù)傳送最活躍的區(qū)域,可用的指令數(shù)也最多,共有16條指令,指令操作碼助記符為MOV
18、。內(nèi)部RAM間的數(shù)據(jù)傳遞關(guān)系如圖3.5所示。為了便于理解指令功能,下面按對(duì)源操作數(shù)的尋址方式逐一介紹各條指令。圖3.5 內(nèi)部RAM間的數(shù)據(jù)傳遞關(guān)系圖1) 立即尋址 該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有如下5條。這里描述指令格式的約定次序?yàn)椴僮鞔a助記符、目的操作數(shù)、源操作數(shù)、功能注釋,以下類同,不再說(shuō)明。操作碼助記符 目的操作數(shù) 源操作數(shù) 功能注釋 這組指令表明,8位立即數(shù)可以直接傳送到內(nèi)部數(shù)據(jù)區(qū)RAM的各個(gè)位置,并且可把16位立即數(shù)直接裝入數(shù)據(jù)指針DPTR。其他相關(guān)指令的功能及應(yīng)用舉例如下:(1) MOV direct,#data ;(direct)#data 該指令的功能是把立即數(shù)傳送
19、到內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM的00H7FH以及特殊功能寄存器SFR的各單元中。該指令為三字節(jié)指令。例如,把立即數(shù)20H傳送到RAM的30H單元和P1口(口地址為90H),可采用如下指令:MOV 30H,#20H ;(30H)#20H MOV P1,#20H ;(90H)#20H (2) MOV Ri,#data ;(Ri)#data 該指令的功能是把立即數(shù)傳送到由R0和R1寄存器的內(nèi)容指出的片內(nèi)數(shù)據(jù)存儲(chǔ)器RAM的單元中(MCS-51系列為00H7FH,MCS-52系列為00HFFH)。當(dāng)使用R0和R1寄存器時(shí),機(jī)器代碼分別為76H和77H,而R0、R1屬于片內(nèi)RAM中的哪一組工作寄存器,則要由PSW
20、中的RS1和RS0決定。如果要把立即數(shù)60H傳送到RAM的30H單元,則需用如下兩條指令:MOV R0,#30H ;(R0)#30HMOV R0,#60H ;(R0)#60H 由此可見(jiàn),完成同樣的功能,所用指令不同,程序所占空間不同,執(zhí)行效率也不同。因此,在實(shí)際編程時(shí)要注意程序的優(yōu)化。(3) MOV Rn,#data ;(Rn)#data該指令的功能是把立即數(shù)傳送到內(nèi)部寄存器R0R7中,該指令為雙字節(jié)指令,機(jī)器代碼如下:其中,rrr取值為000、001、110、111,對(duì)應(yīng)R0、R1、R6、R7共8個(gè)寄存器,機(jī)器代碼為78、79、7E、7F。但在片內(nèi)RAM中屬于哪一組的R0R7,也要由PSW中
21、RSl和RS0的設(shè)置而定。該指令共對(duì)應(yīng)8條指令,但在MCS-51單片機(jī)指令系統(tǒng)中,該指令只統(tǒng)計(jì)為一條。(4) MOV DPTR,#data16 ;(DPTR)#data16該指令的功能是把16位立即數(shù)裝入數(shù)據(jù)指針DPTR中。該指令是MCS-51系列單片機(jī)指令系統(tǒng)中唯一一條16位數(shù)據(jù)傳送指令。該指令為三字節(jié)指令,第一字節(jié)為90H,第二字節(jié)為高8位立即數(shù),第三字節(jié)為低8位立即數(shù)。例如,“MOV DPTR,#5534H”指令執(zhí)行后,DPTR寄存器的高8位寄存器DPH的內(nèi)容為55H,低8位寄存器DPL的內(nèi)容為34H。該指令的機(jī)器代碼為90H 55H 34H。2) 寄存器尋址在該尋址方式下,內(nèi)部RAM區(qū)
22、的數(shù)據(jù)傳送指令有以下5條:MOV direct,A ;(direct)(A) MOV Ri,A ;(Ri)(A) MOV Rn,A ;(Rn)(A) MOV A,Rn ;(A)(Rn) MOV direct,Rn ;(direct)(Rn) 這組指令的功能是把累加器A的內(nèi)容傳送到內(nèi)部數(shù)據(jù)區(qū)RAM的各個(gè)單元,或者把指定工作寄存器R0R7中的內(nèi)容傳送到累加器A、direct所指定的片內(nèi)RAM的00H7FH單元或特殊功能寄存器SFR中。但不能用這類指令在內(nèi)部工作寄存器之間直接傳送。例如,不存在“MOV R1,R2”這樣的指令。3) 直接尋址在該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有如下4條:MOV
23、 A,direct ;(A)(direct) MOV Rn,direct ;(Rn)(direct) MOV Ri,direct ;(Ri)(direct) MOV direct2,direct1 ;(direct2)(direct1) 這組指令將直接地址所規(guī)定的內(nèi)部RAM單元(片內(nèi)RAM的00H7FH,SFR的80HFFH單元)的內(nèi)容傳送到累加器A、寄存器Rn,并能實(shí)現(xiàn)內(nèi)部數(shù)據(jù)寄存器RAM之間、特殊功能寄存器SFR之間或SFR與內(nèi)部RAM之間的直接數(shù)據(jù)傳遞。直接傳遞不需要通過(guò)累加器A或者工作寄存器來(lái)間接傳送,從而提高了數(shù)據(jù)傳送的效率。注意:52子系列單片機(jī)的片內(nèi)RAM高128B單元(80HF
24、FH)不能用直接尋址的方法傳送到RAM的其他部分,而只能用間接尋址的方法來(lái)進(jìn)行傳送。另外,訪問(wèn)SFR 80HFFH地址中沒(méi)有定義的單元是沒(méi)有意義的。例如:MOV P2,P1 ;(P2)(P1) 該指令的功能是不通過(guò)其他寄存器,直接把P1口(端口地址90H)的內(nèi)容傳送到P2口(端口地址A0H)輸出,提高了效率。該指令為三字節(jié)指令,機(jī)器代碼為85H 90H A0H。4) 寄存器間接尋址在該尋址方式下,內(nèi)部RAM區(qū)的數(shù)據(jù)傳送指令有以下兩條:MOV A, Ri ;(A)(Ri) MOV direct,Ri ;(direct)(Ri) 這組指令把以Ri的內(nèi)容作為地址進(jìn)行尋址所得到的單元的內(nèi)容,傳送到累加
25、器A或direct指定的片內(nèi)RAM區(qū)單元。間接尋址可訪問(wèn)片內(nèi)數(shù)據(jù)存儲(chǔ)器的低128B單元(00H7FH)和高128B單元(80HFFH,對(duì)52子系列),但不能用于尋址特殊功能寄存器SFR。例如:設(shè)內(nèi)部RAM(30H)=40H,(40H)=10H,(10H)=00H,端口(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、P2口的內(nèi)容。MOV R0,#30H ;(R0)30H MOV A,R0 ;(A)(R0) MOV R1,A ;(R1)(A) MOV B,R1 ;(B)(R1) MOV R1,P1 ;(R1)(P1) MOV P2,P1 ;(P2)(P1) MOV 10H,#30H ;(10H
26、)30H 執(zhí)行上述指令后結(jié)果為:(R0)=30H,(R1)=(A)=40H,(B)=10H,(40H)=CAH,(P1)=(P2)=CAH,(10H)=30H。2外部數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送指令1) 16位數(shù)傳送指令該指令將16位立即數(shù)送入DPTR,高8位送入DPH,低8位送入DPL,如表3.3所示。這個(gè)16位立即數(shù)實(shí)質(zhì)是外部RAM/ROM的地址,專門用來(lái)配合外部數(shù)據(jù)傳送指令。表3.3 16位數(shù)傳送指令2) 累加器與外部RAM的數(shù)據(jù)傳送指令該類指令在累加器A與外部數(shù)據(jù)存儲(chǔ)器RAM之間傳送一個(gè)字節(jié)的數(shù)據(jù),采用間接尋址方式尋址外部數(shù)據(jù)存儲(chǔ)器,如表3.4所示。表3.4 累加器與外部RAM的數(shù)據(jù)傳送指令前兩
27、條指令將外部RAM的數(shù)據(jù)傳送到累加器,后兩條指令則是將累加器數(shù)據(jù)傳送到外部RAM。CPU與外部RAM的數(shù)據(jù)交換只能通過(guò)累加器A進(jìn)行。以工作寄存器R0、R1作間接尋址可尋址外部RAM的低256個(gè)數(shù)據(jù)單元,地址范圍為0000H00FFH;以16位數(shù)據(jù)指針DPTR間接尋址可訪問(wèn)外部RAM的64KB數(shù)據(jù)單元?!纠?.1】 設(shè)外部RAM的4FH單元中的數(shù)據(jù)需要調(diào)入CPU,處理完后的數(shù)據(jù)放入外部RAM的1000H單元??刹捎萌缦轮噶钔瓿桑篗OV R0,#4FHMOVX A,R0 ;設(shè)處理后的數(shù)據(jù)已經(jīng)放入AMOV DPTR,#1000HMOVX DPTR,A3程序存儲(chǔ)器向累加器A傳送數(shù)據(jù)指令程序存儲(chǔ)器向累加
28、器A傳送數(shù)據(jù)指令又稱查表指令。該指令采用變址尋址方式,把程序存儲(chǔ)器(ROM或EPROM)中存放的表格數(shù)據(jù)讀出,傳送到累加器A,如表3.5所示。表3.5 程序存儲(chǔ)器向累加器A傳送數(shù)據(jù)指令上述兩條指令的功能是把作為變址寄存器的累加器A中的內(nèi)容與基址寄存器(DPTR或PC)的內(nèi)容進(jìn)行16位無(wú)符號(hào)數(shù)的加法操作,得到程序存儲(chǔ)器某單元地址,再把該地址的內(nèi)容送入累加器A0,執(zhí)行指令后基址寄存器DPTR的內(nèi)容不變,PC的內(nèi)容為(PC)+1。由于執(zhí)行16位加法,因此從低8位產(chǎn)生的進(jìn)位將傳送到高位,不影響任何標(biāo)志位。前一條指令采用DPTR作為基址寄存器,因此可以很方便地把一個(gè)16位地址送到DPTR,實(shí)現(xiàn)在整個(gè)64
29、 KB程序存儲(chǔ)器單元到累加器A的數(shù)據(jù)傳送。【例3.2】 7段LED顯示碼按照09的順序放在以TAB標(biāo)識(shí)的表首地址的數(shù)據(jù)表中,對(duì)每個(gè)要顯示的十進(jìn)制數(shù)碼,就用其單字節(jié)BCD碼作為偏移量,加上表首地址,就可得到各個(gè)數(shù)碼的顯示碼。解:設(shè)要顯示的數(shù)碼6的BCD碼已經(jīng)放在內(nèi)部RAM的60H單元,7段顯示碼放在程序中以TAB標(biāo)號(hào)的表中。以下程序段執(zhí)行查表操作,將待顯示的數(shù)據(jù)的7段顯示碼從字型碼表中查出,并存放在63H單元。MOV DPTR,#TABMOV A,60HMOVC A,A+DPTRMOV 63H,ATAB:DB xxH,xxH,以程序計(jì)數(shù)器PC作為基址寄存器有很大的局限性,由于執(zhí)行到該語(yǔ)句時(shí),PC
30、值已定,查表范圍只能由累加器A的內(nèi)容決定,所以表格只能存放在以PC當(dāng)前值為起始地址的256字節(jié)單元范圍內(nèi)。一旦這條指令與表格之間的語(yǔ)句發(fā)生變化,則累加器A中的內(nèi)容也要相應(yīng)地變化才行,否則就會(huì)發(fā)生查表錯(cuò)誤。4數(shù)據(jù)交換指令數(shù)據(jù)傳送類指令一般用來(lái)將操作數(shù)自源地址傳送到目的地址,指令執(zhí)行后,源地址的操作數(shù)不變,目的地址的操作數(shù)則修改為源地址的操作數(shù),如表3.6所示。數(shù)據(jù)交換指令使數(shù)據(jù)作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后雙方的操作數(shù)都已修改為對(duì)方的操作數(shù)。因此,兩操作數(shù)均未沖掉、丟失。表3.6 數(shù)據(jù)交換指令上述指令前3條是字節(jié)交換指令,表明累加器A的內(nèi)容可以和內(nèi)部RAM區(qū)中任何一個(gè)
31、單元的內(nèi)容進(jìn)行交換。第4條是半字節(jié)交換指令,指令執(zhí)行后,只將A的低4位和Ri地址單元的低4位交換,而各自的高4位內(nèi)容保持不變。第5條指令是把累加器A的低半字節(jié)與高半字節(jié)進(jìn)行交換。有了交換指令,多數(shù)據(jù)傳送變得更為高效、快捷,且不會(huì)丟失信息。例如,設(shè)(R0)=30H,(30H)=4AH,(A)=28H,則:執(zhí)行“XCFA,R0”,結(jié)果為(A)=4AH,(30H)=28H;執(zhí)行“XCHDA,R0”,結(jié)果為(A)=2AH,(30H)=48H;執(zhí)行“SWAPA”,結(jié)果為(A)=82H。5堆棧操作指令前已敘述,堆棧是用戶自己設(shè)定的內(nèi)部RAM中的一塊專用存儲(chǔ)區(qū),按照“先進(jìn)后出”規(guī)律存取數(shù)據(jù),使用時(shí)一定先設(shè)堆
32、棧指針,堆棧指針缺省為SP=07H。堆棧操作指令用于對(duì)堆棧執(zhí)行數(shù)據(jù)傳送,共有兩條指令,如表3.7所示。 表3.7 堆棧操作指令 PUSH指令是入棧指令,也稱為壓棧指令,用來(lái)將direct地址中的操作數(shù)傳送到堆棧中。CPU執(zhí)行指令時(shí)分兩步:第一步先將SP中的棧頂?shù)刂芳?,指向一個(gè)空的堆棧單元作為新的棧頂;第二步將direct單元中的數(shù)據(jù)送入該空的棧頂單元。POP指令是出棧指令,也稱為彈出指令,用來(lái)將堆棧中的操作數(shù)傳送到direct單元。執(zhí)行該指令時(shí)同樣是兩步:第一步先將當(dāng)前SP所指棧頂單元中的數(shù)據(jù)送到direct所指單元中;第二步則是將SP中的地址減1,(SP)-1成為當(dāng)前的新的棧頂單元。堆棧操
33、作指令不影響標(biāo)志位,主要應(yīng)用于中斷服務(wù)程序中臨時(shí)保護(hù)數(shù)據(jù)、保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng),即執(zhí)行中斷服務(wù)之前,先將必要的單元數(shù)據(jù)壓入堆棧保存,執(zhí)行完后,再將數(shù)據(jù)彈出。上述程序段中,給SP賦值50H作為棧頂?shù)刂?,在INT0子程序中,先將累加器A、B寄存器的數(shù)據(jù)入棧,放置時(shí)SP指針先加1,指向51H單元,將A中的數(shù)據(jù)放入,然后SP加1,指向52H,將B中的數(shù)據(jù)放入。到程序結(jié)束時(shí),將壓入堆棧的數(shù)據(jù)彈出,記住“先進(jìn)后出,后進(jìn)先出”原則,先彈出52H的數(shù)據(jù)到B,然后SP減1,指針指向51H,彈出數(shù)據(jù)到A,SP再減1。以上指令執(zhí)行結(jié)果不影響程序狀態(tài)字寄存器PSW中的標(biāo)志位。注意:堆棧操作指令是直接尋址指令,且必須是字
34、節(jié)操作,要特別注意指令的書寫格式。比如,例3.3中累加器用ACC,而工作寄存器R0R7要用直接地址00H07H。3.3.2 算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令包含加、減、乘、除以及十進(jìn)制調(diào)整等指令,使51單片機(jī)具有較強(qiáng)的運(yùn)算能力。該類指令大多是雙操作數(shù)指令,累加器A總是存放第一源操作數(shù),并作為目的地址存放操作結(jié)果。第二操作數(shù)可以是立即數(shù),或某工作寄存器Rn、內(nèi)存單元、間接尋址單元的內(nèi)容。運(yùn)算操作將影響標(biāo)志寄存器PSW中的某些位,如溢出位OV、進(jìn)位位CY、輔助進(jìn)位位AC、奇偶標(biāo)志位P等。程序中監(jiān)視這些標(biāo)志位,可方便地進(jìn)行相關(guān)運(yùn)算操作,如進(jìn)位標(biāo)志用于多字節(jié)加、減法等,溢出標(biāo)志用于實(shí)現(xiàn)補(bǔ)碼運(yùn)算,輔助進(jìn)位用
35、于BCD碼運(yùn)算等。1. 加法類指令1) 加法指令加法指令如表3.8所示。表3.8 加 法 指 令參與運(yùn)算的兩個(gè)操作數(shù)都是8位二進(jìn)制數(shù),源地址的操作數(shù)和累加器A的操作數(shù)相加,和值存放于A中。指令的執(zhí)行將影響標(biāo)志寄存器PSW的位AC、CY、OV、P。當(dāng)和的第3位向第4位有進(jìn)位(即半字節(jié)進(jìn)位)時(shí),將AC置1;當(dāng)和的最高位(第7位)有進(jìn)位時(shí),將CY置1,否則為0;和數(shù)中有奇數(shù)個(gè)1時(shí),P為1;OV位的值則取決于最高位D7是否有進(jìn)位和次高位D6位是否有進(jìn)位,即OV=D7D6?!纠?.4】 設(shè)(A)=53H,(R5)=FCH,執(zhí)行“ADD A,R5”后的結(jié)果及相關(guān)標(biāo)志位如圖3.6所示。圖3.6 例3.4的A
36、DD指令執(zhí)行示意圖標(biāo)志CY=1,OV= D7D6=0。運(yùn)算結(jié)果是否正確需要考慮將操作數(shù)看做無(wú)符號(hào)數(shù)還是符號(hào)數(shù)。若將操作數(shù)視為符號(hào)數(shù),則通常采用補(bǔ)碼形式。若將操作數(shù)視做無(wú)符號(hào)數(shù),則根據(jù)CY來(lái)判斷運(yùn)算結(jié)果是否溢出,若CY=1,表明溢出,有進(jìn)位;若視為符號(hào)數(shù),則根據(jù)OV來(lái)判斷結(jié)果是否溢出,若OV=1,表明溢出,結(jié)果錯(cuò)誤。2) 帶進(jìn)位的加法指令帶進(jìn)位的加法指令如表3.9所示。表3.9 帶進(jìn)位的加法指令這組指令執(zhí)行的是將A中的操作數(shù)、另一個(gè)操作數(shù)與CY相加,結(jié)果存放于A中。此處的CY是指令執(zhí)行前的值,而不是指令執(zhí)行中產(chǎn)生的值。其對(duì)標(biāo)志位的影響與不帶進(jìn)位加法指令的相同。此種加法指令常用于多字節(jié)相加。【例3
37、.5】 (1) 已知(A)=3CH,(R1)=0A9H,CY=1,執(zhí)行如下指令后,A和CY的值各為多少?ADDC A,R1解:執(zhí)行ADDC指令示意圖如圖3.7 所示。圖3.7 例3.5的ADDC指令執(zhí)行示意圖執(zhí)行結(jié)果:(A)=0E6H,CY=0。(2) 試編程實(shí)現(xiàn)3字節(jié)無(wú)符號(hào)數(shù)的加法,設(shè)被加數(shù)的最高位字節(jié)的地址已經(jīng)放在R0中,加數(shù)的最高位字節(jié)的地址已經(jīng)放在R1中,加數(shù)和被加數(shù)都按從高位字節(jié)到低位字節(jié)的順序放在RAM中,和值存回到被加數(shù)的存放處。 程序如下:ORG 0200HMOVA,#3 ;取待加的字節(jié)數(shù)至R2中MOVR2,A ADDA,R0 ;初始化加數(shù)及被加數(shù)數(shù)據(jù)指針,使之指向;最低位字節(jié)
38、地址MOVR0,AMOVA,R2 ;重新取待加字節(jié)數(shù)ADDA,R1MOVR1,ACLRC ;清除進(jìn)位位MOVA,R0 ;(A)(R0)ADDCA,R1 ;(A)(A)+(R1)+(CY),中間字節(jié)相、 ;加MOVR0,A ;和存回(R0)中DECR0 ;(R0)(R0)-1,調(diào)整數(shù)據(jù)指針DECR1MOVA,R0 ;(A)(R0)ADDCA,R1 ;(A)(A)+(R1)+(CY),最高位字節(jié);相加MOVR0,A ;和存回(R0)中END3) 加1指令加1指令如表3.10所示。表3.10 加1指令加1指令使指定單元的內(nèi)容增加1,只有第1條指令“INC A”能對(duì)奇偶標(biāo)志位P產(chǎn)生影響,其余幾條不會(huì)對(duì)
39、任何標(biāo)志位產(chǎn)生影響。第5條指令是對(duì)數(shù)據(jù)指針進(jìn)行16位加1運(yùn)算,為地址加1提供了方便?!纠?.6】 設(shè)(R0)=70H,(70H)=42H,(71H)=57H,執(zhí)行如下指令后結(jié)果是什么?(1) INC R0(2) INC R0INC R0解:執(zhí)行后:(1) (R0)+1=(70H)+1=42H+1=43H,即(70H)=43H。(2) (R0)+1=70H+1=71H,即(R0)=71H。(R0)+1=(71H)+1=57H+1=58H,即(71H)=58H。執(zhí)行結(jié)果:(R0)=71H,(70H)=43H,(71H)=58H。由此例可看出,加1指令可以非常靈活地運(yùn)用于有遞增需要的場(chǎng)合。4) 十進(jìn)
40、制調(diào)整指令十進(jìn)制調(diào)整指令如表3.11所示。表3.11 十進(jìn)制調(diào)整指令當(dāng)BCD碼按二進(jìn)制數(shù)相加后,需用該指令對(duì)結(jié)果進(jìn)行校正,才能得到正確的BCD碼的和值。一個(gè)字節(jié)可包含兩個(gè)BCD碼,稱為壓縮的BCD碼,調(diào)整過(guò)程如下:若累加器A的低四位字節(jié)(A)039或(AC)=1,則(A)03=(A)03+06H;同時(shí),若累加器A的高四位(A)479或(CY)=1,則(A)47=(A)47+60H;十進(jìn)制調(diào)整指令僅對(duì)進(jìn)位位CY產(chǎn)生影響,不影響OV標(biāo)志。需要注意的是,本指令不能簡(jiǎn)單地把累加器A中的十六進(jìn)制數(shù)變換成BCD碼,也不能用于十進(jìn)制減法的校正。 【例3.7】 兩個(gè)4位BCD碼相加,設(shè)加數(shù)、被加數(shù)已經(jīng)按壓縮B
41、CD碼從高位到低位存放在內(nèi)存單元中,被加數(shù)存于RAM的32H、31H,加數(shù)存于38H、39H,和存于5EH、5FH,設(shè)和不會(huì)溢出。解:程序如下:ORG 0100HMOV A,31H ;被加數(shù)的BCD碼的低2位送AADD A,39H ;與加數(shù)的BCD碼的低2位相加DA A ;作十進(jìn)制調(diào)整MOV 5FH,A ;低2位和值存于5FHMOV A,32H ;被加數(shù)的高2位送AADDC A,38H ;與加數(shù)的高2位相加DA A ;作十進(jìn)制調(diào)整MOV 5EH,A ;高2位和值存于5EHEND2. 減法類指令1) 帶借位減法指令帶借位減法指令如表3.12所示。表3.12 帶借位減法指令帶借位減法指令是從累加器
42、A中減去進(jìn)位標(biāo)志CY的值和指定變量的值,結(jié)果存放于A中,將影響標(biāo)志位CY、AC、OV、P。若第7位有借位,則CY=1,否則為0;若第3位有借位,則AC=1,否則為0;若操作數(shù)被視為符號(hào)數(shù),則當(dāng)有溢出時(shí),OV=1;減法結(jié)果中1的個(gè)數(shù)為奇數(shù)時(shí),P=1。【例3.8】 設(shè)有兩個(gè)3字節(jié)無(wú)符號(hào)數(shù)相減,按照高位到低位的順序,被減數(shù)存于52H、51H、50H,減數(shù)存于5AH、59H、58H,差值存于52H、51H、50H。MOV A,R0SUBB A,R1MOV R0,AINC R0INC R1;高8位相減MOV A,R0SUBB A,R1MOV R0,AEND由此程序段可看出,相同的減法操作執(zhí)行了3次,采用
43、的是順序執(zhí)行模式,學(xué)習(xí)了后面的循環(huán)轉(zhuǎn)移指令后,就可作簡(jiǎn)化處理。2) 減1指令減1指令如表3.13所示。表3.13 減1指令減1指令是將指定的地址或單元中的內(nèi)容減1,結(jié)果仍存放于原單元中,不影響標(biāo)志位?!纠?.9】 設(shè)(A)=0FEH,(R0)=60H,(60H)=0AH,試問(wèn)下述指令的執(zhí)行結(jié)果是什么?(1) DEC A;(2) DEC R0;(3) DEC R0。解:執(zhí)行結(jié)果如下:(1) (A)=0FEH-1=0FDH。(2) (60H)=0AH-1=09H。(3) (R0)=60H-1=5FH。3. 乘法指令乘法指令如表3.14所示。表3.14 乘 法 指 令乘法指令是將累加器A和寄存器B中
44、的兩個(gè)無(wú)符號(hào)整數(shù)相乘,所得積的高8位存于B,低8位存于A。該操作將會(huì)對(duì)OV、CY和P標(biāo)志產(chǎn)生影響:當(dāng)乘積結(jié)果大于255(0FFH)時(shí),溢出標(biāo)志OV=1,否則為0;進(jìn)位標(biāo)志CY總是被清零;當(dāng)累加器A中1的個(gè)數(shù)為奇數(shù)時(shí),奇偶校驗(yàn)標(biāo)志位P =1,否則為0。 【例3.10】 試編寫程序完成100d55d,將結(jié)果存放于60H(高8位)、61H(低8位)。解:ORG 0030HMOV A,#100 ;十進(jìn)制被乘數(shù)賦值給A MOV B,#55 ;十進(jìn)制乘數(shù)賦給B MUL AB ;兩數(shù)相乘 MOV 60H,B;積的高8位送RAM的60H MOV 61H,A ;積的低8位送RAM的61H END執(zhí)行結(jié)果:(60
45、H)=15H,(61H)=7CH4. 除法指令除法指令如表3.15所示。表3.15 除 法 指 令除法指令是將累加器A中的8位無(wú)符號(hào)整數(shù)除以寄存器B中的8位無(wú)符號(hào)整數(shù),所得商的整數(shù)部分存放在A中,余數(shù)部分存放在B中。該操作對(duì)CY和P標(biāo)志位的影響同乘法指令。當(dāng)B中的值為00H時(shí),執(zhí)行結(jié)果是不確定的值,且置溢出標(biāo)志OV為1,表明該次除法是無(wú)意義的,其余情況均將CY清0?!纠?.11】 試編寫程序完成240d55d,將結(jié)果存放于50H(整數(shù))、51H(小數(shù))。解:ORG 0030H MOV A,#0F0H ;將0F0H(240)送累加器A MOV B,#37H ;將37H(55)送寄存器B DIV
46、AB ;執(zhí)行除法指令 MOV 50H,A ;將執(zhí)行除法后的商送內(nèi)部RAM;的50H單元 MOV 51H,B ;余數(shù)送51H END 執(zhí)行結(jié)果:(50H)=04H(商),(51H)=14H(余數(shù))。3.3.3 邏輯運(yùn)算及移位類指令 邏輯運(yùn)算及移位指令共有24條,其中邏輯指令有“與”、“或”、“異或”、累加器A清零和求反20條,移位指令4條。1. 邏輯“與”運(yùn)算指令邏輯“與”運(yùn)算指令如表3.16所示。表3.16 邏輯“與”運(yùn)算指令邏輯“與”運(yùn)算指令將兩個(gè)指定的操作數(shù)按位進(jìn)行邏輯“與”操作。例如,(A)=FAH=11111010B,(R1)=7FH=01111111B。執(zhí)行指令:ANL A,R1 ;
47、(A)=1111101001111111結(jié)果為:(A)=01111010B=7AH。邏輯“與”(ANL)指令常用于屏蔽(置0)字節(jié)中某些位。若清除某位,則用“0”和該位相與;若保留某位,則用“1”和該位相與。例如,(P1)=D5H=11010101B,屏蔽P1口高4位。執(zhí)行指令:ANL P1,#0FH ;(P1)(P1)00001111結(jié)果為:(P1)=05H=00000101B。2. 邏輯“或”運(yùn)算指令邏輯“或”運(yùn)算指令如表3.17所示。表3.17 邏輯“或”運(yùn)算指令邏輯“或”指令將兩個(gè)指定的操作數(shù)按位進(jìn)行邏輯“或”操作。該指令常用來(lái)使字節(jié)中某些位置“1”,欲保留(不變)的位用“0”與該位相
48、或,而欲置位的位則用“1”與該位相或。例如,若(A)=C0H,(R0)=3FH,(3F)=0FH。執(zhí)行指令:ORL A,R0 ;(A)(A)(R0)結(jié)果為:(A)=CFH。又如,根據(jù)累加器A中40位的狀態(tài),用邏輯與、或指令控制P1口40位的狀態(tài),P1口的高3位保持不變。ANL A,#00011111B ;屏蔽A的高3位ANL P1,#11100000B ;保留P1的高3位ORL P1,A ;使P140按A40置位若上述程序執(zhí)行前,(A)=B5H=10110101B,(P1)=6AH=01101010B,則執(zhí)行程序后,(A)=15H=00010101B,(P1)=75H=01110101B。3.
49、 邏輯“異或”運(yùn)算指令邏輯“異或”運(yùn)算指令如表3.18所示。表3.18 邏輯“異或”運(yùn)算指令邏輯“異或”指令常用來(lái)對(duì)字節(jié)中某些位進(jìn)行取反操作,欲將某位取反,則該位與“1”相異或;欲將某位保留,則該位與“0”相異或。此外,還可利用異或指令對(duì)某單元自身異或,以實(shí)現(xiàn)清零操作。例如,若(A)=B5H=10110101B,執(zhí)行下列指令:XRL A,#0F0H ;A的高4位取反,低4位保留MOV 30H,A ;(30H)(A)=45HXRL A,30H ;自身異或使A清零執(zhí)行后結(jié)果:(A)=00H。(1) 邏輯“與”ANL、“或”O(jiān)RL、“異或”XRL運(yùn)算指令除邏輯操作功能不同外,三者的尋址方式相同,指令
50、字節(jié)數(shù)相同,機(jī)器周期數(shù)也相同。(2) ANL、ORL、XRL的前兩條指令的目的操作數(shù)均為直接地址方式,可很方便地對(duì)內(nèi)部RAM的00HFFH任一單元或特殊功能寄存器的指定位進(jìn)行清零、置位、取反、保持等邏輯操作。當(dāng)direct為端口P0P3地址時(shí),這些指令均為“讀修改寫”指令。(3) ANL、ORL、XRL的后4條指令,其邏輯運(yùn)算的目的操作數(shù)均在累加器A中,且邏輯運(yùn)算結(jié)果也保存在A中。4累加器A清零與取反指令累加器A清零與取反指令如表3.19所示。表3.19 累加器A清零與取反指令第1條是對(duì)累加器A清零指令,第2條是把累加器A的內(nèi)容取反后再送入A中保存的對(duì)A求反指令,它們均為單字節(jié)指令。若用其他方
51、法達(dá)到清零或取反的目的,則至少需用雙字節(jié)指令。5移位指令移位指令有循環(huán)左移、帶進(jìn)位位循環(huán)左移、循環(huán)右移和帶進(jìn)位位循環(huán)右移4條指令。移位只能對(duì)累加器A進(jìn)行。循環(huán)左移:RL A;(An+1)(An),(A0)(A7) 帶進(jìn)位位循環(huán)左移:RLC A;(An+1)(An),(CY)(A7),(A0)(CY) 循環(huán)右移:RR A;(An)(An+1),(A7)(A0) 帶進(jìn)位位循環(huán)右移:RRC A;(An)(An+1),(CY)(A0),(A7)(CY) 以上移位指令操作可用圖3.8表示。圖3.8 移位指令操作示意圖 另外,值得一提的是,在前述數(shù)據(jù)傳送類指令中有一條累加器A的內(nèi)容半字節(jié)交換指令:SWAP
52、 A ;(A)74= (A)30 上述指令實(shí)際上相當(dāng)于執(zhí)行循環(huán)左移指令4次。該指令在BCD碼的變換中是非常實(shí)用的。3.3.4 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令共計(jì)17條,可分為無(wú)條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、子程序調(diào)用及返回指令。采用控制轉(zhuǎn)移類指令能方便地實(shí)現(xiàn)程序的向前、向后跳轉(zhuǎn),并根據(jù)條件實(shí)現(xiàn)分支運(yùn)行、循環(huán)運(yùn)行、調(diào)用子程序等。1無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令有如表3.20所示的4條指令,它們提供了不同的轉(zhuǎn)移范圍和尋址方式。表3.20 無(wú)條件轉(zhuǎn)移指令(1) LJMP稱為長(zhǎng)轉(zhuǎn)移指令,它是一條三字節(jié)指令,提供16位目標(biāo)地址addr16。執(zhí)行該指令后,程序計(jì)數(shù)器PC的高8位為addr158的地址值,低8位為
53、addr70的地址值,程序無(wú)條件地轉(zhuǎn)向指定的目標(biāo)地址去執(zhí)行,不影響標(biāo)志位。由于可直接提供16位目標(biāo)地址,所以執(zhí)行這條指令可以使程序從當(dāng)前地址轉(zhuǎn)移到64KB程序存儲(chǔ)器地址空間的任意單元,故稱為“長(zhǎng)轉(zhuǎn)移”。例如,在程序存儲(chǔ)器0000H單元存放一條指令:LJMP 2000H ;(PC)3000H ,02 20 00則上電復(fù)位后程序?qū)⑻?000H單元去執(zhí)行用戶程序。(2) AJMP稱為絕對(duì)轉(zhuǎn)移指令,它是一條雙字節(jié)指令。該指令的機(jī)器代碼是由11位直接地址addr11和指令特有操作碼00001按下列分布組成的:該指令執(zhí)行后,程序轉(zhuǎn)移的目的地址由AJMP指令所在位置的地址PC值加上該指令字節(jié)數(shù)2,構(gòu)成當(dāng)前
54、的PC值。取當(dāng)前PC值的高5位與指令中提供的11位直接地址形成轉(zhuǎn)移的目的地址,即:由于11位地址的范圍是0000000000011111111111,即2 KB范圍,而目標(biāo)地址的高5位是由PC當(dāng)前值固定的,所以程序可轉(zhuǎn)移的位置只能是和PC當(dāng)前值在同一2KB的范圍之內(nèi)。本指令轉(zhuǎn)移可以向前,也可以向后,指令執(zhí)行后不影響狀態(tài)標(biāo)志位。例如,若AJMP指令地址(PC)=2300H。執(zhí)行指令:AJMP 0FFH ;(PC)(PC)+2=2302H ;(PC)1000001 1111111結(jié)果:轉(zhuǎn)移目的地址(PC)=20FFH,程序向前轉(zhuǎn)向20FFH單元開始執(zhí)行。又如,若AJMP指令地址(PC)=2FFFH
55、。執(zhí)行指令:AJMP 0FFH ;(PC)(PC)+2=3001H ;(PC)100=00011111111結(jié)果:轉(zhuǎn)移目的地址(PC)=30FFH,程序向后轉(zhuǎn)向30FFH單元開始執(zhí)行。值得注意的是,AJMP的機(jī)器代碼是由指令提供的直接地址addr11與指令特有的操作碼構(gòu)成的。若addr11相同,則AJMP指令的機(jī)器代碼相同,其轉(zhuǎn)移目的地址是由PC當(dāng)前值的高5位與addr11共同決定的,且轉(zhuǎn)移范圍為PC當(dāng)前值所指的2 KB地址范圍。(3) SJMP稱為短轉(zhuǎn)移指令,它是雙字節(jié)指令,指令的操作數(shù)是相對(duì)地址rel。由于rel是帶符號(hào)的偏移量,所以程序可以無(wú)條件向前或向后轉(zhuǎn)移,在SJMP指令所在地址PC
56、值(源地址)加該指令字節(jié)數(shù)2的基礎(chǔ)上,在以-128+127為偏移量(256個(gè)單元)的范圍內(nèi)實(shí)現(xiàn)相對(duì)短轉(zhuǎn)移,即目的地址=源地址+2+rel例如,在3100H單元有SJMP指令,若rel=5AH(正數(shù)),則轉(zhuǎn)移目的地址為315CH;若rel=F0H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為30F2H(3100H+2H+FFF0H)。該指令的執(zhí)行不影響狀態(tài)標(biāo)志位。這條指令的優(yōu)點(diǎn)是:指令中只給出了相對(duì)轉(zhuǎn)移地址,不具體指出地址值。在修改程序時(shí),只要相對(duì)地址不發(fā)生改變,該指令就不需要作任何改動(dòng)。對(duì)于前兩條指令(LJMP、AJMP),由于直接給出了轉(zhuǎn)移地址,在程序修改時(shí)就可能需要修改該地址,所以短轉(zhuǎn)移指令在子程序中應(yīng)用較多
57、。采用匯編語(yǔ)言編程時(shí),指令中的相對(duì)地址rel常常采用欲轉(zhuǎn)移至的地址的標(biāo)號(hào)(符號(hào)地址)表示,能自動(dòng)算出相對(duì)地址值。rel的計(jì)算公式如下:向前轉(zhuǎn)移: rel=FE-(源地址與目的地址差的絕對(duì)值)向后轉(zhuǎn)移: rel=(源地址與目的地址差的絕對(duì)值)-2若rel值大于80H,則程序向前轉(zhuǎn)移;若rel值小于80H,則程序向后轉(zhuǎn)移。例如,設(shè)(PC)=2100H,若轉(zhuǎn)向215CH去執(zhí)行程序,則Rel=(215CH-2100H)-2H=5AH相應(yīng)的轉(zhuǎn)移指令如下:2100:SJMP rel ;其指令的機(jī)器代碼為805AH。若轉(zhuǎn)向20F2H去執(zhí)行程序,則Rel=FE-(2100H-20F2H)=F0H另外,若rel
58、取值為FE,則目的地址=源地址。若在程序的最末端加上這樣一條指令,則程序就不會(huì)再向后執(zhí)行,而“終止”在這一句上,造成單指令的無(wú)限循環(huán)并進(jìn)入等待狀態(tài)。通常表示如下:HERE:SJMP HERE ;或 HERE:SJMP $ ,80 FE(4) JMP稱為間接長(zhǎng)轉(zhuǎn)移指令,它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址,以累加器A的內(nèi)容為相對(duì)偏移量,在64KB范圍內(nèi)可無(wú)條件轉(zhuǎn)移的單字節(jié)指令。該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。例如,當(dāng)DPTR為確定的值時(shí),根據(jù)A的不同值就可以實(shí)現(xiàn)多分支的轉(zhuǎn)移,起到一條指令完成多條分支指令的功能。因此,該指令是一條典型的多分支選擇轉(zhuǎn)移指令。另外,該指令執(zhí)行后不影響DP
59、TR和A的原內(nèi)容,也不影響任何狀態(tài)標(biāo)志。例如,根據(jù)累加器A的數(shù)值,轉(zhuǎn)至不同處理程序的入口。程序如下:MOV 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)=2時(shí)轉(zhuǎn)TAB2執(zhí)行 AJMP TAB3 ;當(dāng)(A)=4時(shí)轉(zhuǎn)TAB3執(zhí)行以上程序可依據(jù)A的內(nèi)容進(jìn)行多分支操作,由于AJMP是雙字節(jié)指令,所以A的值必須為偶數(shù)。2條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令的作用是當(dāng)某種條件滿足時(shí),程序轉(zhuǎn)移執(zhí)行,條件不滿足時(shí),程序仍按原來(lái)的順序繼續(xù)執(zhí)行。條件轉(zhuǎn)移的條件可以是上一條指令或者更前一條指令的執(zhí)
60、行結(jié)果(體現(xiàn)在標(biāo)志位上),也可以是條件轉(zhuǎn)移指令本身包含的某種運(yùn)算結(jié)果。該類指令共有8條,可以分為累加器判零條件轉(zhuǎn)移指令、比較條件轉(zhuǎn)移指令和減1條件轉(zhuǎn)移指令3大類。由于該類指令采用相對(duì)尋址,因此程序可在以當(dāng)前PC值為中心的-128+127范圍內(nèi)轉(zhuǎn)移。1) 累加器判零轉(zhuǎn)移指令這類指令有2條,如表3.21所示。表3.21 累加器判零轉(zhuǎn)移指令這是一組以累加器A的內(nèi)容是否為零作為條件的雙字節(jié)轉(zhuǎn)移指令。累加器的內(nèi)容是否為零,是由這條指令以前的其他指令執(zhí)行的結(jié)果決定的,該指令本身不作任何運(yùn)算,也不影響任何標(biāo)志?!纠?.12】 試編程從P2口讀入數(shù)據(jù),若為0,則在本地循環(huán)等待;若不為0,則順序執(zhí)行。解:WAI
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省濱州市惠民縣2024-2025學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題(含答案)
- 遼寧省鞍山市2024-2025學(xué)年高一上學(xué)期期末物理試卷(含答案)
- 綠色營(yíng)銷的評(píng)價(jià)體系講義
- (一模)哈三中2025屆高三第一次模擬考試 地理試題(含答案)
- 中小學(xué)消防知識(shí)培訓(xùn)課件
- 企業(yè)員工培訓(xùn)體系構(gòu)建與實(shí)踐經(jīng)驗(yàn)分享
- 形容詞級(jí)與最高級(jí)的用法對(duì)比高一英語(yǔ)教學(xué)設(shè)計(jì)
- 物聯(lián)網(wǎng)智能家居解決方案合同
- 三只小豬蓋房記讀后感
- 企業(yè)數(shù)據(jù)安全保護(hù)服務(wù)協(xié)議
- GB 9688-1988食品包裝用聚丙烯成型品衛(wèi)生標(biāo)準(zhǔn)
- 種族民族與國(guó)家
- 01車輪踏面清掃裝置左
- 化學(xué)品安全技術(shù)說(shuō)明書 MSDS( 石腦油)
- 《集合的基本運(yùn)算》-完整版PPT
- 2022新教科版科學(xué)五下全冊(cè)教案、全冊(cè)教學(xué)反思(表格式)含目錄
- 土力學(xué)-第二章-土的工程性質(zhì)及工程分類
- 小學(xué)體育《陽(yáng)光運(yùn)動(dòng)身體好》課件
- 研究生面試復(fù)試英語(yǔ)+常問(wèn)問(wèn)題
- 數(shù)學(xué)名詞中英文對(duì)照
- 線束加工工時(shí)對(duì)照表
評(píng)論
0/150
提交評(píng)論