第3章-MCS-51單片機指令系統(tǒng)課件_第1頁
第3章-MCS-51單片機指令系統(tǒng)課件_第2頁
第3章-MCS-51單片機指令系統(tǒng)課件_第3頁
第3章-MCS-51單片機指令系統(tǒng)課件_第4頁
第3章-MCS-51單片機指令系統(tǒng)課件_第5頁
已閱讀5頁,還剩133頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章MCS-51單片機指令系統(tǒng)3.1尋址方式3.2指令系統(tǒng)第3章MCS-51單片機指令系統(tǒng)3.1尋址方式11.單字節(jié)指令單字節(jié)指令格式由8位二進(jìn)制編碼表示,例如:CLRA→E4H

2.雙字節(jié)指令雙字節(jié)指令格式由兩個字節(jié)組成,操作碼和操作數(shù),例如: MOVA,#10H→74H10H3.三字節(jié)指令三字節(jié)指令格式中,第一個字節(jié)為操作碼,后兩個字節(jié)為操作數(shù),例如: MOV40H,#30H→75H40H30H1.單字節(jié)指令2一條匯編語言指令中最多包含4個區(qū)段,如下所示:[標(biāo)號:]操作碼[操作數(shù)][;注釋]4個區(qū)段之間要用分隔符分開:標(biāo)號與操作碼之間用“:”隔開,操作碼與操作數(shù)之間用空格隔開,操作數(shù)與注釋之間用“;”隔開,如果操作數(shù)有兩個以上,則在操作數(shù)之間要用逗號“,”隔開(乘法指令和除法指令除外)。一條匯編語言指令中最多包含4個區(qū)段,如33.1尋址方式所謂尋址方式,就是尋找操作數(shù)地址的方式,在用匯編語言編程時,數(shù)據(jù)的存放、傳送、運算都要通過指令來完成。編程者必須自始至終都要十分清楚操作數(shù)的位置,以及如何將它們傳送到適當(dāng)?shù)募拇嫫魅⑴c運算。每一種計算機都具有多種尋址方式。尋址方式的多少是反映指令系統(tǒng)優(yōu)劣的主要指標(biāo)之一。3.1尋址方式所謂尋址方式,就是尋找操4在MCS-51單片機指令系統(tǒng)中,有以下7種尋址方式:(1)立即尋址;(2)直接尋址;(3)寄存器尋址;(4)寄存器間接尋址;(5)基址寄存器加變址寄存器間接尋址;(6)相對尋址;(7)位尋址。在MCS-51單片機指令系統(tǒng)中,有以下51.立即尋址立即尋址方式是指操作數(shù)包含在指令字節(jié)中。跟在指令操作碼后面的數(shù)就是參加運算的數(shù),該操作數(shù)稱為立即數(shù)。立即數(shù)有一字節(jié)和二字節(jié)兩種可能,例如指令:MOVA,#3AHMOVDPTR,#0DFFFH上述兩條指令均為立即尋址方式,第一條指令的功能是將立即數(shù)3AH送累加器A中,第二條指令的功能是將立即數(shù)0DFFFH送數(shù)據(jù)指針DPTR中(0DFH→DPH,0FFH→DPL)。1.立即尋址62.直接尋址在指令中直接給出操作數(shù)的地址,這種尋址方式就屬于直接尋址方式。在這種方式中,指令的操作數(shù)部分直接是操作數(shù)的地址。在MCS-51單片機指令系統(tǒng)中,直接尋址方式中可以訪問3種存儲器空間:(1)內(nèi)部數(shù)據(jù)存儲器的低128個字節(jié)單元(00H~7FH)。(2)特殊功能寄存器。特殊功能寄存器只能用直接尋址方式進(jìn)行訪問。(3)位地址空間。2.直接尋址7

