單片機(jī)原理與應(yīng)用(陳桂友)第4章指令系統(tǒng).ppt
《單片機(jī)原理與應(yīng)用(陳桂友)第4章指令系統(tǒng).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《單片機(jī)原理與應(yīng)用(陳桂友)第4章指令系統(tǒng).ppt(80頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第4章指令系統(tǒng),4.18051單片機(jī)的助記符語言,4.2指令格式及分類,4.3尋址方式,4.4數(shù)據(jù)傳送類指令,4.6算術(shù)運(yùn)算類指令,4.5邏輯操作類指令,4.7位操作指令,4.8控制轉(zhuǎn)移類指令,4.18051單片機(jī)的助記符語言,高級(jí)語言編程簡(jiǎn)單,執(zhí)行效率低,常用在計(jì)算和管理的場(chǎng)合。匯編語言(助記符語言)編程繁瑣,執(zhí)行效率高,宜用于需要結(jié)構(gòu)緊湊、反應(yīng)快速的實(shí)時(shí)控制場(chǎng)合。助記符一般是由操作碼和操作數(shù)兩部分組成的。操作碼反映了指令的功能,操作數(shù)代表了指令的操作對(duì)象。例如,ADDA,#6AH;A←A+#6AH其中ADD是操作碼符號(hào)。A和6AH是操作數(shù)。前者反映了該指令的功能是做加法,后者則表示相加的對(duì)象是A累加器中的內(nèi)容和立即數(shù)6AH。由助記符構(gòu)成的編程語言一般稱為匯編語言。目前大多數(shù)單片機(jī)的編譯系統(tǒng)都支持C語言編程,并可以對(duì)編譯的代碼進(jìn)行優(yōu)化。使用C語言編程,具有編寫簡(jiǎn)單、直觀易讀、通用性好等特點(diǎn),特別是控制任務(wù)比較復(fù)雜或者具有大量運(yùn)算的系統(tǒng)中,C語言更顯示出了超越匯編語言的優(yōu)勢(shì)。然而,匯編語言是理解和掌握單片機(jī)原理及應(yīng)用的基礎(chǔ),并且,在控制系統(tǒng)不太復(fù)雜、實(shí)時(shí)性要求較高的控制系統(tǒng)中,較多的用戶還是使用匯編語言進(jìn)行程序設(shè)計(jì)。,4.1.1概述,4.1.2操作碼,操作碼是指令功能的英文縮寫。,4.1.3操作數(shù),操作數(shù)是一條指令操作的對(duì)象。不同功能的指令,操作對(duì)象形式不同。操作數(shù)可以是數(shù)據(jù),也可以是地址。操作數(shù)是指令中給出的數(shù)據(jù)時(shí),被稱為立即數(shù)。它有8位和16位二進(jìn)制數(shù)兩種。在助記符的數(shù)字前加以“#”來標(biāo)記其是立即數(shù),常用符號(hào)“#data”表示。操作數(shù)也可以是存放數(shù)據(jù)的地址,這些地址可以是:1.所選定寄存器工作區(qū)內(nèi)的R7~R0,A、B、C(位)、AB(雙字節(jié)),DPTR(雙字節(jié))等可編址的寄存器。2.內(nèi)部數(shù)據(jù)存儲(chǔ)器中低128字節(jié),專用寄存器SFR,可尋址的位。3.外部數(shù)據(jù)存儲(chǔ)器空間。4.程序存儲(chǔ)器空間。[注意]:編寫程序時(shí),操作數(shù)的最高位大于9時(shí),在操作數(shù)的最高位前要加寫0。否則,編譯會(huì)提示出錯(cuò)。例如:MOVA,#0F8H是正確的,而MOVA,#F8H是不正確的。,4.2指令格式及分類,用助記符來描述機(jī)器指令的語言稱為符號(hào)語言或匯編語言,匯編語言是一種面向機(jī)器的程序設(shè)計(jì)語言。其規(guī)定的格式如下:[標(biāo)號(hào):]操作碼助記符[第一操作數(shù)][,第二操作數(shù)][,第三操作數(shù)][;注釋]標(biāo)號(hào)是表示該指令所在的符號(hào)地址,一般是由字母開頭的字符串組成。例如:ABCQ3PATD678均為標(biāo)號(hào)的允許格式5AC-PTR+A等均為標(biāo)號(hào)不允許的格式操作碼助記符表示了指令的功能。第一操作數(shù)、第二操作數(shù)都表示操作的對(duì)象,這些是指令的核心部分。指令操作碼部分是必不可少的。操作數(shù)段有的指令可以沒有,或者只有一個(gè)操作數(shù),例如:RETI;中斷返回,無操作數(shù)CPLA;累加器逐位取反,只有一個(gè)操作數(shù)。注釋字段是為方便用戶閱讀程序所加注的說明。,4.2.1匯編語言,4.2.2指令代碼格式,指令代碼是指令的二進(jìn)制表示方法,是指令在存儲(chǔ)器中存放的形式。匯編語言只有經(jīng)“編輯/匯編”程序翻譯成機(jī)器語言,才能被執(zhí)行。8051單片機(jī)指令系統(tǒng)中的指令字長(zhǎng)有單字節(jié)、雙字節(jié)、三字節(jié)三種。指令字節(jié)數(shù)越多,所占用內(nèi)存單元越多。但是指令執(zhí)行時(shí)間長(zhǎng)短并不和所占用字節(jié)數(shù)的多少成比例。例如乘法為單字節(jié)指令,但是所需的指令執(zhí)行時(shí)間卻最長(zhǎng)。單字節(jié)指令:操作碼例:RET;機(jī)器代碼:22H雙字節(jié)指令:操作碼操作數(shù)例:MOVA,#0FH;機(jī)器代碼:740FH三字節(jié)指令:操作碼第一操作數(shù)第二操作數(shù)例:MOV74H,#0BH;機(jī)器代碼:75740BH,4.2.3指令中的符號(hào)約定,4.3尋址方式,指令中的源操作數(shù)是立即數(shù),叫做立即尋址。立即數(shù)的類型可以是:二進(jìn)制(B)、十進(jìn)制、十六進(jìn)制(H)、整數(shù)、序數(shù)或者字符。立即數(shù)的字長(zhǎng)可以是8位或16位。例如:MOVA,#61H這條指令是把61H這個(gè)數(shù)據(jù)送入到累加器A中。例如:MOVDPTR,#2050H這條指令是把2050H這個(gè)數(shù)據(jù)送入到數(shù)據(jù)指針DPTR中。,1.立即尋址,,操作數(shù)是指令的重要組成部分,它指定了參與運(yùn)算的數(shù)或數(shù)所在單元地址,而如何得到這個(gè)地址就稱為尋址方式。一般來說,尋址方式越多,計(jì)算機(jī)功能越強(qiáng),靈活性越大。所以尋址方式對(duì)機(jī)器的性能有重大影響。8051單片機(jī)共有7種尋址方式,描述如下:,2.直接尋址,直接尋址就是在指令中包含了操作數(shù)的地址,該地址直接給出了參加運(yùn)算或傳送的單元或位。它可訪問三種地址空間:(1)特殊功能寄存器SFR:直接尋址是唯一的訪問形式(2)內(nèi)部數(shù)據(jù)RAM中的00H~7FH的128個(gè)字節(jié)單元(3)位地址空間例如:MOVA,60H;把60H單元內(nèi)容送入累加器A中。,,,3.寄存器尋址,指定某一可尋址的寄存器的內(nèi)容為操作數(shù),對(duì)寄存器ACC,B,DPTR和CY(進(jìn)位標(biāo)志,也是布爾處理機(jī)的累加器),其尋址時(shí)具體的寄存器已隱含在其操作碼中。而對(duì)選定的8個(gè)工作寄存器R7~R0,則用指令操作碼的低3位指明所用的寄存器。在應(yīng)用中,可以先通過PSW中的RS1、RS0兩位來選擇寄存器組,再用操作碼中低3位來確定是組內(nèi)哪一個(gè)寄存器,達(dá)到尋址的目的。例如:INCR5;把寄存器R3的內(nèi)容加1后再送回R5,,4.寄存器間接尋址,指令指定某一寄存器的內(nèi)容作為操作數(shù)地址。8051中可用來間接尋址的寄存器有:選定工作寄存器區(qū)的R0、R1,16位的數(shù)據(jù)指針DPTR,使用時(shí)前面加@表示間接尋址。例如:MOVA,@R0;將R0中的內(nèi)容所表示的地址單元中的內(nèi)容送給AMOVX@DPTP,A,,,5.變址尋址,由指令指定的偏移量寄存器和變址寄存器DPTR或PC相加所得結(jié)果作為操作數(shù)地址。例如:MOVCA,@A+PC其中A作為偏移量寄存器,PC作為變址寄存器,A中內(nèi)容為無符號(hào)數(shù)和PC相加,從而得到其真正的操作數(shù)地址。,6.相對(duì)尋址,把指令中給定的地址偏移量與本指令所在單元地址(即程序計(jì)數(shù)器PC中的內(nèi)容)相加,即得到真正的程序轉(zhuǎn)移地址。與變址方式不同。該偏移量有正、負(fù)號(hào),在該機(jī)器指令中必須以補(bǔ)碼形式給出,所轉(zhuǎn)移的范圍為相對(duì)于當(dāng)前PC值的-128~+127之間。例如:JC80H若C=0,則PC值不變,若進(jìn)位C=1,則以現(xiàn)行的PC為基地址加上80H得到轉(zhuǎn)向地址。,,7.位尋址,支持位單元存取操作是8051單片機(jī)的一個(gè)主要特點(diǎn)。位操作指令能對(duì)位地址空間的每一位都可進(jìn)行運(yùn)算和傳送操作。例如:MOVC,P1.0;將P1.0的狀態(tài)傳送到CSETB20.6H;將20H單元的第6位置為1MOVA,50H;50H是字節(jié)地址MOVC,50H;50H是位地址MOV60H,50H;50H是字節(jié)地址,4.4數(shù)據(jù)傳送類指令,,數(shù)據(jù)傳送類指令是使用頻率最高的一類指令。主要用來給8051系統(tǒng)的內(nèi)部和外部資源賦值,進(jìn)行堆棧的存取操作等。數(shù)據(jù)傳送類指令執(zhí)行前后,對(duì)程序狀態(tài)字PSW不產(chǎn)生影響。按其操作方式,又可把它們分為三種:數(shù)據(jù)傳送數(shù)據(jù)交換棧操作,4.4.1數(shù)據(jù)傳送指令,格式:MOV,功能:把第二操作數(shù)指定的字節(jié)變量傳送到由第一操作數(shù)指定的單元中,不影響源字節(jié),不影響任何別的寄存器或標(biāo)志。這是最靈活的操作,允許15種源和目的尋址方式組合。,一、通用傳送指令——MOV,,1.立即數(shù)送累加器A和內(nèi)部數(shù)據(jù)存儲(chǔ)器(Rn,內(nèi)部RAM,SFR)共有4條指令:MOVA,#data;(A)←#dataMOVdirect,#data;(direct)←#dataMOV@Ri,#data;((Ri))←#dataMOVRn,#data;(Rn)←#data@符號(hào)表示間接尋址,((Ri))表示把立即數(shù)送到由Ri寄存器的內(nèi)容所指出的那個(gè)RAM單元中去。Ri中i=0或i=1。例1MOV@R0,#56HMOV@R1,#59H假設(shè)R0的內(nèi)容為20H,則執(zhí)行上述第一條指令后,立即數(shù)56H將送入內(nèi)部數(shù)據(jù)RAM字節(jié)地址為20H的單元中。例2MOVR0,#79H;將立即數(shù)79H送到R0中MOVR1,#15H;將立即數(shù)15H送到R1中例3利用直接尋址可把立即數(shù)送入內(nèi)部數(shù)據(jù)RAM任意單元或SFR中任一特殊功能寄存器,如例1用間接尋址給內(nèi)部RAM20H單元送立即數(shù)56H,需兩條指令:MOVR0,#20HMOV@R0,#56H用直接尋址只用一條指令:MOV20H,#56H而指令MOVP1,#80H則可把立即數(shù)80H直接送入P1(字節(jié)地址為90H)口中。,,2.內(nèi)部數(shù)據(jù)存儲(chǔ)器(Rn,內(nèi)部RAM,SFR)與累加器A傳送數(shù)據(jù)共有6條指令:MOVA,direct;(A)←(direct)MOVA,@Ri;(A)←((Ri))MOVA,Rn;(A)←(Rn)MOVdirect,A;(direct)←(A)MOV@Ri,A;((Ri))←(A)MOVRn,A;(Rn)←(A)間接尋址@Ri是以Ri的內(nèi)容作為地址,由于Ri為八位寄存器,尋址范圍為0~255。但由于特殊功能寄存器SFR只能被直接尋址,而在SFR地址范圍(128~255)中很多單元又無定義,若對(duì)之讀寫,將得不到確定的值,寫入的數(shù)也將丟失。所以對(duì)內(nèi)部數(shù)據(jù)存儲(chǔ)器來說間接尋址的真正作用范圍實(shí)際上只有0~127個(gè)單元的內(nèi)部數(shù)據(jù)RAM地址。例4指令序列:MOVR1,#82HMOVA,@R1上述指令對(duì)于8051是不正確的,因?yàn)?2H是特殊功能寄存器DPL的地址值,對(duì)特殊功能寄存器來說,這種間接尋址方式無效。但是,對(duì)于8052單片機(jī)而言則是正確的,其功能是將內(nèi)部RAM的82H單元中的內(nèi)容送到A中。并且,對(duì)于8052的內(nèi)部80H~FFH的RAM單元,只能使用這種間接尋址方式進(jìn)行訪問。所以欲從DPL取數(shù)到累加器A,可用直接尋址方式:MOVA,82H,,3.內(nèi)部數(shù)據(jù)存儲(chǔ)器中Rn、SFR和內(nèi)部數(shù)據(jù)RAM之間的數(shù)據(jù)傳送,共有5條指令:MOVdirect,direct;(direct目)←(direct源)MOVdirect,@Ri;(direct)←((Ri))MOVdirect,Rn;(direct)←(Rn)MOV@Ri,direct;((Ri))←(direct)MOVRn,direct;(Rn)←(direct)該5條指令共有三種尋址方式:直接尋址,寄存器尋址,寄存器間接尋址。8位直接地址可尋址0~255個(gè)單元,對(duì)于8051單片機(jī)而言,則可直接尋址內(nèi)部RAM00H~7FH地址空間的單元和所有特殊功能寄存器,而對(duì)80H~0FFH地址中無定義的單元訪問是沒有意義的。例5指令MOVP3,P1可把P1口的內(nèi)容直接送到P3口輸出,而不必經(jīng)過累加器A“中轉(zhuǎn)”。例6若設(shè)PSW中標(biāo)志位RS1、RS0為“11”,則選中第三組工作寄存器區(qū),在這種情況下:MOVdirect,R0與MOVdirect,18H兩指令是等價(jià)的。例7用立即尋址指令可直接給內(nèi)部RAM中20H、25H和P1口上置數(shù):MOV20H,#25HMOV25H,#10HMOVP1,#0CAH執(zhí)行后使(20H)=25H,(25H)=10H,(P1)=0CAH。,,4.目標(biāo)地址傳送,只有一條指令:MOVDPTR,#data16功能:把16位常數(shù)裝入數(shù)據(jù)指針。例8指令MOVDPTR,#2003H表示把16位常數(shù)裝入數(shù)據(jù)指針。其中DPH=20H,DPL=03H。,二、外部數(shù)據(jù)存儲(chǔ)器(或擴(kuò)展I/O口)與累加器A傳送指令——MOVX,,MOVX指令主要用于累加器A和外部擴(kuò)充的RAM或擴(kuò)展I/O口進(jìn)行數(shù)據(jù)傳送。這種傳送只有一種尋址方式,就是寄存器間接尋址。用R1或R0以寄存器間接尋址方式能訪問外部數(shù)據(jù)存儲(chǔ)器(或擴(kuò)展I/O口)256個(gè)字節(jié)中的一個(gè)字節(jié),用16位的數(shù)據(jù)存儲(chǔ)器地址指針DPTR以寄存器間接尋址的方法能遍訪64K的外部數(shù)據(jù)存儲(chǔ)器(或擴(kuò)展的I/O口)的任何單元。指令格式:MOVX,MOVXA,@DPTR;(A)←((DPTR))MOVXA,@Ri;(A)←((Ri))MOVX@DPTR,A;((DPTR))←(A)MOVX@Ri,A;((Ri))←(A)例若外部數(shù)據(jù)存儲(chǔ)器單元中:(3007H)=(60H),(3008H)=(2FH)則執(zhí)行:MOVDPTR,#3007HMOVXA,@DPTR使累加器(A)=60H,三、程序存儲(chǔ)器向累加器A傳送指令——MOVC,,對(duì)于程序存儲(chǔ)器,8051單片機(jī)提供了兩條極其有用的查表指令。這兩條指令采用變址尋址,以PC或DPTR為基址寄存器,以累加器A為變址寄存器,基址寄存器與變址寄存器內(nèi)容相加即得到程序存儲(chǔ)器某單元的地址值,MOVC指令則把該存貯單元的內(nèi)容傳送到累加器A中。MOVCA,@A+PC;PC←(PC)+1(A)←((A)+(PC))MOVCA,@A+DPTR;(A)←((A)+(DPTR))功能:把累加器A中內(nèi)容與基址寄存器(PC、DPTR)內(nèi)容相加,求得程序存儲(chǔ)器某單元地址,再把該地址單元內(nèi)容送累加器A。指令執(zhí)行后不改變基址寄存器內(nèi)容,由于執(zhí)行16位加法,從低8位產(chǎn)生的進(jìn)位將傳送到高位去,不影響任何標(biāo)志。這兩條指令主要用于查表,即完成從程序存儲(chǔ)器讀取數(shù)據(jù)的功能。但由于兩條指令使用的基址寄存器不同,因此使用范圍也不同。,,MOVCA,@A+PC以PC作為基址寄存器,在CPU取完指令操作碼時(shí)PC會(huì)自動(dòng)加1,指向下一條指令的第一字節(jié)地址,所以這時(shí)作為基址寄存器的PC已不是原值,而是PC+1值。因?yàn)槔奂悠髦械膬?nèi)容為8位無符號(hào)整數(shù),這就使得本指令查表范圍只能在以PC當(dāng)前值開始后的256個(gè)字節(jié)范圍內(nèi),偏移量的計(jì)算公式如下:偏移量:DIS=表首地址-(該指令所在地址+1)例1若要根據(jù)累加器A的內(nèi)容找出由偽指令DB所定義的四個(gè)值中的一個(gè)??捎孟铝谐绦颍簆pqq:ADDA,#01Hppqq+2:MOVCA,@A+PCppqq+3:RETppqq+4:STAR:DB66HDB77HDB88HDB99H,,MOVCA,@A+DPTR指令基址寄存器為數(shù)據(jù)指針DPTR,表格常數(shù)可設(shè)置在64K程序存儲(chǔ)器的任何地址空間,而不必像MOVCA,@A+PC指令只設(shè)在PC值以下的256個(gè)單元中。其缺點(diǎn)是若DPTR已有它用,在賦表首地址之前必須保護(hù)現(xiàn)場(chǎng),執(zhí)行完查表后再予以恢復(fù)。例2試編制根據(jù)累加器A中的數(shù)(0~9之間)查其平方表的子程序。COUNT:PUSHDPH;保護(hù)DPTR內(nèi)容PUSHDPL;MOVDPTR,#TABLE;賦表首址→DPTRMOVCA,@A+DPTR;據(jù)A中內(nèi)容查表POPDPL;恢復(fù)DPTR原內(nèi)容POPDPHRET;返回主程序TABLE:DB00DB01DB04DB09DB16DB25DB36DB49DB64DB81,4.4.2數(shù)據(jù)交換指令,,1.字節(jié)交換指令XCHA,direct;(A)←→(direct)XCHA,@Ri;(A)←→((Ri))XCHA,Rn;(A)←→(Rn)上述指令把累加器A中內(nèi)容與第二操作數(shù)所指定的工作寄存器,間接尋址和直接尋址的某單元內(nèi)容互相交換。例設(shè)(R0)=20H,(A)=3FH,(20H)=75H,執(zhí)行指令XCHA,@R0將使(A)=75H,(20H)=3FH,實(shí)現(xiàn)了累加器A和內(nèi)部RAM20H單元內(nèi)容的互換。,,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)容為67H,內(nèi)部RAM中30H的內(nèi)容為84H,執(zhí)行指令XCHDA,@R1結(jié)果:(A)=64H,(30H)=87H,4.4.3棧操作指令,,PUSHdirect;(SP)←(SP)+1((SP))←(direct)POPdirect;(direct)←((SP))(SP)←(SP)-1堆棧中的數(shù)據(jù)是以“后進(jìn)先出”的結(jié)構(gòu)方式處理的,這種“后進(jìn)先出”的特點(diǎn)是由堆棧指針SP來控制的,SP用來自動(dòng)跟蹤棧頂?shù)刂贰S捎趩纹瑱C(jī)堆棧編址采用向上生成方式,即棧底占用較低地址,棧頂占用較高地址,所以其過程為:入棧操作:先(SP)+1→(SP),指向棧頂?shù)纳弦粋€(gè)空單元,后把直接尋址單元的內(nèi)容壓入SP所指的單元中。出棧操作:先彈出棧頂內(nèi)容到直接尋址單元,后(SP)-1→(SP),形成新的堆棧指針。例PUSHACC;保護(hù)累加器ACC中內(nèi)容PUSHPSW;保護(hù)標(biāo)志寄存器內(nèi)容;執(zhí)行服務(wù)程序POPPSW;恢復(fù)標(biāo)志寄存器內(nèi)容POPACC;恢復(fù)累加器ACC中內(nèi)容該程序執(zhí)行后,累加器ACC和PSW寄存器中的內(nèi)容可得到正確的恢復(fù)。若為:PUSHACCPUSHPSWPOPACCPOPPSW則執(zhí)行后,將使得ACC和PSW中的內(nèi)容互換。,,在數(shù)據(jù)傳送類操作中應(yīng)注意以下幾點(diǎn):1.除了用POP或MOV指令將數(shù)據(jù)傳送到PSW外,傳送操作一般不影響標(biāo)志位。2.執(zhí)行傳送類指令時(shí),把源地址單元的內(nèi)容送到目的地址單元后,源地址單元中的內(nèi)容不變。3.對(duì)特殊功能寄存器SFR的操作必須使用直接尋址,也就是說,直接尋址是訪問SFR的唯一方式。4.對(duì)于8052單片機(jī)內(nèi)部RAM的80H~FFH單元只能使用@Ri間接尋址方式訪問5.將累加器ACC壓入堆棧或彈出堆棧時(shí),應(yīng)使用PUSHACC和POPACC指令,不能使用PUSHA和POPA指令。否則,程序編譯會(huì)出錯(cuò)。,4.5邏輯操作類指令,,邏輯操作類指令共有24條,包括與、或、清除、求反、左右移位等邏輯操作。按操作數(shù)可劃分為單操作數(shù)和雙操作數(shù)兩種。單操作數(shù)是專門對(duì)累加器A進(jìn)行的邏輯操作,這些操作主要是:清0、求反、左右移位等,操作結(jié)果保存在累加器A中。雙操作數(shù)主要是累加器A和第二操作數(shù)之間執(zhí)行邏輯與、或和異或操作,第二操作數(shù)可以是立即數(shù),也可以是內(nèi)部數(shù)據(jù)存儲(chǔ)器的Rn、內(nèi)部數(shù)據(jù)RAM單元或者SFR。其對(duì)應(yīng)的尋址方式是:寄存器、寄存器間接、直接尋址。邏輯操作的結(jié)果保存在A中。也可將直接尋址單元作為第一操作數(shù),和立即數(shù),累加器A執(zhí)行邏輯與、或和異或操作,結(jié)果存在直接尋址單元中。,4.5.1對(duì)累加器A進(jìn)行的邏輯操作,1.累加器A清0指令:CLRA;(A)←0功能:把00H送入累加器A中2.累加器A求反指令:CPLA;(A)←()功能:把累加器內(nèi)容求反后送入累加器A中。例設(shè)累加器原來內(nèi)容為07H,則執(zhí)行CLRA后將變成00H,再執(zhí)行CPLA后將變?yōu)?FFH。,3.累加器A左右移位RLA;累加器左循環(huán)移位RLCA;累加器通過C左循環(huán)移位RRA;累加器右循環(huán)移位RRCA;累加器通過C右循環(huán)移位SWAPA;交換累加器兩個(gè)半字節(jié)(4位循環(huán)移位)左移一位相當(dāng)于乘2。例MOVA,#01H;01H送累加器ARLA;02H送ARLA;04H送ARLA;08H送A右移一位相當(dāng)于除2,上述累加器(A)=08H,執(zhí)行指令:RRA;(A)←04HRRA;(A)←02HRRA;(A)←01H將使累加器內(nèi)容又變?yōu)?。通過進(jìn)位標(biāo)志CY的移位可用于檢查一個(gè)字節(jié)中各位的狀態(tài)或用于逐位輸出的情況。,OUTP2:RRCA;通過C右移一位MOVP1,AMOVP2.0,C;該位輸出到P2.0RET;返回該程序逐位將A中的最低位移入進(jìn)位位C,并由P2.0輸出。如果反復(fù)調(diào)用該程序,并且在每次調(diào)用之間加上一定的延時(shí),就會(huì)形成“跑馬燈”的效果。,例利用8051單片機(jī)的P1口輸出控制LED的發(fā)光,電路連接如圖4-6所示。編程實(shí)現(xiàn)使累加器A中的數(shù)據(jù)循環(huán)送P1口,并使用P2.0輸出指示進(jìn)位標(biāo)志。,,4.5.2雙操作數(shù)指令,1.累加器A與立即數(shù)、內(nèi)部存儲(chǔ)器之間的邏輯操作由于邏輯與、或、異或三種基本操作指令格式和尋址方式都是一樣的,故放在一起介紹。#dataANL(ORL,XRL)A,direct@RiRn例設(shè)A的內(nèi)容為0C3H,R0為0AAH,執(zhí)行命令(ANL、ORL、XRL)后,結(jié)果如下:ANLA,R0;(A)=82HORLA,R0;(A)=0EBHXRLA,R0;(A)=69H,,2.直接地址單元(內(nèi)部RAM、SFR)與累加器A、立即數(shù)之間的邏輯操作ANL(ORL,XRL)direct,AANL(ORL,XRL)direct,#data指令完成內(nèi)部數(shù)據(jù)RAM和SFR中直接尋址單元與累加器A、立即數(shù)之間的邏輯與(或,異或)操作。例1設(shè)P1內(nèi)容為0AAH,A中內(nèi)容為15H,則執(zhí)行:ANLP1,#0F0H;(P1)=0A0HORLP1,#0FH;(P1)=0AFHXRLP1,A;(P1)=0BFH邏輯操作是按位進(jìn)行的,所以,“ANL”指令常用來屏蔽字節(jié)中的某些位,該位欲清除用“0”去“與”,該位欲保留用“1”去“與”;“ORL”指令常用來使字節(jié)中的某些位置“1”,欲保留(不變)的位用“0”去“或”,欲置位的位用“1”去“或”;“XRL”指令用來對(duì)字節(jié)中某些位取反。欲取反的位用“1”去“異或”,欲保留的位用“0”去“異或”。,例設(shè)兩位用ASCⅡ碼表示的數(shù)分別保存在40H、41H單元中把其轉(zhuǎn)換成兩位BCD數(shù),并以壓縮形式存入40H單元中??删幊绦蛉缦拢篈NL40H,#0FH;40H的ASCⅡ碼變成BCD碼MOVA,41HANLA,#0FH;41H的ASCⅡ碼變成BCD碼RLA;左移4位RLARLARLAORL40H,A;結(jié)果存40H單元中若使用4位環(huán)移指令,將會(huì)使程序更簡(jiǎn)煉。ANL40H,#0FH;40H的ASCⅡ碼變成BCD碼MOVA,41H;ANLA,#0FH;41H的ASCⅡ碼變成BCD碼SWAPA;高、低4位交換ORL40H,A;結(jié)果存40H單元中注意:當(dāng)用邏輯與、或、異或指令修改一個(gè)并行I/O口輸出內(nèi)容時(shí),則原始值將從該輸出口的鎖存器中讀取,而不是從該輸出口的引腳上讀取。,4.6算術(shù)運(yùn)算類指令,,該類指令主要完成加、減、乘、除四則運(yùn)算,以及增量、減量和二十進(jìn)制調(diào)整操作。除增量、減量指令外,這類指令大多數(shù)影響到狀態(tài)標(biāo)志寄存器PSW。,4.6.1加減運(yùn)算指令,加減運(yùn)算中,以累加器A為第一操作數(shù),并存放操作后的中間結(jié)果。第二操作數(shù)可以是立即數(shù),工作寄存器內(nèi)容,寄存器間接尋址字節(jié)或直接尋址字節(jié),運(yùn)算結(jié)果會(huì)影響溢出OV,進(jìn)位CY,輔助進(jìn)位AC和奇偶標(biāo)志P。源操作數(shù)尋址方式有:寄存器尋址、直接尋址、間接尋址和立即數(shù)共4種。,1.加法指令:ADDA,#data;(A)←(A)+#dataADDA,direct;(A)←(A)+(direct)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順便指出:OV溢出標(biāo)志取決于帶符號(hào)數(shù)運(yùn)算時(shí),和的第6、7位中有一位產(chǎn)生進(jìn)位而另一位不產(chǎn)生進(jìn)位,則使OV置1,否則OV被清0。OV=1表示兩正數(shù)相加,和變成負(fù)數(shù),或兩負(fù)數(shù)相加,和變成正數(shù)的錯(cuò)誤結(jié)果。,2.帶進(jìn)位加法指令A(yù)DDCA,#data;(A)←(A)+#data+(C)ADDCA,direct;(A)←(A)+(direct)+(C)ADDCA,@Ri;(A)←(A)+((Ri))+(C)ADDCA,Rn;(A)←(A)+(Rn)+(C)例1設(shè)累加器A內(nèi)容為0AAH,R0內(nèi)容為55H,C內(nèi)容為1,執(zhí)行指令:ADDCA,R0將使(A)=00000000BAC=1,CY=1,OV=0例2設(shè)累加器A內(nèi)容為35H,P1口的內(nèi)容為48H,C=0則執(zhí)行指令:ADDCA,P1將使(A)=7DHAC=0,CY=0,OV=0這和執(zhí)行指令:ADDA,P1的結(jié)果是相同的。,例3利用ADDC指令可以進(jìn)行多字節(jié)加法運(yùn)算設(shè)雙字節(jié)加法中:被加數(shù)放20H,21H單元,加數(shù)放30H,31H單元,和存放在40H,41H單元,若高字節(jié)相加有進(jìn)位則轉(zhuǎn)OVER處執(zhí)行,可編程序如下:ADD1:MOVA,20H;取低字節(jié)被加數(shù)ADDA,30H;低位字節(jié)相加MOV40H,A;結(jié)果送40H單元MOVA,21H;取高字節(jié)被加數(shù)ADDCA,31H;加高字節(jié)和低位來的進(jìn)位MOV41H,A;結(jié)果送41H單元JCOVER;有進(jìn)位去OVER處執(zhí)行OVER:……;,3.帶借位減指令SUBBA,#data;(A)←(A)-#data-(C)SUBBA,direct;(A)←(A)-(direct)-(C)SUBBA,@Ri;(A)←(A)-((Ri))-(C)SUBBA,Rn;(A)←(A)-(Rn)-(C)由于減法只有帶借位減一條指令,所以在單字節(jié)相減時(shí),須先清借位位,以免相減后結(jié)果出錯(cuò)。例1設(shè)累加器內(nèi)容為D9H,R0內(nèi)容為87H,求兩者相減結(jié)果。CLRCSUBBA,R0執(zhí)行后(A)=52H,CY=0,OV=0若運(yùn)算兩數(shù)為無符號(hào)數(shù),則其溢出與否和“OV”狀態(tài)無關(guān)而靠CY是否有進(jìn)位予以判別,OV僅表明帶符號(hào)數(shù)運(yùn)算時(shí)是否溢出。,例2兩字節(jié)數(shù)相減,設(shè)被減數(shù)放20H,21H單元,減數(shù)放30H,31H單元,差放在40H,41H單元,若高字節(jié)有借位則轉(zhuǎn)OVER處執(zhí)行,可編程序如下:SUB1:CLRC;低字節(jié)減無借位CY清0MOVA,20H;初減數(shù)送ASUBBA,30H;低位字節(jié)相減MOV40H,A;結(jié)果送40H單元MOVA,21H;被減數(shù)高字節(jié)送ASUBBA,31H;高字節(jié)相減MOV41H,A;結(jié)果送41H單元JCOVER;高字節(jié)減有借位轉(zhuǎn)OVER處執(zhí)行……OVER:…………,4.6.2乘除運(yùn)算指令,1.乘法指令MULAB該指令把累加器A和寄存器B中的8位無符號(hào)整數(shù)相乘,16位乘積的低字節(jié)在累加器A中,高字節(jié)在寄存器B中,如果乘積大于255(0FFH),則溢出標(biāo)志位置1,否則清0,運(yùn)算結(jié)果總使進(jìn)位標(biāo)志CY清0。例1設(shè)(A)=80H(128),(B)=32H(50),執(zhí)行指令:MULAB執(zhí)行結(jié)果:乘積為1900H(6400),(A)=00H,(B)=19H,OV=1,CY=0,2.除法指令DIVAB該指令把累加器A中的8位無符號(hào)整數(shù)除以寄存器B中8位無符號(hào)整數(shù),所得商放在累加器A中,余數(shù)存在寄存器B中,標(biāo)志位CY和OV均清0。若除數(shù)(B中內(nèi)容)為00H,則執(zhí)行后結(jié)果為不定值,并置位溢出標(biāo)志OV,在任何情況下進(jìn)位標(biāo)志CY總清0。例設(shè)累加器內(nèi)容為135(87H),B寄存器內(nèi)容為12(0CH),則執(zhí)行命令:DIVAB;將使(A)=0BH,(B)=03H,OV=0,CY=0,4.6.3.增量、減量指令,1.增量指令I(lǐng)NCA;(A)←(A)+1INCdirect;(direct)←(direct)+1INC@Ri;((Ri))←((Ri))+1INCRn;(Rn)←(Rn)+1INCDPTR;(DPTR)←(DPTR)+1INC指令把所指出的變量加1,結(jié)果仍送回原地址單元,原來若為0FFH,加1后將變成00H,運(yùn)算結(jié)果不影響任何標(biāo)志位。指令共使用3種尋址方式:寄存器尋址、直接尋址或寄存器間接尋址。若用本指令使輸出并行I/O口內(nèi)容加1時(shí),則用作輸出口的原始值將從輸出數(shù)據(jù)鎖存器中讀入,而不是從輸出口的引腳上讀入。,例1設(shè)(R0)=7EH,內(nèi)部數(shù)據(jù)RAM中(7EH)=0FFH,(7FH)=40H,則執(zhí)行下列指令:INC@R0;(7EH)←00HINCR0;(R0)←7FHINC@R0;(7FH)←41H執(zhí)行結(jié)果:(R0)=7FH,(7EH)=00H,(7FH)=41H例2執(zhí)行指令序列:MOVDPTR,#1FFEH;(DPTR)←1FFEHINCDPTR;(DPTR)←1FFFHINCDPTR;(DPTR)←2000HINCDPTR;(DPTR)←2001H將使(DPTR)=2001H,2.減量指令DECA;(A)←(A)-1DECdirect;(direct)←(direct)-1DEC@Ri;((Ri))←((Ri))-1DECRn;(Rn)←(Rn)-1上述指令將指定變量減1,結(jié)果仍存在原指定單元,原指定單元內(nèi)容若為00H,減1操作后變成0FFH,不影響任何標(biāo)志位。有三種尋址方式:寄存器尋址、直接尋址或寄存器間接尋址。同增量指令一樣,若執(zhí)行對(duì)I/O并行口內(nèi)容減1操作,將把該輸出口數(shù)據(jù)鎖存器讀出1,再寫入鎖存器,而不是從輸出口引腳上內(nèi)容進(jìn)行減1操作。例執(zhí)行下述程序:MOVR1,#7FH;(R1)←#7FHMOV7EH,#00H;(7EH)←#00HMOV7FH,#40H;(7FH)←#40HDEC@R1;(7FH)←3FHDECR1;(R1)←7EHDEC@R1;(7EH)←0FFH結(jié)果:(R1)=7EH,(7EH)=0FFH,(7FH)=3FH,4.6.4.二―十進(jìn)制調(diào)整指令,DAA調(diào)整條件和方法:若[(A0-3)>9或(AC)=1],則(A0-3)←(A0-3)+06H;若[(A4-7)>9或(CY)=1],則(A4-7)←(A4-7)+60H。由于指令要利用AC,CY等標(biāo)志位才能起到正確的調(diào)整作用,因此它必須跟在加法(ADD、ADDC)指令后面才能使用。指令的操作過程為:若相加后累加器低4位大于9或半進(jìn)位位AC=1,則加06H修正;若相加后累加器高4位大于9或進(jìn)位位CY=1,則加60H修正;若兩者同時(shí)發(fā)生或高4位雖等于9但低4位修正有進(jìn)位,則應(yīng)加66H修正。例1利用十進(jìn)制加法調(diào)整指令作十進(jìn)制減法調(diào)整,必須采用補(bǔ)碼相加的方法,用9AH(即十進(jìn)制的100)減法減數(shù)即得以10為模的減數(shù)補(bǔ)碼。設(shè)被減數(shù)存30H單元,減數(shù)存40H單元,結(jié)果存50H單元,可編程序如下:BCDSUB1:CLRC;清進(jìn)位位MOVA,#9AH;求減數(shù)補(bǔ)碼SUBBA,40HADDA,30H;進(jìn)行補(bǔ)碼相加DAAMOV50H,A;結(jié)果(差)存50H單元,例26位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:MOVA,30H;第一字節(jié)加ADDA,40HDAAMOV50H,A;存第一字節(jié)和(BCD碼)MOVA,31H;第二字節(jié)加ADDCA,41HDAAMOV51H,A;存第二字節(jié)和(BCD碼)MOVA,32H;第三字節(jié)加ADDCA,42HDAAMOV52H,A;存第三字節(jié)和(BCD碼)JCOVER;有進(jìn)位轉(zhuǎn)OVER處執(zhí)行,4.7位操作指令,,位操作指令共有17條,均以位為處理對(duì)象,分別完成位傳送、位狀態(tài)控制、位邏輯操作、位條件轉(zhuǎn)移等功能。,C⊕bit→CC⊕/bit→C,4.7.1位數(shù)據(jù)傳送指令,MOVC,bit;(C)←(bit)MOVbit,C;(bit)←(C)指令完成的功能是把第二操作數(shù)所指出的布爾變量送到由第一操作數(shù)指定的位單元。其中一個(gè)操作數(shù)必為位累加器(進(jìn)位標(biāo)志C),另一個(gè)可以是任何直接尋址位(bit)。指令執(zhí)行結(jié)果不影響其它寄存器或標(biāo)志。例1設(shè)內(nèi)部數(shù)據(jù)RAM中(20H)=7FH,執(zhí)行指令:MOVC,07H;07H是位地址,即字節(jié)地址20H的第7位,將使(C)=0。例2指令:MOV0BAH,C則表示把進(jìn)位位C(位累加器)送入特殊功能寄存器IP的PX1(第2位)位。,4.7.2位狀態(tài)控制指令,1.位清0指令CLRbit;(bit)←0CLRC;(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)。,2.位求反指令CPLbit;(bit)←(/bit)CPLC;(C)←(/C)上述指令可把直接尋址位(bit)或位累加器C內(nèi)容取反,不影響其它標(biāo)志。例執(zhí)行指令序列MOVP1,#5DH;P1=(01011101B)CPLP1.1;P1.1求反CPLP1.2;P1.2求反則使P1口內(nèi)容變?yōu)?BH(01011011B)。,3.位置位指令SETBbit;(bit)←“1”SETBC;(C)←“1”上述指令把進(jìn)位標(biāo)志C或任何可尋址位置“1”,不影響其它標(biāo)志。例進(jìn)位標(biāo)志C內(nèi)容為0,輸出口P1原已寫入了49H(01001001B),則執(zhí)行SETBCSETBP1.7將使進(jìn)位標(biāo)志(C)=1,P1口輸出數(shù)據(jù)變?yōu)镃9H(11001001B)。,4.7.3位邏輯操作指令,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)容取反后再進(jìn)行位操作。例當(dāng)位地址(7FH)=1,累加器中(ACC.7)=1,同時(shí)(B.0)=0,進(jìn)位位C置1,否則C清0,可編程序如下:MOVC,7FH;(7FH)=1送CANLC,ACC.7;(C)=“1”和(ACC.7)=“1”相與并送C暫存ANLC,/B.0;(C)∧(/B.0)→(C),2.位邏輯“或”指令ORLC,bit;(C)←(C)∨(bit)ORLC,/bit;(C)←(C)∨(/bit)位邏輯“或”指令把直接尋址位內(nèi)容或直接尋址位內(nèi)容取反后(不改變?cè)瓕ぶ穬?nèi)容)與位累加器C進(jìn)行邏輯“或”,結(jié)果保存在C中,“/bit”含義同上。位邏輯“或”操作的示意圖如圖4-4所示。例位地址7FH中的內(nèi)容和累加器ACC.7,寄存器B.0中內(nèi)容相“或”的程序如下:(設(shè)(7FH)=1,(B.0)=0,(ACC.7)=1)MOVC,7FHORLC,B.0ORLC,ACC.7;相“或”的結(jié)果必為“1”,存C中。,4.7.4位條件轉(zhuǎn)移指令,1.判C轉(zhuǎn)移指令JCrel;若(C)=1,則(PC)←(PC)+rel,否則順序執(zhí)行。JNCrel;若(C)=0,則(PC)←(PC)+rel,否則順序執(zhí)行。上述兩條指令通過判進(jìn)位C的狀態(tài)決定程序的走向,前一條若進(jìn)位標(biāo)志為1,后一條若進(jìn)位標(biāo)志為0,就可使程序轉(zhuǎn)向目標(biāo)地址,否則順序執(zhí)行下一條指令。目標(biāo)地址為第二字節(jié)中的帶符號(hào)的偏移量與PC當(dāng)前值((PC)+2→(PC)之和,不影響任何標(biāo)志。在實(shí)際應(yīng)用中,一般在rel的位置寫入欲跳轉(zhuǎn)到的標(biāo)號(hào)地址,偏移量由匯編程序自動(dòng)進(jìn)行計(jì)算。下面的兩段指令都將使程序轉(zhuǎn)向L2處執(zhí)行:例1CLRC;C←0JCL1;C=0不轉(zhuǎn),繼續(xù)執(zhí)行CPLC;C=1JCL2;條件滿足轉(zhuǎn)L2L1:……;L2:……;例2SETBC;C=1JNCL1;C≠0,順序執(zhí)行CPLC;C=0JNCL2;轉(zhuǎn)L2L1:……;L2:……;,,,,,2.判直接尋址位轉(zhuǎn)移指令JBbit,rel;(bit)=1,(PC)←(PC)+relJNBbit,rel;(bit)=0,(PC)←(PC)+relJBCbit,rel;(bit)=1,(PC)←(PC)+rel,(bit)←0若條件不滿足,指令順序執(zhí)行。上述指令檢測(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。,,,例指令序列:MOVP1,#0CAH;(P1)←0CAH(11001010B)MOVA,#56H;(A)←56H(01010110B)JBP1.2,L1;(P1.2)=0不轉(zhuǎn),繼續(xù)執(zhí)行JNBACC.3,L2;(ACC.3)=0轉(zhuǎn)L2處執(zhí)行L1:……;L2:……;與下列程序:MOVA,#43H;(A)←43H(01000011B)JBCACC.2,L1;(ACC.2)=0不轉(zhuǎn)JBCACC.6,L2;(ACC.6)=1轉(zhuǎn)L2,且(ACC.6)←0L1:……;L2:……;執(zhí)行后均使程序轉(zhuǎn)向L2處,但前段程序轉(zhuǎn)移后維持原變量(ACC.3)=0不變,后段程序卻把原變量(ACC.6)=1清0。,4.8控制轉(zhuǎn)移類指令,,該類指令用于控制程序的走向。利用具有16位地址的長(zhǎng)調(diào)用、短調(diào)用指令可遍訪程序存儲(chǔ)器空間的任一地址單元,也可用具有11位地址的絕對(duì)調(diào)用和絕對(duì)轉(zhuǎn)移指令,實(shí)現(xiàn)在2K程序塊中的有效轉(zhuǎn)移。此外,全空間(64K)的長(zhǎng)間接轉(zhuǎn)移和一頁范圍的短相對(duì)轉(zhuǎn)移以及條件轉(zhuǎn)移指令,使得用戶可靈活選擇,給程序編制帶來了很大的方便。這類指令可分為兩種:一種是程序轉(zhuǎn)移指令,另一種稱為子程序調(diào)用和返回指令。,在實(shí)際應(yīng)用中,一般在偏移量(rel)或者跳轉(zhuǎn)地址(addr16或addr11)的位置寫入欲跳轉(zhuǎn)到的標(biāo)號(hào)地址,由匯編程序自動(dòng)進(jìn)行計(jì)算。,4.8.1程序轉(zhuǎn)移指令,1.無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令控制程序計(jì)數(shù)器從現(xiàn)行值轉(zhuǎn)移到目標(biāo)地址,該目標(biāo)地址可通過直接,間接或相對(duì)尋址得到。(1)長(zhǎng)轉(zhuǎn)移指令LJMPaddr16;(PC)←addr16指令提供16位目標(biāo)地址,將指令中第二,第三字節(jié)地址碼分別裝入PC的高8位和低8位中,程序無條件轉(zhuǎn)向指定的目標(biāo)地址去執(zhí)行。不影響標(biāo)志位。由于直接提供16位目標(biāo)地址,所以執(zhí)行這條指令可以使程序從當(dāng)前地址轉(zhuǎn)移到64K程序存儲(chǔ)器地址空間的任何單元。例在程序存儲(chǔ)器0000H單元存放一條指令LJMP2030H則上電復(fù)位后程序?qū)⑻?030H單元去執(zhí)行,這樣可以就避開0003~0023H的中斷服務(wù)程序入口的保留單元。,(2)絕對(duì)轉(zhuǎn)移指令A(yù)JMPaddrll雙字節(jié)指令,第二字節(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了,因此轉(zhuǎn)移的目標(biāo)地址應(yīng)與AJMP下相鄰指令第一字節(jié)地址在同一2K字節(jié)范圍內(nèi)。如果超過了2K范圍,匯編程序會(huì)提示出錯(cuò)信息。本指令不影響標(biāo)志位。,(3)相對(duì)短轉(zhuǎn)移指令SJMPrel;(PC)←(PC)+2;(PC)←(PC)+rel其中,rel為相對(duì)偏移量,是一個(gè)8位帶符號(hào)的數(shù)。指令控制程序無條件轉(zhuǎn)向指定地址。該指定地址由指令第二字節(jié)的相對(duì)地址和程序計(jì)數(shù)器PC的當(dāng)前值(執(zhí)行SJMP前的PC值加2)相加形成。因而轉(zhuǎn)向地址可以在這條指令首地址的前128字節(jié)到后127字節(jié)之間。如果程序中使用:HARE:SJMPHARE將會(huì)造成單指令的無限循環(huán)。,(4)間接轉(zhuǎn)移指令JMP@A+DPTR;(PC)←(A)+(DPTR)該指令把累加器里的8位無符號(hào)數(shù)與作為基址寄存器DPTR中的16位數(shù)據(jù)相加,所得的值裝入程序計(jì)數(shù)器PC做為轉(zhuǎn)移的目標(biāo)地址。指令執(zhí)行后不影響累加器和數(shù)據(jù)指針中的原內(nèi)容,不影響任何標(biāo)志。這是一條極其有用的多分支選擇轉(zhuǎn)移指令,其轉(zhuǎn)移地址不是匯編或編程時(shí)確定的,而是在程序運(yùn)行時(shí)動(dòng)態(tài)決定的,這也是和前三條指令的主要區(qū)別。正由于此,可在DPTR中裝入多分支轉(zhuǎn)移程序的首地址,而由累加器A的內(nèi)容來動(dòng)態(tài)選擇其中的某一個(gè)分支予以轉(zhuǎn)移,這就可用一條指令代替眾多轉(zhuǎn)移指令,實(shí)現(xiàn)以DPTR內(nèi)容為起始的256個(gè)字節(jié)范圍的選擇轉(zhuǎn)移。,例要求當(dāng)(A)=0轉(zhuǎn)處理程序CASE_0當(dāng)(A)=1轉(zhuǎn)處理程序CASE_1當(dāng)(A)=2轉(zhuǎn)處理程序CASE_2當(dāng)(A)=3轉(zhuǎn)處理程序CASE_3當(dāng)(A)=4轉(zhuǎn)處理程序CASE_4程序代碼如下:MOVDPTR,#JUMP_TABLE;表首址送入DPTR中MOVA,INDEX_NUMBER;取得跳轉(zhuǎn)索引號(hào)RLA;將索引號(hào)乘以2(由于AJMP指令是2字節(jié)指令)JMP@A+DPTR;以A中內(nèi)容為偏移量JUMP_TABLE:AJMPCASE0;(A)=0轉(zhuǎn)CASE_0執(zhí)行AJMPCASE1;(A)=1轉(zhuǎn)CASE_1執(zhí)行AJMPCASE2;(A)=2轉(zhuǎn)CASE_2執(zhí)行AJMPCASE3;(A)=3轉(zhuǎn)CASE_3執(zhí)行AJMPCASE4;(A)=4轉(zhuǎn)CASE_4執(zhí)行,(5)轉(zhuǎn)移指令總結(jié),在實(shí)際應(yīng)用中,由于AJMP和SJMP指令的跳轉(zhuǎn)范圍有限,而LJMP(長(zhǎng)轉(zhuǎn)移指令)不受跳轉(zhuǎn)范圍的限制,因此一般情況下可以使用LJMP指令代替AJMP和SJMP指令。,,2條件轉(zhuǎn)移指令該類指令執(zhí)行滿足某種特定條件的轉(zhuǎn)移,其目標(biāo)地址在以下一條指令的起始地址為中心的256字節(jié)范圍中(-128到+127)。(1)累加器判零轉(zhuǎn)移指令JZrel;累加器為0轉(zhuǎn)移JNZrel;累加器不為0轉(zhuǎn)移JZ表示累加器的內(nèi)容為0,則轉(zhuǎn)向指定的地址,否則順序執(zhí)行下條指令;JNZ指令剛好相反,累加器不等于0,則轉(zhuǎn)向指定地址,否則順序執(zhí)行下條指令。兩條指令均為雙字節(jié),其中第二條字節(jié)為符號(hào)的相對(duì)偏移量,PC現(xiàn)行值(PC加2后)與偏移量相加即得轉(zhuǎn)移地址。該指令不改變累加器內(nèi)容,不影響標(biāo)志位。例執(zhí)行程序:MOVA,#01H;01送累加器AJZBRAN1;A非零不轉(zhuǎn),繼續(xù)執(zhí)行DECA;A減1內(nèi)容為0JZBRAN2;A為0轉(zhuǎn)BRAN2執(zhí)行或執(zhí)行:CLRA;A清0JNZBRAN1;A為0繼續(xù)執(zhí)行INCA;A內(nèi)容加1JNZBRAN2;A內(nèi)容非零轉(zhuǎn)BRAN2執(zhí)行程序都轉(zhuǎn)移到BRAN2去執(zhí)行。,(2)比較轉(zhuǎn)移指令CJNE(目的字節(jié)),(源字節(jié)),relCJNE類指令比較前面兩個(gè)操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移,相等則繼續(xù)執(zhí)行。這些指令均為三字節(jié)指令,PC當(dāng)前值((PC)+3→(PC))與指令第三字節(jié)帶符號(hào)的偏移量相加即得到轉(zhuǎn)移地址,如果目的字節(jié)的無符號(hào)整數(shù)值小于源字節(jié)的無符號(hào)整數(shù)值,則置位進(jìn)位標(biāo)志,否則清0進(jìn)位位,指令不影響任何一個(gè)操作數(shù)。指令的源和目的操作數(shù)有4種尋址方式組合:累加器可以和任何直接尋址字節(jié)或立即數(shù)比較,而任何間接尋址RAM單元或工作寄存器能與立即數(shù)比較。,具體的比較轉(zhuǎn)移指令有4條:CJNEA,#data,relCJNEA,direct,relCJNE@Ri,#data,relCJNERn,#data,rel例1設(shè)(R7)=56H,執(zhí)行下列指令CJNER7,#60H,K1;由于(R7)<60H,轉(zhuǎn)K1,且(CY)←1…K1:JCK3;因?yàn)椋–Y)=1,判出(R7)<60H,轉(zhuǎn)K3執(zhí)行…K3:…例2設(shè)P1口P1.0~P1.3為準(zhǔn)備就緒信號(hào)輸入端,當(dāng)該4位輸入全“1”說明各項(xiàng)工作已準(zhǔn)備好,單片機(jī)可順序執(zhí)行主程序,否則循環(huán)等待。程序片斷如下:L0:MOVA,P1;P1口內(nèi)容送AANLA,#0FH;屏蔽高4位CJNEA,#0FH,L0;該4位不全1,返回L0,否則繼續(xù)執(zhí)行MAIN1:…,(3)循環(huán)轉(zhuǎn)移指令DJNZ(字節(jié)),rel這是一條減1與0比較指令,程序每執(zhí)行一次該指令,就把第一操作數(shù)字節(jié)變量減1,結(jié)果送回到第一操作數(shù)中,并判字節(jié)變量是否為0,不為0轉(zhuǎn)移,否則順序執(zhí)行。如果字節(jié)變量值原為00H,則下溢得0FFH,不影響任何標(biāo)志。共有兩條指令:DJNZdirect,relDJNZRn,rel由于被減1的第一操作數(shù)可為一個(gè)工作寄存器或直接尋址字節(jié),所以使用該指令可以很容易地構(gòu)成循環(huán),只要給直接地址或工作寄存器賦不同初值,就可方便地控制循環(huán)次數(shù),而使用不同的工作單元或寄存器就可派生出很多條循環(huán)轉(zhuǎn)移指令。,例1軟件延時(shí)利用DJNZ指令可在一段程序中插入某些指令來實(shí)現(xiàn)軟件延時(shí)。DJNZ指令執(zhí)行時(shí)間為2個(gè)機(jī)器周期,這樣循環(huán)一次可產(chǎn)生2個(gè)機(jī)器周期延時(shí)。下例在程序段中插入2條指令,當(dāng)主頻12MHz,循環(huán)次數(shù)為24時(shí),可產(chǎn)生49us的軟件延時(shí)循環(huán),在P1.7引腳上輸出一個(gè)50us的脈沖。CLRP1.7;P1.7輸出變低電平MOVR2,#18H;賦循環(huán)初值HARE:DJNZR2,HARE;(R2)←(R2)-1,不為零繼續(xù)循環(huán)SETBP1.7;P1.7輸出高電平例2內(nèi)部RAM單元40H、50H、60H內(nèi)容分別為01H、20H、15H,則執(zhí)行下列指令序列:DJNZ40H,LABEL1;(40H)-1=0結(jié)束循環(huán)向下執(zhí)行DJNZ50H,LABEL2;(50H)-1≠0轉(zhuǎn)LABEL2執(zhí)行循環(huán)DJNZ60H,LABEL3;待上條指令循環(huán)完才執(zhí)行本指令程序?qū)⑥D(zhuǎn)LABEL2出繼續(xù)循環(huán),各RAM單元內(nèi)容變?yōu)椋?0H)=00H、(50H)=1FH、(60H)=15H。第一條指令執(zhí)行結(jié)果為0,故沒有發(fā)生轉(zhuǎn)移。,例3多項(xiàng)單字節(jié)數(shù)求和設(shè)數(shù)組長(zhǎng)度放R0,數(shù)組存放首地址在R1中,數(shù)組之和則存在20H單元中,因?yàn)槭?位字長(zhǎng),所以此和不應(yīng)大于256??删幊倘缦拢篊LRA;A清0SUMD:ADDA,@R1;相加INCR1;地址指針增1DJNZR0,SUMD;字節(jié)數(shù)減1不為0繼續(xù)加MOV20H,A;結(jié)果存20H單元,4.8.2子程序調(diào)用和返回指令,有兩條調(diào)用指令LCALL(長(zhǎng)調(diào)用)及ACALL(絕對(duì)調(diào)用)和一條與之配對(duì)的子程序返回指令RET。LCALL和ACALL指令類似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們?cè)谵D(zhuǎn)移前,要把執(zhí)行完該指令后PC的內(nèi)容自動(dòng)壓入堆棧,才做addr16(或addr11)→PC的工作(其中addr16或addr11是子程序的首地址或稱子程序入口地址)。這樣設(shè)計(jì)是為了便于當(dāng)子程序執(zhí)行完后,CPU可以找到(返回)原出發(fā)點(diǎn)處。RET指令是子程序返回指令,執(zhí)行時(shí),從堆棧中把原出發(fā)地址彈回PC,讓CPU返回執(zhí)行原主程序。,1.長(zhǎng)調(diào)用指令LCALLaddr16長(zhǎng)調(diào)用與LJMP一樣提供16位地址,可調(diào)用64K范圍內(nèi)所指定的子程序,由于為三字節(jié)指令,所以執(zhí)行時(shí)首先(PC)+3→(PC)以獲得下一條指令地址,并把此時(shí)PC內(nèi)容壓入(作為返回地址,先壓入低字節(jié)后壓入高字節(jié))堆棧,堆棧指針SP加2指向棧頂,然后把目標(biāo)地址addr16裝入PC,轉(zhuǎn)去執(zhí)行子程序。顯然使用該指令可使子程序在64K范圍內(nèi)任意存放。指令執(zhí)行不影響標(biāo)志位。例設(shè)(SP)=53H,子程序首址在3000單元,并以標(biāo)號(hào)STR表示。在(PC)=2000H處執(zhí)行指令:LCALLSTR將使(SP)=55H,(54H)=03H((PC)+3→PC之值),(55H)=20H,((PC)+3→(PC)高字節(jié)值),PC將變?yōu)?000H。,2.絕對(duì)調(diào)用指令A(yù)CALLaddr11該指令提供11位目標(biāo)地址,限在2K地址內(nèi)調(diào)用,由于是雙字節(jié)指令,所有執(zhí)行時(shí)(PC)+2→(PC)以獲得下一條指令的地址然后把該地址壓入堆棧作為返回地址,其它操作與AJMP相同。,由于ACALL指令的調(diào)用范圍受2K的限制,因此,一般程序中使用LCALL指令代替ACALL指令。,3.返回指令RET;RET表示子程序結(jié)束需要返回主程序,所以執(zhí)行該指令時(shí),分別從棧中彈出調(diào)用子程序時(shí)壓入的返回地址,使程序從調(diào)用指令(LCALL或ACALL)的下面相鄰指令開始繼續(xù)執(zhí)行程序。例設(shè)(SP)=55H,RAM中(54H)=03H,(55H)=20H,則執(zhí)行RET后,使:(SP)=53H(PC)=2003H程序由2003H開始繼續(xù)執(zhí)行。4.中斷返回指令RETI;該指令用于中斷服務(wù)子程序的返回,其執(zhí)行過程類似于RET,詳見中斷一章介紹。,5.空操作指令NOPNOP操作:(PC)←(PC)+1執(zhí)行本指令除了PC加1外,機(jī)器不作任何操作,而轉(zhuǎn)向下一條指令去執(zhí)行。不影響任何寄存器和標(biāo)志。由于為單周期指令,所以時(shí)間上只有一個(gè)機(jī)器周期,常用于精確延時(shí)或等待。例利用NOP指令產(chǎn)生方波。LOOP:CLRP2.7;P2.7清0輸出NOP;NOP;空操作NOP;NOP;SETBP2.7;置位P2.7高電平NOP;NOP;空操作NOP;NOP;LJMPLOOP,4.9思考題見教材習(xí)題,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 單片機(jī) 原理 應(yīng)用 陳桂友 指令系統(tǒng)
鏈接地址:http://www.820124.com/p-11648767.html