單片機原理與應用(陳桂友)第4章指令系統(tǒng).ppt
《單片機原理與應用(陳桂友)第4章指令系統(tǒng).ppt》由會員分享,可在線閱讀,更多相關《單片機原理與應用(陳桂友)第4章指令系統(tǒng).ppt(80頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第4章指令系統(tǒng),4.18051單片機的助記符語言,4.2指令格式及分類,4.3尋址方式,4.4數(shù)據(jù)傳送類指令,4.6算術運算類指令,4.5邏輯操作類指令,4.7位操作指令,4.8控制轉(zhuǎn)移類指令,4.18051單片機的助記符語言,高級語言編程簡單,執(zhí)行效率低,常用在計算和管理的場合。匯編語言(助記符語言)編程繁瑣,執(zhí)行效率高,宜用于需要結(jié)構(gòu)緊湊、反應快速的實時控制場合。助記符一般是由操作碼和操作數(shù)兩部分組成的。操作碼反映了指令的功能,操作數(shù)代表了指令的操作對象。例如,ADDA,#6AH;AA+#6AH其中ADD是操作碼符號。A和6AH是操作數(shù)。前者反映了該指令的功能是做加法,后者則表示相加的對象是A累加器中的內(nèi)容和立即數(shù)6AH。由助記符構(gòu)成的編程語言一般稱為匯編語言。目前大多數(shù)單片機的編譯系統(tǒng)都支持C語言編程,并可以對編譯的代碼進行優(yōu)化。使用C語言編程,具有編寫簡單、直觀易讀、通用性好等特點,特別是控制任務比較復雜或者具有大量運算的系統(tǒng)中,C語言更顯示出了超越匯編語言的優(yōu)勢。然而,匯編語言是理解和掌握單片機原理及應用的基礎,并且,在控制系統(tǒng)不太復雜、實時性要求較高的控制系統(tǒng)中,較多的用戶還是使用匯編語言進行程序設計。,4.1.1概述,4.1.2操作碼,操作碼是指令功能的英文縮寫。,4.1.3操作數(shù),操作數(shù)是一條指令操作的對象。不同功能的指令,操作對象形式不同。操作數(shù)可以是數(shù)據(jù),也可以是地址。操作數(shù)是指令中給出的數(shù)據(jù)時,被稱為立即數(shù)。它有8位和16位二進制數(shù)兩種。在助記符的數(shù)字前加以“#”來標記其是立即數(shù),常用符號“#data”表示。操作數(shù)也可以是存放數(shù)據(jù)的地址,這些地址可以是:1.所選定寄存器工作區(qū)內(nèi)的R7R0,A、B、C(位)、AB(雙字節(jié)),DPTR(雙字節(jié))等可編址的寄存器。2.內(nèi)部數(shù)據(jù)存儲器中低128字節(jié),專用寄存器SFR,可尋址的位。3.外部數(shù)據(jù)存儲器空間。4.程序存儲器空間。注意:編寫程序時,操作數(shù)的最高位大于9時,在操作數(shù)的最高位前要加寫0。否則,編譯會提示出錯。例如:MOVA,#0F8H是正確的,而MOVA,#F8H是不正確的。,4.2指令格式及分類,用助記符來描述機器指令的語言稱為符號語言或匯編語言,匯編語言是一種面向機器的程序設計語言。其規(guī)定的格式如下:標號:操作碼助記符第一操作數(shù),第二操作數(shù),第三操作數(shù);注釋標號是表示該指令所在的符號地址,一般是由字母開頭的字符串組成。例如:ABCQ3PATD678均為標號的允許格式5AC-PTR+A等均為標號不允許的格式操作碼助記符表示了指令的功能。第一操作數(shù)、第二操作數(shù)都表示操作的對象,這些是指令的核心部分。指令操作碼部分是必不可少的。操作數(shù)段有的指令可以沒有,或者只有一個操作數(shù),例如:RETI;中斷返回,無操作數(shù)CPLA;累加器逐位取反,只有一個操作數(shù)。注釋字段是為方便用戶閱讀程序所加注的說明。,4.2.1匯編語言,4.2.2指令代碼格式,指令代碼是指令的二進制表示方法,是指令在存儲器中存放的形式。匯編語言只有經(jīng)“編輯/匯編”程序翻譯成機器語言,才能被執(zhí)行。8051單片機指令系統(tǒng)中的指令字長有單字節(jié)、雙字節(jié)、三字節(jié)三種。指令字節(jié)數(shù)越多,所占用內(nèi)存單元越多。但是指令執(zhí)行時間長短并不和所占用字節(jié)數(shù)的多少成比例。例如乘法為單字節(jié)指令,但是所需的指令執(zhí)行時間卻最長。單字節(jié)指令:操作碼例:RET;機器代碼:22H雙字節(jié)指令:操作碼操作數(shù)例:MOVA,#0FH;機器代碼:740FH三字節(jié)指令:操作碼第一操作數(shù)第二操作數(shù)例:MOV74H,#0BH;機器代碼:75740BH,4.2.3指令中的符號約定,4.3尋址方式,指令中的源操作數(shù)是立即數(shù),叫做立即尋址。立即數(shù)的類型可以是:二進制(B)、十進制、十六進制(H)、整數(shù)、序數(shù)或者字符。立即數(shù)的字長可以是8位或16位。例如:MOVA,#61H這條指令是把61H這個數(shù)據(jù)送入到累加器A中。例如:MOVDPTR,#2050H這條指令是把2050H這個數(shù)據(jù)送入到數(shù)據(jù)指針DPTR中。,1立即尋址,操作數(shù)是指令的重要組成部分,它指定了參與運算的數(shù)或數(shù)所在單元地址,而如何得到這個地址就稱為尋址方式。一般來說,尋址方式越多,計算機功能越強,靈活性越大。所以尋址方式對機器的性能有重大影響。8051單片機共有7種尋址方式,描述如下:,2直接尋址,直接尋址就是在指令中包含了操作數(shù)的地址,該地址直接給出了參加運算或傳送的單元或位。它可訪問三種地址空間:(1)特殊功能寄存器SFR:直接尋址是唯一的訪問形式(2)內(nèi)部數(shù)據(jù)RAM中的00H7FH的128個字節(jié)單元(3)位地址空間例如:MOVA,60H;把60H單元內(nèi)容送入累加器A中。,3寄存器尋址,指定某一可尋址的寄存器的內(nèi)容為操作數(shù),對寄存器ACC,B,DPTR和CY(進位標志,也是布爾處理機的累加器),其尋址時具體的寄存器已隱含在其操作碼中。而對選定的8個工作寄存器R7R0,則用指令操作碼的低3位指明所用的寄存器。在應用中,可以先通過PSW中的RS1、RS0兩位來選擇寄存器組,再用操作碼中低3位來確定是組內(nèi)哪一個寄存器,達到尋址的目的。例如:INCR5;把寄存器R3的內(nèi)容加1后再送回R5,4寄存器間接尋址,指令指定某一寄存器的內(nèi)容作為操作數(shù)地址。8051中可用來間接尋址的寄存器有:選定工作寄存器區(qū)的R0、R1,16位的數(shù)據(jù)指針DPTR,使用時前面加表示間接尋址。例如:MOVA,R0;將R0中的內(nèi)容所表示的地址單元中的內(nèi)容送給AMOVXDPTP,A,5變址尋址,由指令指定的偏移量寄存器和變址寄存器DPTR或PC相加所得結(jié)果作為操作數(shù)地址。例如:MOVCA,A+PC其中A作為偏移量寄存器,PC作為變址寄存器,A中內(nèi)容為無符號數(shù)和PC相加,從而得到其真正的操作數(shù)地址。,6相對尋址,把指令中給定的地址偏移量與本指令所在單元地址(即程序計數(shù)器PC中的內(nèi)容)相加,即得到真正的程序轉(zhuǎn)移地址。與變址方式不同。該偏移量有正、負號,在該機器指令中必須以補碼形式給出,所轉(zhuǎn)移的范圍為相對于當前PC值的-128+127之間。例如:JC80H若C=0,則PC值不變,若進位C=1,則以現(xiàn)行的PC為基地址加上80H得到轉(zhuǎn)向地址。,7位尋址,支持位單元存取操作是8051單片機的一個主要特點。位操作指令能對位地址空間的每一位都可進行運算和傳送操作。例如: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)部和外部資源賦值,進行堆棧的存取操作等。數(shù)據(jù)傳送類指令執(zhí)行前后,對程序狀態(tài)字PSW不產(chǎn)生影響。按其操作方式,又可把它們分為三種:數(shù)據(jù)傳送數(shù)據(jù)交換棧操作,4.4.1數(shù)據(jù)傳送指令,格式:MOV,功能:把第二操作數(shù)指定的字節(jié)變量傳送到由第一操作數(shù)指定的單元中,不影響源字節(jié),不影響任何別的寄存器或標志。這是最靈活的操作,允許15種源和目的尋址方式組合。,一、通用傳送指令MOV,1.立即數(shù)送累加器A和內(nèi)部數(shù)據(jù)存儲器(Rn,內(nèi)部RAM,SFR)共有4條指令:MOVA,#data;(A)#dataMOVdirect,#data;(direct)#dataMOVRi,#data;(Ri)#dataMOVRn,#data;(Rn)#data符號表示間接尋址,(Ri)表示把立即數(shù)送到由Ri寄存器的內(nèi)容所指出的那個RAM單元中去。Ri中i=0或i=1。例1MOVR0,#56HMOVR1,#59H假設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,#20HMOVR0,#56H用直接尋址只用一條指令:MOV20H,#56H而指令MOVP1,#80H則可把立即數(shù)80H直接送入P1(字節(jié)地址為90H)口中。,2.內(nèi)部數(shù)據(jù)存儲器(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)MOVRi,A;(Ri)(A)MOVRn,A;(Rn)(A)間接尋址Ri是以Ri的內(nèi)容作為地址,由于Ri為八位寄存器,尋址范圍為0255。但由于特殊功能寄存器SFR只能被直接尋址,而在SFR地址范圍(128255)中很多單元又無定義,若對之讀寫,將得不到確定的值,寫入的數(shù)也將丟失。所以對內(nèi)部數(shù)據(jù)存儲器來說間接尋址的真正作用范圍實際上只有0127個單元的內(nèi)部數(shù)據(jù)RAM地址。例4指令序列:MOVR1,#82HMOVA,R1上述指令對于8051是不正確的,因為82H是特殊功能寄存器DPL的地址值,對特殊功能寄存器來說,這種間接尋址方式無效。但是,對于8052單片機而言則是正確的,其功能是將內(nèi)部RAM的82H單元中的內(nèi)容送到A中。并且,對于8052的內(nèi)部80HFFH的RAM單元,只能使用這種間接尋址方式進行訪問。所以欲從DPL取數(shù)到累加器A,可用直接尋址方式:MOVA,82H,3.內(nèi)部數(shù)據(jù)存儲器中Rn、SFR和內(nèi)部數(shù)據(jù)RAM之間的數(shù)據(jù)傳送,共有5條指令:MOVdirect,direct;(direct目)(direct源)MOVdirect,Ri;(direct)(Ri)MOVdirect,Rn;(direct)(Rn)MOVRi,direct;(Ri)(direct)MOVRn,direct;(Rn)(direct)該5條指令共有三種尋址方式:直接尋址,寄存器尋址,寄存器間接尋址。8位直接地址可尋址0255個單元,對于8051單片機而言,則可直接尋址內(nèi)部RAM00H7FH地址空間的單元和所有特殊功能寄存器,而對80H0FFH地址中無定義的單元訪問是沒有意義的。例5指令MOVP3,P1可把P1口的內(nèi)容直接送到P3口輸出,而不必經(jīng)過累加器A“中轉(zhuǎn)”。例6若設PSW中標志位RS1、RS0為“11”,則選中第三組工作寄存器區(qū),在這種情況下:MOVdirect,R0與MOVdirect,18H兩指令是等價的。例7用立即尋址指令可直接給內(nèi)部RAM中20H、25H和P1口上置數(shù):MOV20H,#25HMOV25H,#10HMOVP1,#0CAH執(zhí)行后使(20H)=25H,(25H)=10H,(P1)=0CAH。,4.目標地址傳送,只有一條指令:MOVDPTR,#data16功能:把16位常數(shù)裝入數(shù)據(jù)指針。例8指令MOVDPTR,#2003H表示把16位常數(shù)裝入數(shù)據(jù)指針。其中DPH=20H,DPL=03H。,二、外部數(shù)據(jù)存儲器(或擴展I/O口)與累加器A傳送指令MOVX,MOVX指令主要用于累加器A和外部擴充的RAM或擴展I/O口進行數(shù)據(jù)傳送。這種傳送只有一種尋址方式,就是寄存器間接尋址。用R1或R0以寄存器間接尋址方式能訪問外部數(shù)據(jù)存儲器(或擴展I/O口)256個字節(jié)中的一個字節(jié),用16位的數(shù)據(jù)存儲器地址指針DPTR以寄存器間接尋址的方法能遍訪64K的外部數(shù)據(jù)存儲器(或擴展的I/O口)的任何單元。指令格式:MOVX,MOVXA,DPTR;(A)(DPTR)MOVXA,Ri;(A)(Ri)MOVXDPTR,A;(DPTR)(A)MOVXRi,A;(Ri)(A)例若外部數(shù)據(jù)存儲器單元中:(3007H)=(60H),(3008H)=(2FH)則執(zhí)行:MOVDPTR,#3007HMOVXA,DPTR使累加器(A)=60H,三、程序存儲器向累加器A傳送指令MOVC,對于程序存儲器,8051單片機提供了兩條極其有用的查表指令。這兩條指令采用變址尋址,以PC或DPTR為基址寄存器,以累加器A為變址寄存器,基址寄存器與變址寄存器內(nèi)容相加即得到程序存儲器某單元的地址值,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)容相加,求得程序存儲器某單元地址,再把該地址單元內(nèi)容送累加器A。指令執(zhí)行后不改變基址寄存器內(nèi)容,由于執(zhí)行16位加法,從低8位產(chǎn)生的進位將傳送到高位去,不影響任何標志。這兩條指令主要用于查表,即完成從程序存儲器讀取數(shù)據(jù)的功能。但由于兩條指令使用的基址寄存器不同,因此使用范圍也不同。,MOVCA,A+PC以PC作為基址寄存器,在CPU取完指令操作碼時PC會自動加1,指向下一條指令的第一字節(jié)地址,所以這時作為基址寄存器的PC已不是原值,而是PC+1值。因為累加器中的內(nèi)容為8位無符號整數(shù),這就使得本指令查表范圍只能在以PC當前值開始后的256個字節(jié)范圍內(nèi),偏移量的計算公式如下:偏移量:DIS=表首地址(該指令所在地址+1)例1若要根據(jù)累加器A的內(nèi)容找出由偽指令DB所定義的四個值中的一個。可用下列程序:ppqq:ADDA,#01Hppqq+2:MOVCA,A+PCppqq+3:RETppqq+4:STAR:DB66HDB77HDB88HDB99H,MOVCA,A+DPTR指令基址寄存器為數(shù)據(jù)指針DPTR,表格常數(shù)可設置在64K程序存儲器的任何地址空間,而不必像MOVCA,A+PC指令只設在PC值以下的256個單元中。其缺點是若DPTR已有它用,在賦表首地址之前必須保護現(xiàn)場,執(zhí)行完查表后再予以恢復。例2試編制根據(jù)累加器A中的數(shù)(09之間)查其平方表的子程序。COUNT:PUSHDPH;保護DPTR內(nèi)容PUSHDPL;MOVDPTR,#TABLE;賦表首址DPTRMOVCA,A+DPTR;據(jù)A中內(nèi)容查表POPDPL;恢復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)容互相交換。例設(R0)=20H,(A)=3FH,(20H)=75H,執(zhí)行指令XCHA,R0將使(A)=75H,(20H)=3FH,實現(xiàn)了累加器A和內(nèi)部RAM20H單元內(nèi)容的互換。,2半字節(jié)交換指令XCHDA,Ri;(A30)(Ri)30)該指令把累加器A的低4位和寄存器間接尋址的內(nèi)部RAM單元的低4位交換,高4位內(nèi)容不變,不影響標志位。例設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ù)是以“后進先出”的結(jié)構(gòu)方式處理的,這種“后進先出”的特點是由堆棧指針SP來控制的,SP用來自動跟蹤棧頂?shù)刂贰S捎趩纹瑱C堆棧編址采用向上生成方式,即棧底占用較低地址,棧頂占用較高地址,所以其過程為:入棧操作:先(SP)+1(SP),指向棧頂?shù)纳弦粋€空單元,后把直接尋址單元的內(nèi)容壓入SP所指的單元中。出棧操作:先彈出棧頂內(nèi)容到直接尋址單元,后(SP)-1(SP),形成新的堆棧指針。例PUSHACC;保護累加器ACC中內(nèi)容PUSHPSW;保護標志寄存器內(nèi)容;執(zhí)行服務程序POPPSW;恢復標志寄存器內(nèi)容POPACC;恢復累加器ACC中內(nèi)容該程序執(zhí)行后,累加器ACC和PSW寄存器中的內(nèi)容可得到正確的恢復。若為:PUSHACCPUSHPSWPOPACCPOPPSW則執(zhí)行后,將使得ACC和PSW中的內(nèi)容互換。,在數(shù)據(jù)傳送類操作中應注意以下幾點:1除了用POP或MOV指令將數(shù)據(jù)傳送到PSW外,傳送操作一般不影響標志位。2執(zhí)行傳送類指令時,把源地址單元的內(nèi)容送到目的地址單元后,源地址單元中的內(nèi)容不變。3對特殊功能寄存器SFR的操作必須使用直接尋址,也就是說,直接尋址是訪問SFR的唯一方式。4.對于8052單片機內(nèi)部RAM的80HFFH單元只能使用Ri間接尋址方式訪問5將累加器ACC壓入堆?;驈棾龆褩r,應使用PUSHACC和POPACC指令,不能使用PUSHA和POPA指令。否則,程序編譯會出錯。,4.5邏輯操作類指令,邏輯操作類指令共有24條,包括與、或、清除、求反、左右移位等邏輯操作。按操作數(shù)可劃分為單操作數(shù)和雙操作數(shù)兩種。單操作數(shù)是專門對累加器A進行的邏輯操作,這些操作主要是:清0、求反、左右移位等,操作結(jié)果保存在累加器A中。雙操作數(shù)主要是累加器A和第二操作數(shù)之間執(zhí)行邏輯與、或和異或操作,第二操作數(shù)可以是立即數(shù),也可以是內(nèi)部數(shù)據(jù)存儲器的Rn、內(nèi)部數(shù)據(jù)RAM單元或者SFR。其對應的尋址方式是:寄存器、寄存器間接、直接尋址。邏輯操作的結(jié)果保存在A中。也可將直接尋址單元作為第一操作數(shù),和立即數(shù),累加器A執(zhí)行邏輯與、或和異或操作,結(jié)果存在直接尋址單元中。,4.5.1對累加器A進行的邏輯操作,1.累加器A清0指令:CLRA;(A)0功能:把00H送入累加器A中2.累加器A求反指令:CPLA;(A)()功能:把累加器內(nèi)容求反后送入累加器A中。例設累加器原來內(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;交換累加器兩個半字節(jié)(4位循環(huán)移位)左移一位相當于乘2。例MOVA,#01H;01H送累加器ARLA;02H送ARLA;04H送ARLA;08H送A右移一位相當于除2,上述累加器(A)=08H,執(zhí)行指令:RRA;(A)04HRRA;(A)02HRRA;(A)01H將使累加器內(nèi)容又變?yōu)?。通過進位標志CY的移位可用于檢查一個字節(jié)中各位的狀態(tài)或用于逐位輸出的情況。,OUTP2:RRCA;通過C右移一位MOVP1,AMOVP2.0,C;該位輸出到P2.0RET;返回該程序逐位將A中的最低位移入進位位C,并由P2.0輸出。如果反復調(diào)用該程序,并且在每次調(diào)用之間加上一定的延時,就會形成“跑馬燈”的效果。,例利用8051單片機的P1口輸出控制LED的發(fā)光,電路連接如圖4-6所示。編程實現(xiàn)使累加器A中的數(shù)據(jù)循環(huán)送P1口,并使用P2.0輸出指示進位標志。,4.5.2雙操作數(shù)指令,1.累加器A與立即數(shù)、內(nèi)部存儲器之間的邏輯操作由于邏輯與、或、異或三種基本操作指令格式和尋址方式都是一樣的,故放在一起介紹。#dataANL(ORL,XRL)A,directRiRn例設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設P1內(nèi)容為0AAH,A中內(nèi)容為15H,則執(zhí)行:ANLP1,#0F0H;(P1)=0A0HORLP1,#0FH;(P1)=0AFHXRLP1,A;(P1)=0BFH邏輯操作是按位進行的,所以,“ANL”指令常用來屏蔽字節(jié)中的某些位,該位欲清除用“0”去“與”,該位欲保留用“1”去“與”;“ORL”指令常用來使字節(jié)中的某些位置“1”,欲保留(不變)的位用“0”去“或”,欲置位的位用“1”去“或”;“XRL”指令用來對字節(jié)中某些位取反。欲取反的位用“1”去“異或”,欲保留的位用“0”去“異或”。,例設兩位用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)移指令,將會使程序更簡煉。ANL40H,#0FH;40H的ASC碼變成BCD碼MOVA,41H;ANLA,#0FH;41H的ASC碼變成BCD碼SWAPA;高、低4位交換ORL40H,A;結(jié)果存40H單元中注意:當用邏輯與、或、異或指令修改一個并行I/O口輸出內(nèi)容時,則原始值將從該輸出口的鎖存器中讀取,而不是從該輸出口的引腳上讀取。,4.6算術運算類指令,該類指令主要完成加、減、乘、除四則運算,以及增量、減量和二十進制調(diào)整操作。除增量、減量指令外,這類指令大多數(shù)影響到狀態(tài)標志寄存器PSW。,4.6.1加減運算指令,加減運算中,以累加器A為第一操作數(shù),并存放操作后的中間結(jié)果。第二操作數(shù)可以是立即數(shù),工作寄存器內(nèi)容,寄存器間接尋址字節(jié)或直接尋址字節(jié),運算結(jié)果會影響溢出OV,進位CY,輔助進位AC和奇偶標志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é)果保存在累加器中,影響標志AC、CY、OV、P。例執(zhí)行指令:MOVA,#0C3HADDA,#0AAH運算后,CY=1,OV=1,AC=0,(PSW)=85H,(A)=6DH順便指出:OV溢出標志取決于帶符號數(shù)運算時,和的第6、7位中有一位產(chǎn)生進位而另一位不產(chǎn)生進位,則使OV置1,否則OV被清0。OV=1表示兩正數(shù)相加,和變成負數(shù),或兩負數(shù)相加,和變成正數(shù)的錯誤結(jié)果。,2.帶進位加法指令ADDCA,#data;(A)(A)+#data+(C)ADDCA,direct;(A)(A)+(direct)+(C)ADDCA,Ri;(A)(A)+(Ri)+(C)ADDCA,Rn;(A)(A)+(Rn)+(C)例1設累加器A內(nèi)容為0AAH,R0內(nèi)容為55H,C內(nèi)容為1,執(zhí)行指令:ADDCA,R0將使(A)=00000000BAC=1,CY=1,OV=0例2設累加器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指令可以進行多字節(jié)加法運算設雙字節(jié)加法中:被加數(shù)放20H,21H單元,加數(shù)放30H,31H單元,和存放在40H,41H單元,若高字節(jié)相加有進位則轉(zhuǎn)OVER處執(zhí)行,可編程序如下:ADD1:MOVA,20H;取低字節(jié)被加數(shù)ADDA,30H;低位字節(jié)相加MOV40H,A;結(jié)果送40H單元MOVA,21H;取高字節(jié)被加數(shù)ADDCA,31H;加高字節(jié)和低位來的進位MOV41H,A;結(jié)果送41H單元JCOVER;有進位去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é)相減時,須先清借位位,以免相減后結(jié)果出錯。例1設累加器內(nèi)容為D9H,R0內(nèi)容為87H,求兩者相減結(jié)果。CLRCSUBBA,R0執(zhí)行后(A)=52H,CY=0,OV=0若運算兩數(shù)為無符號數(shù),則其溢出與否和“OV”狀態(tài)無關而靠CY是否有進位予以判別,OV僅表明帶符號數(shù)運算時是否溢出。,例2兩字節(jié)數(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乘除運算指令,1.乘法指令MULAB該指令把累加器A和寄存器B中的8位無符號整數(shù)相乘,16位乘積的低字節(jié)在累加器A中,高字節(jié)在寄存器B中,如果乘積大于255(0FFH),則溢出標志位置1,否則清0,運算結(jié)果總使進位標志CY清0。例1設(A)=80H(128),(B)=32H(50),執(zhí)行指令:MULAB執(zhí)行結(jié)果:乘積為1900H(6400),(A)=00H,(B)=19H,OV=1,CY=0,2.除法指令DIVAB該指令把累加器A中的8位無符號整數(shù)除以寄存器B中8位無符號整數(shù),所得商放在累加器A中,余數(shù)存在寄存器B中,標志位CY和OV均清0。若除數(shù)(B中內(nèi)容)為00H,則執(zhí)行后結(jié)果為不定值,并置位溢出標志OV,在任何情況下進位標志CY總清0。例設累加器內(nèi)容為135(87H),B寄存器內(nèi)容為12(0CH),則執(zhí)行命令:DIVAB;將使(A)=0BH,(B)=03H,OV=0,CY=0,4.6.3增量、減量指令,1增量指令INCA;(A)(A)+1INCdirect;(direct)(direct)+1INCRi;(Ri)(Ri)+1INCRn;(Rn)(Rn)+1INCDPTR;(DPTR)(DPTR)+1INC指令把所指出的變量加1,結(jié)果仍送回原地址單元,原來若為0FFH,加1后將變成00H,運算結(jié)果不影響任何標志位。指令共使用3種尋址方式:寄存器尋址、直接尋址或寄存器間接尋址。若用本指令使輸出并行I/O口內(nèi)容加1時,則用作輸出口的原始值將從輸出數(shù)據(jù)鎖存器中讀入,而不是從輸出口的引腳上讀入。,例1設(R0)=7EH,內(nèi)部數(shù)據(jù)RAM中(7EH)=0FFH,(7FH)=40H,則執(zhí)行下列指令:INCR0;(7EH)00HINCR0;(R0)7FHINCR0;(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)1DECRi;(Ri)(Ri)1DECRn;(Rn)(Rn)1上述指令將指定變量減1,結(jié)果仍存在原指定單元,原指定單元內(nèi)容若為00H,減1操作后變成0FFH,不影響任何標志位。有三種尋址方式:寄存器尋址、直接尋址或寄存器間接尋址。同增量指令一樣,若執(zhí)行對I/O并行口內(nèi)容減1操作,將把該輸出口數(shù)據(jù)鎖存器讀出1,再寫入鎖存器,而不是從輸出口引腳上內(nèi)容進行減1操作。例執(zhí)行下述程序:MOVR1,#7FH;(R1)#7FHMOV7EH,#00H;(7EH)#00HMOV7FH,#40H;(7FH)#40HDECR1;(7FH)3FHDECR1;(R1)7EHDECR1;(7EH)0FFH結(jié)果:(R1)7EH,(7EH)0FFH,(7FH)3FH,4.6.4二十進制調(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等標志位才能起到正確的調(diào)整作用,因此它必須跟在加法(ADD、ADDC)指令后面才能使用。指令的操作過程為:若相加后累加器低4位大于9或半進位位AC=1,則加06H修正;若相加后累加器高4位大于9或進位位CY=1,則加60H修正;若兩者同時發(fā)生或高4位雖等于9但低4位修正有進位,則應加66H修正。例1利用十進制加法調(diào)整指令作十進制減法調(diào)整,必須采用補碼相加的方法,用9AH(即十進制的100)減法減數(shù)即得以10為模的減數(shù)補碼。設被減數(shù)存30H單元,減數(shù)存40H單元,結(jié)果存50H單元,可編程序如下:BCDSUB1:CLRC;清進位位MOVA,#9AH;求減數(shù)補碼SUBBA,40HADDA,30H;進行補碼相加DAAMOV50H,A;結(jié)果(差)存50H單元,例26位BCD碼加法設被加數(shù)存在內(nèi)部RAM中32H、31H、30H單元,加數(shù)存于42H、41H、40H單元,相加之和存于52H、51H、50H單元,若相加有進位(溢出)時轉(zhuǎn)符號地址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;有進位轉(zhuǎn)OVER處執(zhí)行,4.7位操作指令,位操作指令共有17條,均以位為處理對象,分別完成位傳送、位狀態(tài)控制、位邏輯操作、位條件轉(zhuǎn)移等功能。,CbitCC/bitC,4.7.1位數(shù)據(jù)傳送指令,MOVC,bit;(C)(bit)MOVbit,C;(bit)(C)指令完成的功能是把第二操作數(shù)所指出的布爾變量送到由第一操作數(shù)指定的位單元。其中一個操作數(shù)必為位累加器(進位標志C),另一個可以是任何直接尋址位(bit)。指令執(zhí)行結(jié)果不影響其它寄存器或標志。例1設內(nèi)部數(shù)據(jù)RAM中(20H)=7FH,執(zhí)行指令:MOVC,07H;07H是位地址,即字節(jié)地址20H的第7位,將使(C)=0。例2指令:MOV0BAH,C則表示把進位位C(位累加器)送入特殊功能寄存器IP的PX1(第2位)位。,4.7.2位狀態(tài)控制指令,1位清0指令CLRbit;(bit)0CLRC;(C)0上述指令可使直接尋址位(bit)或位累加器C清零,不影響其它標志。例內(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)容取反,不影響其它標志。例執(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”上述指令把進位標志C或任何可尋址位置“1”,不影響其它標志。例進位標志C內(nèi)容為0,輸出口P1原已寫入了49H(01001001B),則執(zhí)行SETBCSETBP1.7將使進位標志(C)=1,P1口輸出數(shù)據(jù)變?yōu)镃9H(11001001B)。,4.7.3位邏輯操作指令,1位邏輯“與”指令ANLC,bit;(C)(bit)ANLC,/bit;(C)(/bit)上述指令將直接尋址位的內(nèi)容或直接尋址位內(nèi)容取反后(不改變原內(nèi)容)與位累加器C相與,結(jié)果保存在C中?!?bit”表示對該尋址位內(nèi)容取反后再進行位操作。例當位地址(7FH)=1,累加器中(ACC.7)=1,同時(B.0)=0,進位位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)容取反后(不改變原尋址內(nèi)容)與位累加器C進行邏輯“或”,結(jié)果保存在C中,“/bit”含義同上。位邏輯“或”操作的示意圖如圖4-4所示。例位地址7FH中的內(nèi)容和累加器ACC.7,寄存器B.0中內(nèi)容相“或”的程序如下:(設(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í)行。上述兩條指令通過判進位C的狀態(tài)決定程序的走向,前一條若進位標志為1,后一條若進位標志為0,就可使程序轉(zhuǎn)向目標地址,否則順序執(zhí)行下一條指令。目標地址為第二字節(jié)中的帶符號的偏移量與PC當前值(PC)2(PC)之和,不影響任何標志。在實際應用中,一般在rel的位置寫入欲跳轉(zhuǎn)到的標號地址,偏移量由匯編程序自動進行計算。下面的兩段指令都將使程序轉(zhuǎn)向L2處執(zhí)行:例1CLRC;C0JCL1;C=0不轉(zhuǎn),繼續(xù)執(zhí)行CPLC;C=1JCL2;條件滿足轉(zhuǎn)L2L1:;L2:;例2SETBC;C=1JNCL1;C0,順序執(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í)行。上述指令檢測直接尋址位,若位變量為1(第一、三條指令)或位變量為0(第二條指令),則程序轉(zhuǎn)向目標地址去執(zhí)行,否則順序執(zhí)行下條指令。目標地址為PC當前值(PC)(PC)3)與第三字節(jié)所給帶符號的相對偏移量之和。測試位變量時,不影響任何標志,前兩條指令不影響原變量值,但后一條指令不管原變量為何值,檢測后即行清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位地址的長調(diào)用、短調(diào)用指令可遍訪程序存儲器空間的任一地址單元,也可用具有11位地址的絕對調(diào)用和絕對轉(zhuǎn)移指令,實現(xiàn)在2K程序塊中的有效轉(zhuǎn)移。此外,全空間(64K)的長間接轉(zhuǎn)移和一頁范圍的短相對轉(zhuǎn)移以及條件轉(zhuǎn)移指令,使得用戶可靈活選擇,給程序編制帶來了很大的方便。這類指令可分為兩種:一種是程序轉(zhuǎn)移指令,另一種稱為子程序調(diào)用和返回指令。,在實際應用中,一般在偏移量(rel)或者跳轉(zhuǎn)地址(addr16或addr11)的位置寫入欲跳轉(zhuǎn)到的標號地址,由匯編程序自動進行計算。,4.8.1程序轉(zhuǎn)移指令,1無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令控制程序計數(shù)器從現(xiàn)行值轉(zhuǎn)移到目標地址,該目標地址可通過直接,間接或相對尋址得到。(1)長轉(zhuǎn)移指令LJMPaddr16;(PC)addr16指令提供16位目標地址,將指令中第二,第三字節(jié)地址碼分別裝入PC的高8位和低8位中,程序無條件轉(zhuǎn)向指定的目標地址去執(zhí)行。不影響標志位。由于直接提供16位目標地址,所以執(zhí)行這條指令可以使程序從當前地址轉(zhuǎn)移到64K程序存儲器地址空間的任何單元。例在程序存儲器0000H單元存放一條指令LJMP2030H則上電復位后程序?qū)⑻?030H單元去執(zhí)行,這樣可以就避開00030023H的中斷服務程序入口的保留單元。,(2)絕對轉(zhuǎn)移指令AJMPaddrll雙字節(jié)指令,第二字節(jié)存放的是低8位地址,第一字節(jié)5、6、7位存放著高3位地址a8a10。指令執(zhí)行時分別把高3位和低8位地址值取出送入程序計數(shù)器PC的低11位,維持PC的高5位(PC)2后的)地址值不變,實現(xiàn)2K范圍內(nèi)的程序轉(zhuǎn)移。由于AJMP為雙字節(jié)指令,當程序真正轉(zhuǎn)移時PC值已加2了,因此轉(zhuǎn)移的目標地址應與AJMP下相鄰指令第一字節(jié)地址在同一2K字節(jié)范圍內(nèi)。如果超過了2K范圍,匯編程序會提示出錯信息。本指令不影響標志位。,(3)相對短轉(zhuǎn)移指令SJMPrel;(PC)(PC)2;(PC)(PC)rel其中,rel為相對偏移量,是一個8位帶符號的數(shù)。指令控制程序無條件轉(zhuǎn)向指定地址。該指定地址由指令第二字節(jié)的相對地址和程序計數(shù)器PC的當前值(執(zhí)行SJMP前的PC值加2)相加形成。因而轉(zhuǎn)向地址可以在這條指令首地址的前128字節(jié)到后127字節(jié)之間。如果程序中使用:HARE:SJMPHARE將會造成單指令的無限循環(huán)。,(4)間接轉(zhuǎn)移指令JMPA+DPTR;(PC)(A)+(DPTR)該指令把累加器里的8位無符號數(shù)與作為基址寄存器DPTR中的16位數(shù)據(jù)相加,所得的值裝入程序計數(shù)器PC做為轉(zhuǎn)移的目標地址。指令執(zhí)行后不影響累加器和數(shù)據(jù)指針中的原內(nèi)容,不影響任何標志。這是一條極其有用的多分支選擇轉(zhuǎn)移指令,其轉(zhuǎn)移地址不是匯編或編程時確定的,而是在程序運行時動態(tài)決定的,這也是和前三條指令的主要區(qū)別。正由于此,可在DPTR中裝入多分支轉(zhuǎn)移程序的首地址,而由累加器A的內(nèi)容來動態(tài)選擇其中的某一個分支予以轉(zhuǎn)移,這就可用一條指令代替眾多轉(zhuǎn)移指令,實現(xiàn)以DPTR內(nèi)容為起始的256個字節(jié)范圍的選擇轉(zhuǎn)移。,例要求當(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)索引號RLA;將索引號乘以2(由于AJMP指令是2字節(jié)指令)JMPA+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é),在實際應用中,由于AJMP和SJMP指令的跳轉(zhuǎn)范圍有限,而LJMP(長轉(zhuǎn)移指令)不受跳轉(zhuǎn)范圍的限制,因此一般情況下可以使用LJMP指令代替AJMP和SJMP指令。,2條件轉(zhuǎn)移指令該類指令執(zhí)行滿足某種特定條件的轉(zhuǎn)移,其目標地址在以下一條指令的起始地址為中心的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é)為符號的相對偏移量,PC現(xiàn)行值(PC加2后)與偏移量相加即得轉(zhuǎn)移地址。該指令不改變累加器內(nèi)容,不影響標志位。例執(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類指令比較前面兩個操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移,相等則繼續(xù)執(zhí)行。這些指令均為三字節(jié)指令,PC當前值(PC)3(PC)與指令第三字節(jié)帶符號的偏移量相加即得到轉(zhuǎn)移地址,如果目的字節(jié)的無符號整數(shù)值小于源字節(jié)的無符號整數(shù)值,則置位進位標志,否則清0進位位,指令不影響任何一個操作數(shù)。指令的源和目的操作數(shù)有4種尋址方式組合:累加器可以和任何直接尋址字節(jié)或立即數(shù)比較,而任何間接尋址RAM單元或工作寄存器能與立即數(shù)比較。,具體的比較轉(zhuǎn)移指令有4條:CJNEA,#data,relCJNEA,direct,relCJNERi,#data,relCJNERn,#data,rel例1設(R7)=56H,執(zhí)行下列指令CJNER7,#60H,K1;由于(R7)60H,轉(zhuǎn)K1,且(CY)1K1:JCK3;因為(CY)=1,判出(R7)60H,轉(zhuǎn)K3執(zhí)行K3:例2設P1口P1.0P1.3為準備就緒信號輸入端,當該4位輸入全“1”說明各項工作已準備好,單片機可順序執(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,不影響任何標志。共有兩條指令:DJNZdirect,relDJNZRn,rel由于被減1的第一操作數(shù)可為一個工作寄存器或直接尋址字節(jié),所以使用該指令可以很容易地構(gòu)成循環(huán),只要給直接地址或工作寄存器賦不同初值,就可方便地控制循環(huán)次數(shù),而使用不同的工作單元或寄存器就可派生出很多條循環(huán)轉(zhuǎn)移指令。,例1軟件延時利用DJNZ指令可在一段程序中插入某些指令來實現(xiàn)軟件延時。DJNZ指令執(zhí)行時間為2個機器周期,這樣循環(huán)一次可產(chǎn)生2個機器周期延時。下例在程序段中插入2條指令,當主頻12MHz,循環(huán)次數(shù)為24時,可產(chǎn)生49us的軟件延時循環(huán),在P1.7引腳上輸出一個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)-10轉(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多項單字節(jié)數(shù)求和設數(shù)組長度放R0,數(shù)組存放首地址在R1中,數(shù)組之和則存在20H單元中,因為是8位字長,所以此和不應大于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(長調(diào)用)及ACALL(絕對調(diào)用)和一條與之配對的子程序返回指令RET。LCALL和ACALL指令類似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們在轉(zhuǎn)移前,要把執(zhí)行完該指令后PC的內(nèi)容自動壓入堆棧,才做addr16(或addr11)PC的工作(其中addr16或addr11是子程序的首地址或稱子程序入口地址)。這樣設計是為了便于當子程序執(zhí)行完后,CPU可以找到(返回)原出發(fā)點處。RET指令是子程序返回指令,執(zhí)行時,從堆棧中把原出發(fā)地址彈回PC,讓CPU返回執(zhí)行原主程序。,1長調(diào)用指令LCALLaddr16長調(diào)用與LJMP一樣提供16位地址,可調(diào)用64K范圍內(nèi)所指定的子程序,由于為三字節(jié)指令,所以執(zhí)行時首先(PC)+3(PC)以獲得下一條指令地址,并把此時PC內(nèi)容壓入(作為返回地址,先壓入低字節(jié)后壓入高字節(jié))堆棧,堆棧指針SP加2指向棧頂,然后把目標地址addr16裝入PC,轉(zhuǎn)去執(zhí)行子程序。顯然使用該指令可使子程序在64K范圍內(nèi)任意存放。指令執(zhí)行不影響標志位。例設(SP)=53H,子程序首址在3000單元,并以標號STR表示。在(PC)=2000H處執(zhí)行指令:LCALLSTR將使(SP)=55H,(54H)=03H(PC)3PC之值),(55H)=20H,(PC)3(PC)高字節(jié)值),PC將變?yōu)?000H。,2絕對調(diào)用指令ACALLaddr11該指令提供11位目標地址,限在2K地址內(nèi)調(diào)用,由于是雙字節(jié)指令,所有執(zhí)行時(PC)2(PC)以獲得下一條指令的地址然后把該地址壓入堆棧作為返回地址,其它操作與AJMP相同。,由于ACALL指令的調(diào)用范圍受2K的限制,因此,一般程序中使用LCALL指令代替ACALL指令。,3返回指令RET;RET表示子程序結(jié)束需要返回主程序,所以執(zhí)行該指令時,分別從棧中彈出調(diào)用子程序時壓入的返回地址,使程序從調(diào)用指令(LCALL或ACALL)的下面相鄰指令開始繼續(xù)執(zhí)行程序。例設(SP)=55H,RAM中(54H)=03H,(55H)=20H,則執(zhí)行RET后,使:(SP)=53H(PC)=2003H程序由2003H開始繼續(xù)執(zhí)行。4中斷返回指令RETI;該指令用于中斷服務子程序的返回,其執(zhí)行過程類似于RET,詳見中斷一章介紹。,5空操作指令NOPNOP操作:(PC)(PC)1執(zhí)行本指令除了PC加1外,機器不作任何操作,而轉(zhuǎn)向下一條指令去執(zhí)行。不影響任何寄存器和標志。由于為單周期指令,所以時間上只有一個機器周期,常用于精確延時或等待。例利用NOP指令產(chǎn)生方波。LOOP:CLRP2.7;P2.7清0輸出NOP;NOP;空操作NOP;NOP;SETBP2.7;置位P2.7高電平NOP;NOP;空操作NOP;NOP;LJMPLOOP,4.9思考題見教材習題,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 單片機 原理 應用 陳桂友 指令系統(tǒng)
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.italysoccerbets.com/p-11648767.html