3.寄存器尋址在該尋址方式中,參加操作的數(shù)存放在寄存器里。寄存器包括8個工作寄存器R0~R7,累加器A,寄存器B、數(shù)據(jù)指針DPTR和布爾處理器的位累加器C。3.寄存器尋址84.寄存器間接尋址在這種尋址方式中,寄存器的內(nèi)容為操作數(shù)的地址。寄存器間接尋址只能使用寄存器R0、R1作為地址指針,尋址內(nèi)部RAM區(qū)的數(shù)據(jù);當(dāng)訪問外部RAM時,可使用R0、R1及DPTR作為地址指針。寄存器間接尋址符號為“@”,例如:4.寄存器間接尋址95.基址寄存器加變址寄存器間接尋址這種尋址方式用于訪問程序存儲器中的數(shù)據(jù)表格,它以基址寄存器DPTR或PC的內(nèi)容為基本地址,加上變址寄存器A的內(nèi)容作為操作數(shù)的地址,例如:MOVCA,@DPTR+AJMP@A+DPTRMOVCA,@PC+A5.基址寄存器加變址寄存器間接尋址106.相對尋址在MCS-51指令系統(tǒng)中設(shè)有轉(zhuǎn)移指令,分為直接轉(zhuǎn)移和相對轉(zhuǎn)移指令,在相對轉(zhuǎn)移指令中采用相對尋址方式。這種尋址方式是以PC的內(nèi)容為基本地址,加上指令中給定的偏移量作為轉(zhuǎn)移地址。指令中給出的偏移量是一個8位帶符號的常數(shù),可正可負(fù),其范圍為-128~+127。7.位尋址該種尋址方式中,操作數(shù)是內(nèi)部RAM單元中某一位的信息。6.相對尋址113.2指令系統(tǒng)3.2.1指令分類按指令的功能,MCS-51指令系統(tǒng)可分為下列5類:(1)數(shù)據(jù)傳送;(2)算術(shù)運算;(3)邏輯運算;(4)位操作;(5)控制轉(zhuǎn)移。3.2指令系統(tǒng)3.2.1指令分類按指令的功能,M12Rn——當(dāng)前選定的寄存器區(qū)中的8個工作寄存器R0~R7,即n=0~7。Ri——當(dāng)前選定的寄存器區(qū)中的2個寄存器R0、R1,i=0、1。direct——8位內(nèi)部RAM單元的地址,它可以是一個內(nèi)部數(shù)據(jù)區(qū)RAM單元(00H~7FH)或特殊功能寄存器地址(I/O端口、控制寄存器、狀態(tài)寄存器80H~0FFH)。#data——指令中的8位常數(shù)。#data16——指令中的16位常數(shù)。addr16——16位的目的地址,用于LJMP#,LCALL指令,可指向64KB程序存儲器地址空間。Rn——當(dāng)前選定的寄存器區(qū)中的8個工作寄13addr11——11位的目的地址,用于AJMP,ACALL指令。目的地址必須與下一條指令的第一個字節(jié)在同一個2KB程序存儲器地址空間之內(nèi)。rel——8位帶符號的偏移量字節(jié),用于SJMP和所有條件轉(zhuǎn)移指令中。偏移量相對于下一條指令的第一個字節(jié)計算,在-128~+127范圍內(nèi)取值。bit——內(nèi)部數(shù)據(jù)RAM或特殊功能寄存器中的可直接尋址位。DPTR——數(shù)據(jù)指針,可用作16位的地址寄存器。addr11——11位的目的地址,用于AJM14A——累加器。B——寄存器,用于MUL和DIV指令中。C——進(jìn)位標(biāo)志或進(jìn)位位。@——間接尋址寄存器或基址寄存器的前綴,如@Ri,@DPTR。/——位操作數(shù)的前綴,表示對該位取反。(X)——X中的內(nèi)容。((X))——由X尋址的單元中的內(nèi)容。←——箭頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所代替。A——累加器。153.2.2數(shù)據(jù)傳送類指令圖3–1MCS-51傳送指令示意圖3.2.2數(shù)據(jù)傳送類指令圖3–1MCS-51傳16表3.1數(shù)據(jù)傳送類指令一覽表表3.1數(shù)據(jù)傳送類指令一覽表17表3.1數(shù)據(jù)傳送類指令一覽表表3.1數(shù)據(jù)傳送類指令一覽表181.數(shù)據(jù)傳送到累加器A的指令MOVA,R0MOVA,directMOVA,@RiMOVA,#data這組指令的功能是:把源操作數(shù)的內(nèi)容送入累加器A。例如:MOVA,#10H,該指令執(zhí)行時將立即數(shù)10H送入累加器A中。1.數(shù)據(jù)傳送到累加器A的指令192.數(shù)據(jù)傳送到工作寄存器Rn的指令MOVRn,AMOVRn,directMOVRn,#data這組指令的功能是:把源操作數(shù)的內(nèi)容送入當(dāng)前工作寄存器區(qū)的R0~R7中的某一個寄存器。指令中Rn在內(nèi)部數(shù)據(jù)存儲器中的地址由當(dāng)前的工作寄存器區(qū)選擇位RS1、RS0確定,可以是00H~07H、08H~0FH、10H~17H、18H~1FH。例如:MOVR0,A,若當(dāng)前RS1、RS0設(shè)置為00(即工作寄存器0區(qū)),執(zhí)行該指令時,將累加器A中的數(shù)據(jù)傳送至工作寄存器R0(內(nèi)部RAM00H)單元中。2.數(shù)據(jù)傳送到工作寄存器Rn的指令203.數(shù)據(jù)傳送到內(nèi)部RAM單元或特殊功能寄存器SFR的指令MOVdirect,AMOVdirect,RnMOVdirect,directMOVdirect,@RiMOVdirect,#dataMOV@Ri,AMOV@Ri,directMOV@Ri,#dataMOVDPTR,#data163.數(shù)據(jù)傳送到內(nèi)部RAM單元或特殊功能寄存器SFR的指令21這組指令的功能是:把源操作數(shù)的內(nèi)容送入內(nèi)部RAM單元或特殊功能寄存器。其中第三條指令和最后一條指令都是三字節(jié)指令。第三條指令的功能很強,能實現(xiàn)內(nèi)部RAM之間、特殊功能寄存器之間或特殊功能寄存器與內(nèi)部RAM之間的直接數(shù)據(jù)傳送。最后一條指令是將16位的立即數(shù)送入數(shù)據(jù)指針寄存器DPTR。這組指令的功能是:把源操作數(shù)的內(nèi)容送入內(nèi)部R224.累加器A與外部數(shù)據(jù)存儲器之間的傳送指令MOVXA,@DPTRMOVXA,@RiMOVX@DPTR,AMOVX@Ri,A4.累加器A與外部數(shù)據(jù)存儲器之間的傳送指令23這組指令是:在累加器A與外部數(shù)據(jù)存儲器RAM單元或I/O口之間進(jìn)行數(shù)據(jù)傳送,前兩條指令執(zhí)行時,P3.7引腳上輸出RD有效信號,用作外部數(shù)據(jù)存儲器的讀選通信號;后兩條指令執(zhí)行時,P3.6引腳上輸出WR有效信號,用作外部數(shù)據(jù)存儲器的寫選通信號。DPTR所包含的16位地址信息由P0(低8位)和P2(高8位)輸出,而數(shù)據(jù)信息由P0口傳送,P0口作分時復(fù)用的總線。由Ri作為間接尋址寄存器時,P0口上分時輸出Ri指定的8位地址信息及傳輸8位數(shù)據(jù)。這組指令是:在累加器A與外部數(shù)據(jù)存儲器RAM245.堆棧操作指令PUSHdirectPOPdirect在MCS-51單片機的內(nèi)部RAM中,可以設(shè)定一個先進(jìn)后出的區(qū)域,稱其為堆棧。在特殊功能寄存器中有一個堆棧指針SP,它指出棧頂?shù)奈恢谩_M(jìn)棧指令的功能是:首先將堆棧指針SP的內(nèi)容加1,然后將直接地址所指出的內(nèi)容送入SP指出的內(nèi)部RAM單元;出棧指令的功能是:將SP所指出的內(nèi)部RAM單元的內(nèi)容送入由直接地址所指出的字節(jié)單元,接著將堆棧指針SP的內(nèi)容減1。5.堆棧操作指令25例如:進(jìn)入中斷服務(wù)子程序時,把程序狀態(tài)寄存器PSW、累加器A、數(shù)據(jù)指針DPTR進(jìn)棧保護。設(shè)當(dāng)前SP為60H。則程序段PUSHPSWPUSHACCPUSHDPLPUSHDPH執(zhí)行后,SP內(nèi)容修改為64H,而61H、62H、63H、64H單元中依次棧入PSW、A、DPL、DPH的內(nèi)容。當(dāng)中斷服務(wù)程序結(jié)束之前,如下程序段(SP保持64H不變)例如:進(jìn)入中斷服務(wù)子程序時,把程序狀態(tài)寄26POPDPHPOPDPLPOPACCPOPPSW執(zhí)行之后,SP內(nèi)容修改為60H,而64H、63H、62H、61H單元中的內(nèi)容依次彈出到DPH、DPL、A、PSW中。MCS-51提供一個向上升的堆棧,因此SP設(shè)置初值時要充分考慮堆棧的深度,要留出適當(dāng)?shù)膯卧臻g,滿足堆棧的使用。POPDPH276.程序存儲器內(nèi)容送累加器MOVCA,@A+PCMOVCA,@A+DPTR這是兩條很有用的查表指令,可用來查找存放在外部程序存儲器中的常數(shù)表格。第一條指令是以PC作為基址寄存器,A的內(nèi)容作為無符號數(shù)和PC的內(nèi)容(下一條指令的起始地址)相加后得到一個16位的地址,并將該地址指出的程序存儲器單元的內(nèi)容送到累加器A。這條指令的優(yōu)點是不改變特殊功能寄存器和PC的狀態(tài),只要根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點是表格只能放在該條查表指令后面的256個單元之中,表格的大小受到限制,而且表格只能被一段程序所利用。6.程序存儲器內(nèi)容送累加器28第二條指令是以DPTR作為基址寄存器,累加器A的內(nèi)容作為無符號數(shù)與DPTR內(nèi)容相加,得到一個16位的地址,并把該地址指出的程序存儲器單元的內(nèi)容送到累加器A。這條指令的執(zhí)行結(jié)果只與指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址無關(guān),因此,表格的大小和位置可以在64KB程序存儲器中任意安排,并且一個表格可以為各個程序塊所共用。第二條指令是以DPTR作為基址寄存器,累加器29

7.字節(jié)交換指令XCHA,RnXCHA,@RiXCHA,directXCHDA,@RiSWAPA前三條指令是將累加器A的內(nèi)容和源操作數(shù)內(nèi)容相互交換;后兩條指令是半字節(jié)交換指令,最后一條指令是將累加器A的高4位與低4位之間進(jìn)行交換,而另外一條指令是將累加器A的低4位內(nèi)容和(Ri)所指出的內(nèi)部RAM單元的低4位內(nèi)容相互交換。7.字節(jié)交換指令303.2.3算術(shù)運算類指令表3.2算術(shù)運算指令3.2.3算術(shù)運算類指令表3.2算術(shù)運算指令31表3.2算術(shù)運算指令表3.2算術(shù)運算指令32表3.3影響標(biāo)志位的指令表3.3影響標(biāo)志位的指令33表3.3影響標(biāo)志位的指令表3.3影響標(biāo)志位的指令34一、加法指令1.普通加法指令A(yù)DDA,RnADDA,directADDA,@RiADDA,#data一、加法指令1.普通加法指令35例如:120和100之和為220,顯然大于127,相加時011110001200110010010011011100220+符號位(最高位)由0變1,兩個正數(shù)相加結(jié)果變負(fù),實際上它是和數(shù)的最高位,符號位移入了進(jìn)位標(biāo)志,此時位6有進(jìn)位而位7無進(jìn)位,置位溢出標(biāo)志OV,結(jié)果溢出。例如:120和100之和為220,顯然大于1236同樣,-120和-100相加,結(jié)果應(yīng)為-220,顯然小于-128,相加時10001000-12010011100-100+100100100-220符號位由1變?yōu)?,兩個負(fù)數(shù)相加結(jié)果變?yōu)檎龜?shù),這是因為符號位移入進(jìn)位標(biāo)志,位6無進(jìn)位而位7有進(jìn)位,置位溢出標(biāo)志OV,由此可判斷結(jié)果溢出。同樣,-120和-100相加,結(jié)果應(yīng)為372.帶進(jìn)位加法指令A(yù)DDCA,RnADDCA,directADDCA,@RiADDCA,#data這組指令的功能與普通加法指令類似,唯一的不同之處是,在執(zhí)行加法時,還要將上一次進(jìn)位標(biāo)志Cy的內(nèi)容也一起加進(jìn)去,對于標(biāo)志位的影響也與普通加法指令相同。2.帶進(jìn)位加法指令38

3.增量指令I(lǐng)NCAINCRnINCdirectINC@RiINCDPTR這組指令的功能是:將指令中所指出操作數(shù)的內(nèi)容加1。若原來的內(nèi)容為0FFH,則加1后將產(chǎn)生溢出,使操作數(shù)的內(nèi)容變成00H,但不影響任何標(biāo)志。最后一條指令是對16位的數(shù)據(jù)指針寄存器DPTR執(zhí)行加1操作,指令執(zhí)行時,先對低8位指針DPL的內(nèi)容加1,當(dāng)產(chǎn)生溢出時就對高8位指針DPH加1,但不影響任何標(biāo)志。3.增量指令394.十進(jìn)制調(diào)整指令DAA這條指令對累加器A參與的BCD碼加法運算所獲得的8位結(jié)果進(jìn)行十進(jìn)制調(diào)整,使累加器A中的內(nèi)容調(diào)整為二位壓縮型BCD碼的數(shù)。使用時必須注意,它只能跟在加法指令之后,不能對減法指令的結(jié)果進(jìn)行調(diào)整,且其結(jié)果不影響溢出標(biāo)志位。執(zhí)行該指令時,判斷A中的低4位是否大于9和輔助進(jìn)位標(biāo)志AC是否為“1”,若兩者有一個條件滿足,則低4位加6操作;同樣,A中的高4位大于9或進(jìn)位標(biāo)志Cy為“1”兩者有一個條件滿足時,高4位加6操作。例如:有兩個BCD數(shù)36與45相加,結(jié)果應(yīng)為BCD碼81,程序如下:4.十進(jìn)制調(diào)整指令40MOVA,#36HADDA,#45HDAA這段程序中,第一條指令將立即數(shù)36H(BCD碼36)送入累加器A;第二條指令進(jìn)行如下加法:00110110360100010145011110117B0000011006++1000000181得結(jié)果7BH;第三條指令對累加器A進(jìn)行十進(jìn)制調(diào)整,低4位(為0BH)大于9,因此要加6,得調(diào)整的BCD碼81。MOVA,#36H這段程序中,第一41二、減法指令1.帶進(jìn)位減法指令SUBBA,RnSUBBA,directSUBBA,@RiSUBBA,#data這組指令的功能是:將累加器A的內(nèi)容與第二操作數(shù)及進(jìn)位標(biāo)志相減,結(jié)果送回到累加器A中。在執(zhí)行減法過程中,如果位7(D7)有借位,則進(jìn)位標(biāo)志Cy置“1”,否則清“0”;如果位3(D3)有借位,則輔助進(jìn)位標(biāo)志AC置“1”,否則清“0”;如位6有借位而位7沒有借位,或位7有借位而位6沒有借位,則溢出標(biāo)志OV置“1”,否則清“0”。若要進(jìn)行不帶借位的減法操作,則必須先將Cy清“0”。二、減法指令42

2.減1指令DECADECRnDECdirectDEC@Ri這組指令的功能是:將指出的操作數(shù)內(nèi)容減1。如果原來的操作數(shù)為00H,則減1后將產(chǎn)生下溢出,使操作數(shù)變成0FFH,但不影響任何標(biāo)志。2.減1指令43三、乘法指令乘法指令完成單字節(jié)的乘法,只有一條指令:MULAB這條指令的功能是:將累加器A的內(nèi)容與寄存器B的內(nèi)容相乘,乘積的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘積超過0FFH,則溢出標(biāo)志OV置“1”,否則清“0”。進(jìn)位標(biāo)志Cy總是被清“0”。三、乘法指令44

四、除法指令除法指令完成單字節(jié)的除法,只有一條指令:DIVAB這條指令的功能是:將累加器A中的內(nèi)容除以寄存器B中的8位無符號整數(shù),所得商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中,清“0”進(jìn)位標(biāo)志Cy和溢出標(biāo)志OV。若原來B中的內(nèi)容為0,則執(zhí)行該指令后A與B中的內(nèi)容不定,并將溢出標(biāo)志OV置“1”,在任何情況下,進(jìn)位標(biāo)志Cy總是被清“0”。四、除法指令453.2.4邏輯運算類指令表3.4邏輯運算指令3.2.4邏輯運算類指令表3.4邏輯運算指令46

一、簡單邏輯操作指令CLRA;對累加器A清“0”CPLA;對累加器A按位取反RLA;累加器A的內(nèi)容向左環(huán)移1位RLCA;累加器A的內(nèi)容帶進(jìn)位標(biāo)志位向左環(huán)移1位RRA;累加器A的內(nèi)容向右環(huán)移1位RRCA;累加器A的內(nèi)容帶進(jìn)位標(biāo)志位向右環(huán)移1位這組指令的功能是:對累加器A的內(nèi)容進(jìn)行簡單的邏輯操作。除了帶進(jìn)位標(biāo)志位的移位指令外,其它都不影響Cy,AC,OV等標(biāo)志。一、簡單邏輯操作指令47二、邏輯與指令A(yù)NLA,RnANLA,directANLA,@RiANLA,#dataANLdirect,AANLdirect,#data這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯與操作,并將結(jié)果送回目的操作數(shù)的單元中。二、邏輯與指令48三、邏輯或指令ORLA,RnORLA,directORLA,@RiORLA,#dataORLdirect,AORLdirect,#data這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯或操作,并將結(jié)果送回目的操作數(shù)的單元中。三、邏輯或指令49四、邏輯異或指令XRLA,RnXRLA,directXRLA,@RiXRLA,#dataXRLdirect,AXRLdirect,#data這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯異或操作,并將結(jié)果送回到目的操作數(shù)的單元中。四、邏輯異或指令503.2.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令共有17條,不包括按布爾變量控制程序轉(zhuǎn)移指令(見表3.5)。其中有64KB范圍內(nèi)的長調(diào)用、長轉(zhuǎn)移指令;有2KB范圍內(nèi)的絕對調(diào)用和絕對轉(zhuǎn)移指令;有全空間的長相對轉(zhuǎn)移及一頁范圍內(nèi)的短相對轉(zhuǎn)移指令;還有多種條件轉(zhuǎn)移指令。由于MCS-51提供了較豐富的控制轉(zhuǎn)移指令,因此在編程上相當(dāng)靈活方便。這類指令用到的助記符共有10種:AJMP、LJMP、SJMP、JMP、ACALL、LCALL、JZ、JNZ、CJNE、DJNZ。3.2.5控制轉(zhuǎn)移指令51表3.5控制轉(zhuǎn)移指令表3.5控制轉(zhuǎn)移指令52一、無條件轉(zhuǎn)移指令1.短跳轉(zhuǎn)指令A(yù)JMPaddr11這是2KB范圍內(nèi)的無條件跳轉(zhuǎn)指令,執(zhí)行該指令時,先將PC+2,然后將addr11送入PC10~PC0,而PC15~PC11保持不變。這樣得到跳轉(zhuǎn)的目的地址。需要注意的是,目標(biāo)地址與AJMP后面一條指令的第一個字節(jié)必須在同一個2KB區(qū)域的存儲器區(qū)內(nèi)。一、無條件轉(zhuǎn)移指令1.短跳轉(zhuǎn)指令53

2.相對轉(zhuǎn)移指令SJMPrel執(zhí)行該指令時,先將PC+2,再把指令中帶符號的偏移量加到PC上,得到跳轉(zhuǎn)的目標(biāo)地址送入PC。3.長跳轉(zhuǎn)指令LJMPaddr16執(zhí)行該指令時,將16位目標(biāo)地址addr16裝入PC,程序無條件轉(zhuǎn)向指定的目標(biāo)地址。轉(zhuǎn)移的目標(biāo)地址可以在64KB程序存儲器地址空間的任何地方,不影響任何標(biāo)志。2.相對轉(zhuǎn)移指令544.散轉(zhuǎn)指令JMP@A+DPTR執(zhí)行該指令時,把累加器A中的8位無符號數(shù)與數(shù)據(jù)指針中的16位數(shù)相加,結(jié)果作為下條指令的地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR的內(nèi)容,也不影響標(biāo)志。利用這條指令能實現(xiàn)程序的散轉(zhuǎn)。4.散轉(zhuǎn)指令55二、條件轉(zhuǎn)移指令JZrel;(A)=0轉(zhuǎn)移JNZrel;(A)≠0轉(zhuǎn)移這類指令是依據(jù)累加器A的內(nèi)容是否為0的條件轉(zhuǎn)移指令。條件滿足時轉(zhuǎn)移(相當(dāng)于一條相對轉(zhuǎn)移指令),條件不滿足時則順序執(zhí)行下面一條指令。轉(zhuǎn)移的目標(biāo)地址在以下一條指令的起始地址為中心的256個字節(jié)范圍之內(nèi)(-128~+127)。當(dāng)條件滿足時,PC←(PC)+N+rel,其中(PC)為該條件轉(zhuǎn)移指令的第一個字節(jié)的地址,N為該轉(zhuǎn)移指令的字節(jié)數(shù)(長度),本轉(zhuǎn)移指令N=2。二、條件轉(zhuǎn)移指令56三、比較轉(zhuǎn)移指令在MCS-51中沒有專門的比較指令,但提供了下面4條比較不相等轉(zhuǎn)移指令:CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,rel這組指令的功能是:比較前面兩個操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移。轉(zhuǎn)移地址的計算方法與上述兩條指令相同。如果第一個操作數(shù)(無符號整數(shù))小于第二個操作數(shù),則進(jìn)位標(biāo)志Cy置“1”,否則清“0”,但不影響任何操作數(shù)的內(nèi)容。三、比較轉(zhuǎn)移指令57四、減1不為0轉(zhuǎn)移指令DJNZRn,relDJNZdirect,rel這兩條指令把源操作數(shù)減1,結(jié)果回送到源操作數(shù)中去,如果結(jié)果不為0則轉(zhuǎn)移(轉(zhuǎn)移地址的計算方法同前)。四、減1不為0轉(zhuǎn)移指令58五、調(diào)用及返回指令在程序設(shè)計中,通常把具有一定功能的公用程序段編制成子程序,當(dāng)主程序需要使用子程序時用調(diào)用指令,而在子程序的最后安排一條子程序返回指令,以便執(zhí)行完子程序后能返回主程序繼續(xù)執(zhí)行。五、調(diào)用及返回指令591.絕對調(diào)用指令A(yù)CALLaddr11這是一條2KB范圍內(nèi)的子程序調(diào)用指令。執(zhí)行該指令時,先將PC+2以獲得下一條指令的地址,然后將16位地址壓入堆棧(PCL內(nèi)容先進(jìn)棧,PCH內(nèi)容后進(jìn)棧),SP內(nèi)容加2,最后把PC的高5位PC15~PC11與指令中提供的11位地址addr11相連接(PC15~PC11,A10~A0),形成子程序的入口地址送入PC,使程序轉(zhuǎn)向子程序執(zhí)行。所用的子程序的入口地址必須與ACALL下面一條指令的第一個字節(jié)在同一個2KB區(qū)域的存儲器區(qū)內(nèi)。1.絕對調(diào)用指令60

2.長調(diào)用指令LCALLaddr16這條指令無條件調(diào)用位于16位地址addr16的子程序。執(zhí)行該指令時,先將PC+3以獲得下一條指令的首地址,并把它壓入堆棧(先低字節(jié)后高字節(jié)),SP內(nèi)容加2,然后將16位地址放入PC中,轉(zhuǎn)去執(zhí)行以該地址為入口的程序。LCALL指令可以調(diào)用64KB范圍內(nèi)任何地方的子程序。指令執(zhí)行后不影響任何標(biāo)志。2.長調(diào)用指令613.子程序返回指令RET這條指令的功能是:恢復(fù)斷點,將調(diào)用子程序時壓入堆棧的下一條指令的首地址取出送入PC,使程序返回主程序繼續(xù)執(zhí)行。4.中斷返回指令RETI這條指令的功能與RET指令相似,不同的是它還要清除MCS-51單片機內(nèi)部的中斷狀態(tài)標(biāo)志。3.子程序返回指令623.2.6位操作類指令表3.6位操作指令3.2.6位操作類指令表3.6位操作指令63指令中位地址的表達(dá)形式有以下幾種:(1)直接地址方式:如0A8H;(2)點操作符方式:如IE.0;(3)位名稱方式:如EX0;(4)用戶定義名方式:如用偽指令BIT定義:WBZD0BITEX0經(jīng)定義后,允許指令中使用WBZD0代替EX0。指令中位地址的表達(dá)形式有以下幾種:641.位數(shù)據(jù)傳送指令MOVC,bitMOVbit,C這組指令的功能是:把源操作數(shù)指出的布爾變量送到目的操作數(shù)指定的位地址單元中。其中一個操作數(shù)必須為進(jìn)位標(biāo)志Cy,另一個操作數(shù)可以是任何可直接尋址位。1.位數(shù)據(jù)傳送指令652.位變量修改指令CLRCCLRbitCPLCCPLbitSETBCSETBbit這組指令對操作數(shù)所指出的位進(jìn)行清“0”#,取反#,置“1”的操作,不影響其它標(biāo)志。2.位變量修改指令663.位變量邏輯與指令A(yù)NLC,bitANLC,/bit這組指令的功能是:如果源位的布爾值是邏輯0,則將進(jìn)位標(biāo)志清“0”;否則,進(jìn)位標(biāo)志保持不變,不影響其它標(biāo)志。bit前的斜杠表示對(bit)取反,直接尋址位取反后用作源操作數(shù),但不改變直接尋址位原來的值。例如指令:ANLC,/ACC.0執(zhí)行前ACC.0為0,C為1,則指令執(zhí)行后C為1,而ACC.0仍為0。3.位變量邏輯與指令67

4.位變量邏輯或指令ORLC,bitORLC,/bit這組指令的功能是:如果源位的布爾值是邏輯1,則將進(jìn)位標(biāo)志置“1”;否則,進(jìn)位標(biāo)志保持不變,不影響其它標(biāo)志。4.位變量邏輯或指令685.位變量條件轉(zhuǎn)移指令JCrel;若(Cy)=1,則轉(zhuǎn)移PC←(PC)+2+relJNCrel;若(Cy)=0,則轉(zhuǎn)移PC←(PC)+2+relJBbit,rel;若(bit)=1,則轉(zhuǎn)移PC←(PC)+3+relJNBbit,rel;若(bit)=0,則轉(zhuǎn)移PC←(PC)+3+relJBCbit,rel;若(bit)=1,則轉(zhuǎn)移PC←(PC)+3+rel,并bit←05.位變量條件轉(zhuǎn)移指令69第3章MCS-51單片機指令系統(tǒng)3.1尋址方式3.2指令系統(tǒng)第3章MCS-51單片機指令系統(tǒng)3.1尋址方式701.單字節(jié)指令單字節(jié)指令格式由8位二進(jìn)制編碼表示,例如:CLRA→E4H

2.雙字節(jié)指令雙字節(jié)指令格式由兩個字節(jié)組成,操作碼和操作數(shù),例如: MOVA,#10H→74H10H3.三字節(jié)指令三字節(jié)指令格式中,第一個字節(jié)為操作碼,后兩個字節(jié)為操作數(shù),例如: MOV40H,#30H→75H40H30H1.單字節(jié)指令71一條匯編語言指令中最多包含4個區(qū)段,如下所示:[標(biāo)號:]操作碼[操作數(shù)][;注釋]4個區(qū)段之間要用分隔符分開:標(biāo)號與操作碼之間用“:”隔開,操作碼與操作數(shù)之間用空格隔開,操作數(shù)與注釋之間用“;”隔開,如果操作數(shù)有兩個以上,則在操作數(shù)之間要用逗號“,”隔開(乘法指令和除法指令除外)。一條匯編語言指令中最多包含4個區(qū)段,如723.1尋址方式所謂尋址方式,就是尋找操作數(shù)地址的方式,在用匯編語言編程時,數(shù)據(jù)的存放、傳送、運算都要通過指令來完成。編程者必須自始至終都要十分清楚操作數(shù)的位置,以及如何將它們傳送到適當(dāng)?shù)募拇嫫魅⑴c運算。每一種計算機都具有多種尋址方式。尋址方式的多少是反映指令系統(tǒng)優(yōu)劣的主要指標(biāo)之一。3.1尋址方式所謂尋址方式,就是尋找操73在MCS-51單片機指令系統(tǒng)中,有以下7種尋址方式:(1)立即尋址;(2)直接尋址;(3)寄存器尋址;(4)寄存器間接尋址;(5)基址寄存器加變址寄存器間接尋址;(6)相對尋址;(7)位尋址。在MCS-51單片機指令系統(tǒng)中,有以下741.立即尋址立即尋址方式是指操作數(shù)包含在指令字節(jié)中。跟在指令操作碼后面的數(shù)就是參加運算的數(shù),該操作數(shù)稱為立即數(shù)。立即數(shù)有一字節(jié)和二字節(jié)兩種可能,例如指令:MOVA,#3AHMOVDPTR,#0DFFFH上述兩條指令均為立即尋址方式,第一條指令的功能是將立即數(shù)3AH送累加器A中,第二條指令的功能是將立即數(shù)0DFFFH送數(shù)據(jù)指針DPTR中(0DFH→DPH,0FFH→DPL)。1.立即尋址752.直接尋址在指令中直接給出操作數(shù)的地址,這種尋址方式就屬于直接尋址方式。在這種方式中,指令的操作數(shù)部分直接是操作數(shù)的地址。在MCS-51單片機指令系統(tǒng)中,直接尋址方式中可以訪問3種存儲器空間:(1)內(nèi)部數(shù)據(jù)存儲器的低128個字節(jié)單元(00H~7FH)。(2)特殊功能寄存器。特殊功能寄存器只能用直接尋址方式進(jìn)行訪問。(3)位地址空間。2.直接尋址76

3.寄存器尋址在該尋址方式中,參加操作的數(shù)存放在寄存器里。寄存器包括8個工作寄存器R0~R7,累加器A,寄存器B、數(shù)據(jù)指針DPTR和布爾處理器的位累加器C。3.寄存器尋址774.寄存器間接尋址在這種尋址方式中,寄存器的內(nèi)容為操作數(shù)的地址。寄存器間接尋址只能使用寄存器R0、R1作為地址指針,尋址內(nèi)部RAM區(qū)的數(shù)據(jù);當(dāng)訪問外部RAM時,可使用R0、R1及DPTR作為地址指針。寄存器間接尋址符號為“@”,例如:4.寄存器間接尋址785.基址寄存器加變址寄存器間接尋址這種尋址方式用于訪問程序存儲器中的數(shù)據(jù)表格,它以基址寄存器DPTR或PC的內(nèi)容為基本地址,加上變址寄存器A的內(nèi)容作為操作數(shù)的地址,例如:MOVCA,@DPTR+AJMP@A+DPTRMOVCA,@PC+A5.基址寄存器加變址寄存器間接尋址796.相對尋址在MCS-51指令系統(tǒng)中設(shè)有轉(zhuǎn)移指令,分為直接轉(zhuǎn)移和相對轉(zhuǎn)移指令,在相對轉(zhuǎn)移指令中采用相對尋址方式。這種尋址方式是以PC的內(nèi)容為基本地址,加上指令中給定的偏移量作為轉(zhuǎn)移地址。指令中給出的偏移量是一個8位帶符號的常數(shù),可正可負(fù),其范圍為-128~+127。7.位尋址該種尋址方式中,操作數(shù)是內(nèi)部RAM單元中某一位的信息。6.相對尋址803.2指令系統(tǒng)3.2.1指令分類按指令的功能,MCS-51指令系統(tǒng)可分為下列5類:(1)數(shù)據(jù)傳送;(2)算術(shù)運算;(3)邏輯運算;(4)位操作;(5)控制轉(zhuǎn)移。3.2指令系統(tǒng)3.2.1指令分類按指令的功能,M81Rn——當(dāng)前選定的寄存器區(qū)中的8個工作寄存器R0~R7,即n=0~7。Ri——當(dāng)前選定的寄存器區(qū)中的2個寄存器R0、R1,i=0、1。direct——8位內(nèi)部RAM單元的地址,它可以是一個內(nèi)部數(shù)據(jù)區(qū)RAM單元(00H~7FH)或特殊功能寄存器地址(I/O端口、控制寄存器、狀態(tài)寄存器80H~0FFH)。#data——指令中的8位常數(shù)。#data16——指令中的16位常數(shù)。addr16——16位的目的地址,用于LJMP#,LCALL指令,可指向64KB程序存儲器地址空間。Rn——當(dāng)前選定的寄存器區(qū)中的8個工作寄82addr11——11位的目的地址,用于AJMP,ACALL指令。目的地址必須與下一條指令的第一個字節(jié)在同一個2KB程序存儲器地址空間之內(nèi)。rel——8位帶符號的偏移量字節(jié),用于SJMP和所有條件轉(zhuǎn)移指令中。偏移量相對于下一條指令的第一個字節(jié)計算,在-128~+127范圍內(nèi)取值。bit——內(nèi)部數(shù)據(jù)RAM或特殊功能寄存器中的可直接尋址位。DPTR——數(shù)據(jù)指針,可用作16位的地址寄存器。addr11——11位的目的地址,用于AJM83A——累加器。B——寄存器,用于MUL和DIV指令中。C——進(jìn)位標(biāo)志或進(jìn)位位。@——間接尋址寄存器或基址寄存器的前綴,如@Ri,@DPTR。/——位操作數(shù)的前綴,表示對該位取反。(X)——X中的內(nèi)容。((X))——由X尋址的單元中的內(nèi)容?!^左邊的內(nèi)容被箭頭右邊的內(nèi)容所代替。A——累加器。843.2.2數(shù)據(jù)傳送類指令圖3–1MCS-51傳送指令示意圖3.2.2數(shù)據(jù)傳送類指令圖3–1MCS-51傳85表3.1數(shù)據(jù)傳送類指令一覽表表3.1數(shù)據(jù)傳送類指令一覽表86表3.1數(shù)據(jù)傳送類指令一覽表表3.1數(shù)據(jù)傳送類指令一覽表871.數(shù)據(jù)傳送到累加器A的指令MOVA,R0MOVA,directMOVA,@RiMOVA,#data這組指令的功能是:把源操作數(shù)的內(nèi)容送入累加器A。例如:MOVA,#10H,該指令執(zhí)行時將立即數(shù)10H送入累加器A中。1.數(shù)據(jù)傳送到累加器A的指令882.數(shù)據(jù)傳送到工作寄存器Rn的指令MOVRn,AMOVRn,directMOVRn,#data這組指令的功能是:把源操作數(shù)的內(nèi)容送入當(dāng)前工作寄存器區(qū)的R0~R7中的某一個寄存器。指令中Rn在內(nèi)部數(shù)據(jù)存儲器中的地址由當(dāng)前的工作寄存器區(qū)選擇位RS1、RS0確定,可以是00H~07H、08H~0FH、10H~17H、18H~1FH。例如:MOVR0,A,若當(dāng)前RS1、RS0設(shè)置為00(即工作寄存器0區(qū)),執(zhí)行該指令時,將累加器A中的數(shù)據(jù)傳送至工作寄存器R0(內(nèi)部RAM00H)單元中。2.數(shù)據(jù)傳送到工作寄存器Rn的指令893.數(shù)據(jù)傳送到內(nèi)部RAM單元或特殊功能寄存器SFR的指令MOVdirect,AMOVdirect,RnMOVdirect,directMOVdirect,@RiMOVdirect,#dataMOV@Ri,AMOV@Ri,directMOV@Ri,#dataMOVDPTR,#data163.數(shù)據(jù)傳送到內(nèi)部RAM單元或特殊功能寄存器SFR的指令90這組指令的功能是:把源操作數(shù)的內(nèi)容送入內(nèi)部RAM單元或特殊功能寄存器。其中第三條指令和最后一條指令都是三字節(jié)指令。第三條指令的功能很強,能實現(xiàn)內(nèi)部RAM之間、特殊功能寄存器之間或特殊功能寄存器與內(nèi)部RAM之間的直接數(shù)據(jù)傳送。最后一條指令是將16位的立即數(shù)送入數(shù)據(jù)指針寄存器DPTR。這組指令的功能是:把源操作數(shù)的內(nèi)容送入內(nèi)部R914.累加器A與外部數(shù)據(jù)存儲器之間的傳送指令MOVXA,@DPTRMOVXA,@RiMOVX@DPTR,AMOVX@Ri,A4.累加器A與外部數(shù)據(jù)存儲器之間的傳送指令92這組指令是:在累加器A與外部數(shù)據(jù)存儲器RAM單元或I/O口之間進(jìn)行數(shù)據(jù)傳送,前兩條指令執(zhí)行時,P3.7引腳上輸出RD有效信號,用作外部數(shù)據(jù)存儲器的讀選通信號;后兩條指令執(zhí)行時,P3.6引腳上輸出WR有效信號,用作外部數(shù)據(jù)存儲器的寫選通信號。DPTR所包含的16位地址信息由P0(低8位)和P2(高8位)輸出,而數(shù)據(jù)信息由P0口傳送,P0口作分時復(fù)用的總線。由Ri作為間接尋址寄存器時,P0口上分時輸出Ri指定的8位地址信息及傳輸8位數(shù)據(jù)。這組指令是:在累加器A與外部數(shù)據(jù)存儲器RAM935.堆棧操作指令PUSHdirectPOPdirect在MCS-51單片機的內(nèi)部RAM中,可以設(shè)定一個先進(jìn)后出的區(qū)域,稱其為堆棧。在特殊功能寄存器中有一個堆棧指針SP,它指出棧頂?shù)奈恢谩_M(jìn)棧指令的功能是:首先將堆棧指針SP的內(nèi)容加1,然后將直接地址所指出的內(nèi)容送入SP指出的內(nèi)部RAM單元;出棧指令的功能是:將SP所指出的內(nèi)部RAM單元的內(nèi)容送入由直接地址所指出的字節(jié)單元,接著將堆棧指針SP的內(nèi)容減1。5.堆棧操作指令94例如:進(jìn)入中斷服務(wù)子程序時,把程序狀態(tài)寄存器PSW、累加器A、數(shù)據(jù)指針DPTR進(jìn)棧保護。設(shè)當(dāng)前SP為60H。則程序段PUSHPSWPUSHACCPUSHDPLPUSHDPH執(zhí)行后,SP內(nèi)容修改為64H,而61H、62H、63H、64H單元中依次棧入PSW、A、DPL、DPH的內(nèi)容。當(dāng)中斷服務(wù)程序結(jié)束之前,如下程序段(SP保持64H不變)例如:進(jìn)入中斷服務(wù)子程序時,把程序狀態(tài)寄95POPDPHPOPDPLPOPACCPOPPSW執(zhí)行之后,SP內(nèi)容修改為60H,而64H、63H、62H、61H單元中的內(nèi)容依次彈出到DPH、DPL、A、PSW中。MCS-51提供一個向上升的堆棧,因此SP設(shè)置初值時要充分考慮堆棧的深度,要留出適當(dāng)?shù)膯卧臻g,滿足堆棧的使用。POPDPH966.程序存儲器內(nèi)容送累加器MOVCA,@A+PCMOVCA,@A+DPTR這是兩條很有用的查表指令,可用來查找存放在外部程序存儲器中的常數(shù)表格。第一條指令是以PC作為基址寄存器,A的內(nèi)容作為無符號數(shù)和PC的內(nèi)容(下一條指令的起始地址)相加后得到一個16位的地址,并將該地址指出的程序存儲器單元的內(nèi)容送到累加器A。這條指令的優(yōu)點是不改變特殊功能寄存器和PC的狀態(tài),只要根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點是表格只能放在該條查表指令后面的256個單元之中,表格的大小受到限制,而且表格只能被一段程序所利用。6.程序存儲器內(nèi)容送累加器97第二條指令是以DPTR作為基址寄存器,累加器A的內(nèi)容作為無符號數(shù)與DPTR內(nèi)容相加,得到一個16位的地址,并把該地址指出的程序存儲器單元的內(nèi)容送到累加器A。這條指令的執(zhí)行結(jié)果只與指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址無關(guān),因此,表格的大小和位置可以在64KB程序存儲器中任意安排,并且一個表格可以為各個程序塊所共用。第二條指令是以DPTR作為基址寄存器,累加器98

7.字節(jié)交換指令XCHA,RnXCHA,@RiXCHA,directXCHDA,@RiSWAPA前三條指令是將累加器A的內(nèi)容和源操作數(shù)內(nèi)容相互交換;后兩條指令是半字節(jié)交換指令,最后一條指令是將累加器A的高4位與低4位之間進(jìn)行交換,而另外一條指令是將累加器A的低4位內(nèi)容和(Ri)所指出的內(nèi)部RAM單元的低4位內(nèi)容相互交換。7.字節(jié)交換指令993.2.3算術(shù)運算類指令表3.2算術(shù)運算指令3.2.3算術(shù)運算類指令表3.2算術(shù)運算指令100表3.2算術(shù)運算指令表3.2算術(shù)運算指令101表3.3影響標(biāo)志位的指令表3.3影響標(biāo)志位的指令102表3.3影響標(biāo)志位的指令表3.3影響標(biāo)志位的指令103一、加法指令1.普通加法指令A(yù)DDA,RnADDA,directADDA,@RiADDA,#data一、加法指令1.普通加法指令104例如:120和100之和為220,顯然大于127,相加時011110001200110010010011011100220+符號位(最高位)由0變1,兩個正數(shù)相加結(jié)果變負(fù),實際上它是和數(shù)的最高位,符號位移入了進(jìn)位標(biāo)志,此時位6有進(jìn)位而位7無進(jìn)位,置位溢出標(biāo)志OV,結(jié)果溢出。例如:120和100之和為220,顯然大于12105同樣,-120和-100相加,結(jié)果應(yīng)為-220,顯然小于-128,相加時10001000-12010011100-100+100100100-220符號位由1變?yōu)?,兩個負(fù)數(shù)相加結(jié)果變?yōu)檎龜?shù),這是因為符號位移入進(jìn)位標(biāo)志,位6無進(jìn)位而位7有進(jìn)位,置位溢出標(biāo)志OV,由此可判斷結(jié)果溢出。同樣,-120和-100相加,結(jié)果應(yīng)為1062.帶進(jìn)位加法指令A(yù)DDCA,RnADDCA,directADDCA,@RiADDCA,#data這組指令的功能與普通加法指令類似,唯一的不同之處是,在執(zhí)行加法時,還要將上一次進(jìn)位標(biāo)志Cy的內(nèi)容也一起加進(jìn)去,對于標(biāo)志位的影響也與普通加法指令相同。2.帶進(jìn)位加法指令107

3.增量指令I(lǐng)NCAINCRnINCdirectINC@RiINCDPTR這組指令的功能是:將指令中所指出操作數(shù)的內(nèi)容加1。若原來的內(nèi)容為0FFH,則加1后將產(chǎn)生溢出,使操作數(shù)的內(nèi)容變成00H,但不影響任何標(biāo)志。最后一條指令是對16位的數(shù)據(jù)指針寄存器DPTR執(zhí)行加1操作,指令執(zhí)行時,先對低8位指針DPL的內(nèi)容加1,當(dāng)產(chǎn)生溢出時就對高8位指針DPH加1,但不影響任何標(biāo)志。3.增量指令1084.十進(jìn)制調(diào)整指令DAA這條指令對累加器A參與的BCD碼加法運算所獲得的8位結(jié)果進(jìn)行十進(jìn)制調(diào)整,使累加器A中的內(nèi)容調(diào)整為二位壓縮型BCD碼的數(shù)。使用時必須注意,它只能跟在加法指令之后,不能對減法指令的結(jié)果進(jìn)行調(diào)整,且其結(jié)果不影響溢出標(biāo)志位。執(zhí)行該指令時,判斷A中的低4位是否大于9和輔助進(jìn)位標(biāo)志AC是否為“1”,若兩者有一個條件滿足,則低4位加6操作;同樣,A中的高4位大于9或進(jìn)位標(biāo)志Cy為“1”兩者有一個條件滿足時,高4位加6操作。例如:有兩個BCD數(shù)36與45相加,結(jié)果應(yīng)為BCD碼81,程序如下:4.十進(jìn)制調(diào)整指令109MOVA,#36HADDA,#45HDAA這段程序中,第一條指令將立即數(shù)36H(BCD碼36)送入累加器A;第二條指令進(jìn)行如下加法:00110110360100010145011110117B0000011006++1000000181得結(jié)果7BH;第三條指令對累加器A進(jìn)行十進(jìn)制調(diào)整,低4位(為0BH)大于9,因此要加6,得調(diào)整的BCD碼81。MOVA,#36H這段程序中,第一110二、減法指令1.帶進(jìn)位減法指令SUBBA,RnSUBBA,directSUBBA,@RiSUBBA,#data這組指令的功能是:將累加器A的內(nèi)容與第二操作數(shù)及進(jìn)位標(biāo)志相減,結(jié)果送回到累加器A中。在執(zhí)行減法過程中,如果位7(D7)有借位,則進(jìn)位標(biāo)志Cy置“1”,否則清“0”;如果位3(D3)有借位,則輔助進(jìn)位標(biāo)志AC置“1”,否則清“0”;如位6有借位而位7沒有借位,或位7有借位而位6沒有借位,則溢出標(biāo)志OV置“1”,否則清“0”。若要進(jìn)行不帶借位的減法操作,則必須先將Cy清“0”。二、減法指令111

2.減1指令DECADECRnDECdirectDEC@Ri這組指令的功能是:將指出的操作數(shù)內(nèi)容減1。如果原來的操作數(shù)為00H,則減1后將產(chǎn)生下溢出,使操作數(shù)變成0FFH,但不影響任何標(biāo)志。2.減1指令112三、乘法指令乘法指令完成單字節(jié)的乘法,只有一條指令:MULAB這條指令的功能是:將累加器A的內(nèi)容與寄存器B的內(nèi)容相乘,乘積的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘積超過0FFH,則溢出標(biāo)志OV置“1”,否則清“0”。進(jìn)位標(biāo)志Cy總是被清“0”。三、乘法指令113

四、除法指令除法指令完成單字節(jié)的除法,只有一條指令:DIVAB這條指令的功能是:將累加器A中的內(nèi)容除以寄存器B中的8位無符號整數(shù),所得商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中,清“0”進(jìn)位標(biāo)志Cy和溢出標(biāo)志OV。若原來B中的內(nèi)容為0,則執(zhí)行該指令后A與B中的內(nèi)容不定,并將溢出標(biāo)志OV置“1”,在任何情況下,進(jìn)位標(biāo)志Cy總是被清“0”。四、除法指令1143.2.4邏輯運算類指令表3.4邏輯運算指令3.2.4邏輯運算類指令表3.4邏輯運算指令115

一、簡單邏輯操作指令CLRA;對累加器A清“0”CPLA;對累加器A按位取反RLA;累加器A的內(nèi)容向左環(huán)移1位RLCA;累加器A的內(nèi)容帶進(jìn)位標(biāo)志位向左環(huán)移1位RRA;累加器A的內(nèi)容向右環(huán)移1位RRCA;累加器A的內(nèi)容帶進(jìn)位標(biāo)志位向右環(huán)移1位這組指令的功能是:對累加器A的內(nèi)容進(jìn)行簡單的邏輯操作。除了帶進(jìn)位標(biāo)志位的移位指令外,其它都不影響Cy,AC,OV等標(biāo)志。一、簡單邏輯操作指令116二、邏輯與指令A(yù)NLA,RnANLA,directANLA,@RiANLA,#dataANLdirect,AANLdirect,#data這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯與操作,并將結(jié)果送回目的操作數(shù)的單元中。二、邏輯與指令117三、邏輯或指令ORLA,RnORLA,directORLA,@RiORLA,#dataORLdirect,AORLdirect,#data這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯或操作,并將結(jié)果送回目的操作數(shù)的單元中。三、邏輯或指令118四、邏輯異或指令XRLA,RnXRLA,directXRLA,@RiXRLA,#dataXRLdirect,AXRLdirect,#data這組指令的功能是:將兩個操作數(shù)的內(nèi)容按位進(jìn)行邏輯異或操作,并將結(jié)果送回到目的操作數(shù)的單元中。四、邏輯異或指令1193.2.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令共有17條,不包括按布爾變量控制程序轉(zhuǎn)移指令(見表3.5)。其中有64KB范圍內(nèi)的長調(diào)用、長轉(zhuǎn)移指令;有2KB范圍內(nèi)的絕對調(diào)用和絕對轉(zhuǎn)移指令;有全空間的長相對轉(zhuǎn)移及一頁范圍內(nèi)的短相對轉(zhuǎn)移指令;還有多種條件轉(zhuǎn)移指令。由于MCS-51提供了較豐富的控制轉(zhuǎn)移指令,因此在編程上相當(dāng)靈活方便。這類指令用到的助記符共有10種:AJMP、LJMP、SJMP、JMP、ACALL、LCALL、JZ、JNZ、CJNE、DJNZ。3.2.5控制轉(zhuǎn)移指令120表3.5控制轉(zhuǎn)移指令表3.5控制轉(zhuǎn)移指令121一、無條件轉(zhuǎn)移指令1.短跳轉(zhuǎn)指令A(yù)JMPaddr11這是2KB范圍內(nèi)的無條件跳轉(zhuǎn)指令,執(zhí)行該指令時,先將PC+2,然后將addr11送入PC10~PC0,而PC15~PC11保持不變。這樣得到跳轉(zhuǎn)的目的地址。需要注意的是,目標(biāo)地址與AJMP后面一條指令的第一個字節(jié)必須在同一個2KB區(qū)域的存儲器區(qū)內(nèi)。一、無條件轉(zhuǎn)移指令1.短跳轉(zhuǎn)指令122

2.相對轉(zhuǎn)移指令SJMPrel執(zhí)行該指令時,先將PC+2,再把指令中帶符號的偏移量加到PC上,得到跳轉(zhuǎn)的目標(biāo)地址送入PC。3.長跳轉(zhuǎn)指令LJMPaddr16執(zhí)行該指令時,將16位目標(biāo)地址addr16裝入PC,程序無條件轉(zhuǎn)向指定的目標(biāo)地址。轉(zhuǎn)移的目標(biāo)地址可以在64KB程序存儲器地址空間的任何地方,不影響任何標(biāo)志。2.相對轉(zhuǎn)移指令1234.散轉(zhuǎn)指令JMP@A+DPTR執(zhí)行該指令時,把累加器A中的8位無符號數(shù)與數(shù)據(jù)指針中的16位數(shù)相加,結(jié)果作為下條指令的地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR的內(nèi)容,也不影響標(biāo)志。利用這條指令能實現(xiàn)程序的散轉(zhuǎn)。4.散轉(zhuǎn)指令124二、條件轉(zhuǎn)移指令JZrel;(A)=0轉(zhuǎn)移JNZrel;(A)≠0轉(zhuǎn)移這類指令是依據(jù)累加器A的內(nèi)容是否為0的條件轉(zhuǎn)移指令。條件滿足時轉(zhuǎn)移(相當(dāng)于一條相對轉(zhuǎn)移指令),條件不滿

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論