單片機(jī)原理及應(yīng)用李林功著第03章 指令系統(tǒng)_第1頁(yè)
單片機(jī)原理及應(yīng)用李林功著第03章 指令系統(tǒng)_第2頁(yè)
單片機(jī)原理及應(yīng)用李林功著第03章 指令系統(tǒng)_第3頁(yè)
單片機(jī)原理及應(yīng)用李林功著第03章 指令系統(tǒng)_第4頁(yè)
單片機(jī)原理及應(yīng)用李林功著第03章 指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第03章指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)3.1指令格式 3.2尋址方式 3.3數(shù)據(jù)傳送類指令 3.4算術(shù)運(yùn)算類指令

3.5邏輯運(yùn)算類指令 3.6控制轉(zhuǎn)移類指令 3.7位操作類指令

MCS-51單片機(jī)指令系統(tǒng)1.按指令所占的字節(jié)數(shù)可分為:(1)單字節(jié)指令(49條)(2)雙字節(jié)指令(46條)(3)三字節(jié)指令(16條)2.按指令的執(zhí)行時(shí)間可分為:(1)單周期指令(65條)(2)雙周期指令(44條)(3)四周期指令(2條)3、按指令的功能可分為:(1)數(shù)據(jù)傳送類指令(29條)(2)算術(shù)運(yùn)算類指令(24條)(3)邏輯運(yùn)算類指令(24條)(4)控制轉(zhuǎn)移類指令(17條)(5)位操作類指令(17條)3.1MCS-51單片機(jī)指令格式 [標(biāo)號(hào):]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]例如:AA:ADDA,﹟10H;將累加器A的內(nèi)容與10H相加,結(jié)果存入累加器A AA為標(biāo)號(hào),是這條指令的標(biāo)志,其值是該條指令的首地址;

ADD為操作碼,說(shuō)明要進(jìn)行加法運(yùn)算;目的操作數(shù)為累加器A;源操作數(shù)為﹟10H;“;”后面為注釋部分。

MCS-51單片機(jī)指令中常用的符號(hào)規(guī)定:1)A(ACC)——累加器。2)B——專用寄存器,用于乘法和除法指令中。3)C——進(jìn)位標(biāo)志或進(jìn)位位,或布爾處理機(jī)中的累加位(器)4)DPTR——數(shù)據(jù)指針,可用作16位地址寄存器。5)Rn(n=0~7)——當(dāng)前寄存器組的8個(gè)工作寄存器R0~R7,由PSW中的RS1、RS0決定當(dāng)前使用的寄存器組。6)Ri(i=0或1)——可用于間接尋址的兩個(gè)寄存器R0、R1。7)#data——8位立即數(shù)8)#data16——16位立即數(shù)。9)rel——以補(bǔ)碼形式表示的8位相對(duì)偏移量,范圍為-128~127,主要用在相對(duì)尋址的指令中。10)addr16和addr11——分別表示16位直接地址和11位直接地址。即存放操作數(shù)的存儲(chǔ)器地址。11)direct——表示內(nèi)部數(shù)據(jù)存貯器單元的地址或特殊功能寄存器SFR的地址,對(duì)SFR而言,既可使用它的物理地址,也可直接使用它的名字。12)bit——表示內(nèi)部RAM和SFR中的某些具有位尋址功能的位地址。SFR中的位地址可以直接出現(xiàn)在指令中,為了閱讀方便,往往也可用SFR的名字和所在的數(shù)位表示。如:表示PSW中的奇偶校驗(yàn)位,可寫成D0H,也可寫成PSW.0的形式。13)@——間接尋址中工作寄存器的前綴符號(hào)。14)(X)——X單元中的內(nèi)容。15)((X))——以X單元的內(nèi)容為地址的存儲(chǔ)器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用((X))表示。16)$——當(dāng)前指令的地址。17)/——“/”表示對(duì)該位操作數(shù)取反,但不影響該位的原值。18)→——“→”表示操作流程,將箭尾一方的內(nèi)容送入箭頭所指的另一方單元中。3.2MCS-51單片機(jī)尋址方式1立即數(shù)尋址

立即尋址方式是指操作數(shù)包括在指令字節(jié)中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲(chǔ)器中。符號(hào)"#"為立即數(shù)前綴【例】:MOVA,#52H;A←52HMOVDPTR,#5678H;DPTR←5678H2寄存器尋址

指令指定寄存器的名字,寄存器的內(nèi)容為操作數(shù)【例】:MOVA,R0 ;A←(R0)

可用于寄存器尋址的寄存器有: (1)四組工作寄存器R0~R7共32個(gè)。 (2)部分特殊功能寄存器A、B、DPTR等。3寄存器間接尋址

指令指定寄存器的名字,寄存器的內(nèi)容為操作數(shù)的存儲(chǔ)器地址。標(biāo)志為寄存器名字前加“@”符號(hào)。不同的存儲(chǔ)空間要用不同的寄存器,規(guī)定如下:片內(nèi)(128B)間接用Ri,即@R1,@R0片外(64KB)間接用DPTR,即@DPTR片外(低256B)可用@DPTR或@R1,@R0

注意:寄存器間接尋址方式不能用于對(duì)特殊功能寄存器SFR的尋址,堆棧操作(PUSH,POP)為隱含的SP間接尋址?!纠浚篗OVDPTR,#3456H;DPTR←3456HMOVXA,@DPTR;A←((DPTR))

假設(shè)(3456H)=99H,指令運(yùn)行后(A)=99H。4直接尋址指令中直接給出操作數(shù)的存儲(chǔ)器地址,操作數(shù)在存儲(chǔ)器中。

【例】:MOVA,52H ;A←(52H)基址寄存器加變址寄存器的間接尋址

三條變址指令MOVCA,@A+PC;A←((A)+(PC))MOVCA,@A+DPTR;A←((A)+(DPTR))JMP@A+DPTR;PC←(A)+(DPTR)前兩條指令是在程序存儲(chǔ)器中取操作數(shù);第三條指令是要獲得程序的跳轉(zhuǎn)地址,實(shí)現(xiàn)程序的轉(zhuǎn)移。5變址尋址【例】:MOVA,#22H MOVDPTR,#63A0H MOVCA,@A+DPTR;A←((A)+(DPTR))6相對(duì)尋址相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值作為基地址,與指令中給出的相對(duì)偏移量rel進(jìn)行相加,把所得之和作為程序的轉(zhuǎn)移地址.。在使用相對(duì)尋址時(shí)要注意以下兩點(diǎn):

(1)當(dāng)前PC值是指相對(duì)轉(zhuǎn)移指令的存儲(chǔ)地址加上該指令的字節(jié)數(shù)。(2)偏移量rel是有符號(hào)的單字節(jié)數(shù),以補(bǔ)碼表示,其取值范圍是-128~+127(00H~FFH)。 目標(biāo)地址=當(dāng)前PC值+rel=指令存儲(chǔ)地址+指令字節(jié)數(shù)+rel【例】:SJMP08H;PC←PC+2+08H

設(shè)該指令首地址為2000H,PC+2=2002H。因此程序轉(zhuǎn)向(PC)+2+rel=2000H+2+08H=200AH單元。7位尋址

位尋址是在指令中直接給出操作數(shù)的位地址。①直接位地址【例】:MOVC,0D5H ;PSW的位5(位地址D5H)②點(diǎn)操作符.【例】:MOVC,PSW.5 MOVC,0D0H.5

③位名稱表示形式【例】:MOVC,F(xiàn)0④用戶位定義

LEDBITP1.1MOVLED,C尋址方式與尋址空間尋址方式利用的變量

尋址空間1立即尋址#data程序存儲(chǔ)器2寄存器尋址R0~R7﹑A﹑B﹑DPTR工作寄存器和部分SFR3寄存器間接尋址@R0﹑@R1﹑SP片內(nèi)RAM低128B@R0﹑@R1﹑@DPTR片外RAM或外部I/0口4直接尋址direct片內(nèi)RAM低128B和SFR5變址尋址@A+PC﹑@A+DPTR程序存儲(chǔ)器6相對(duì)尋址PC+偏移量程序存儲(chǔ)器相對(duì)PC當(dāng)前值256B7位尋址bit片內(nèi)位尋址區(qū)和部分SFR存儲(chǔ)空間與尋址方式內(nèi)部00H~1FH工作寄存器寄存器、直接、間接內(nèi)部20H~2FH位空間位、直接、間接內(nèi)部30H~7FH用戶RAM直接、間接內(nèi)部80H~FFH特殊功能寄存器SFR直接、位(部分)外部RAM間接外部ROM程序存儲(chǔ)器變址、相對(duì)3.3數(shù)據(jù)傳送類指令助記符有:MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP,SWAP。格式:MOV[目的操作數(shù)],[源操作數(shù)]功能:目的操作數(shù)←源操作數(shù)中的數(shù)據(jù)源操作數(shù)可以是:A、Rn、direct、@Ri、#data目的操作數(shù)可以是:A、Rn、direct、@Ri注意:一般不影響標(biāo)志,只有一種堆棧操作可能直接修改程序狀態(tài)字PSW。另外,如果目的操作數(shù)為ACC,將會(huì)影響奇偶標(biāo)志P。指令功能標(biāo)志位解釋POVACCYMOVA,directA←(direct)√×××直接地址單元地址中的內(nèi)容送到累加器AMOVA,#dataA←#data√×××立即數(shù)送到累加器A中MOVA,RnA←(Rn)√×××Rn中的內(nèi)容送到累加器A中MOVA,@RiA←((Ri))√×××Ri內(nèi)容指向的地址單元中的內(nèi)容送到累加器A1.以累加器A為目的操作數(shù)的傳送指令(4條)

【例】:設(shè)外部RAM(2023H)=0FH,執(zhí)行以下程序段:

MOVDPTR,#2023H;DPTR←2023H MOVXA,@DPTR ;A←((DPTR)) MOV30H,A ;30H←(A) MOVA,#00H ;A←00H MOVX@DPTR,A ;((DPTR))←(A)

程序段執(zhí)行后,(DPTR)=2023H,(30H)=0FH,(A)=00H,(2023H)=00H,表示把片外RAM2023H單元的內(nèi)容0FH送到內(nèi)部RAM的30H單元,然后把外部RAM2023H單元和累加器A清0。 若采用R0和R1間接尋址,必須把高8位地址先送到P2口,上述程序段將改為:

MOVP2,#20H ;P2←20H MOVR0,#23H ;R0←23H MOVXA,@R0 ;A←(2023H) MOV30H,A ;30H←(A) MOVA,00H ;A←00H MOVX@R0,A ;2023H←(A)2.以寄存器Rn為目的操作數(shù)的傳送指令(3條)注意:沒(méi)有以下指令MOVRn,Rn;MOVRn,@Ri;MOV@Ri,Rn指令功能標(biāo)志位解釋POVACCYMOVRn,directRn←(direct)××××直接地址單元中的內(nèi)容送到寄存器Rn中MOVRn,#dataRn←#data××××立即數(shù)送到寄存器Rn中MOVRn,ARn←(A)××××累加器A中的內(nèi)容送到寄存器Rn中

【例】:設(shè)內(nèi)部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=0CAH,分析以下程序執(zhí)行后,各單元、寄存器、P2口的內(nèi)容。

MOVR0,#30H ;R0←30H MOVA,@R0 ;A←((R0)) MOVR1,A ;R1←(A) MOVB,@R1 ;B←((R1)) MOV@R1,P1 ;((R1))←(P1) MOVP2,P1 ;P2←(P1) MOV10H,#20H ;(10H)←20H執(zhí)行上述指令后,(R0)=30H;(R1)=(A)=40H;(B)=10H;(40H)=(P1)=(P2)=0CAH;(10H)=20H。3.以直接地址為目的操作數(shù)的傳送指令(5條)注意:MOVdirect1,direct2,翻譯成機(jī)器碼時(shí),源地址在前,目的地址在后。例MOV20H,30H翻譯為:853020H指令功能標(biāo)志位解釋POVACCYMOVdirect,directdirect←(direct)××××直接地址單元中的內(nèi)容送到直接地址單元MOVdirect,#datadirect←#data××××立即數(shù)送到直接地址單元MOVdirect,Adirect←(A)××××累加器A的內(nèi)容送到直接地址單元MOVdirect,Rndirect

←(Rn)××××寄存器Rn的內(nèi)容送到直接地址單元MOVdirect,@Ridirect←((Ri))××××寄存器Ri中的內(nèi)容指定的存儲(chǔ)單元中的數(shù)據(jù)送到直接地址單元4.以間接地址為目的操作數(shù)的傳送指令(3條)指令功能標(biāo)志位解釋POVACCYMOV@Ri,direct(Ri)←(direct)××××直接地址單元中的內(nèi)容送到以Ri中的內(nèi)容為地址的RAM單元MOV@Ri,#data(Ri)←#data××××立即數(shù)送到以Ri中的內(nèi)容為地址的RAM單元MOV@Ri,A(Ri)←(A)××××累加器A中的內(nèi)容送到以Ri中的內(nèi)容為地址的RAM單元5.查表指令(2條)指令功能標(biāo)志位解釋POVACCYMOVCA,@A+DPTRA←((A)+(DPTR))√×××DPTR的內(nèi)容加上A的內(nèi)容作為存儲(chǔ)器地址,將該地址單元中的內(nèi)容送到累加器A中MOVCA,@A+PCPC←(PC)+1A←((A)+(PC))√×××PC的內(nèi)容加上1,再加上A的內(nèi)容作為存儲(chǔ)器地址,將該地址單元中的內(nèi)容送到累加器A中

【例】:編一查表程序?qū)?nèi)部ROM40H單元內(nèi)的數(shù)(0~9)的平方存入內(nèi)部RAM50H單元。

MOVA,40H;40H單元的數(shù)送A MOVDPTR,#TAB;DPTR指向表頭

MOVCA,@A+DPTR ;查表

MOV50H,A;結(jié)果存50H SJMP$;等待

TAB:DB0,1,4,9,……81

【例】:編一查表程序?qū)?nèi)部RAM40H單元內(nèi)的數(shù)(0~9)的平方存入內(nèi)部RAM50H單元。

00219=3^300204=2^200191=1^100180=0^00017SJMP$0016MOV50H,A0014MOVCA,@A+DPTR0012MOVDPTR,#TAB0010MOVA,40H地址……指令……TABROM平方數(shù)據(jù)表50H…………40H2RAM6.累加器A與片外數(shù)據(jù)存儲(chǔ)器的傳送指令(4條)指令功能標(biāo)志位解釋POVACCYMOVX@DPTR,A(DPTR)←(A)√×××累加器中的內(nèi)容送到數(shù)據(jù)指針指向的片外RAM地址中MOVXA,@DPTRA←((DPTR))√×××數(shù)據(jù)指針指向的片外RAM地址中的內(nèi)容送到累加器A中MOVXA,@RiA←((Ri))√×××寄存器Ri指向的片外RAM地址中的內(nèi)容送到累加器A中MOVX@Ri,A(Ri)←(A)√×××累加器中的內(nèi)容送到寄存器Ri指向的片外RAM地址中注意:在堆棧指令中只能用ACC,不能用A,屬于直接尋址。7.堆棧操作類指令(2條)指令功能標(biāo)志位解釋POVACCYPUSHdirectSP←(SP)+1,SP←(direct)××××堆棧指針首先加1,直接尋址單元中的數(shù)據(jù)送到堆棧指針SP所指的單元中POPdirectdirect←(SP),SP←(SP)-1××××堆棧指針SP所指的單元數(shù)據(jù)送到直接尋址單元中,堆棧指針SP減1.

【例】:進(jìn)入中斷服務(wù)程序時(shí),常把程序狀態(tài)寄存器PSW、累加器A、數(shù)據(jù)指針DPTR進(jìn)棧保護(hù)。設(shè)當(dāng)前SP為60H。則程序段

MOVSP,#60H PUSHPSW PUSHACC PUSHDPL PUSHDPH執(zhí)行后,SP內(nèi)容修改為64H,而61H、62H、63H、64H單元中依次存入PSW、A、DPL、DPH的內(nèi)容。65H64HDPH63HDPL62HACC61HPSW60H……40HRAMSP堆棧區(qū)

【例】:在中斷服務(wù)程序結(jié)束之前,用下列程序段恢復(fù)數(shù)據(jù)。

POPDPH POPDPL POPACC POPPSW指令執(zhí)行之后,SP內(nèi)容修改為60H,而64H、63H、62、61H單元的內(nèi)容依次彈出到DPH、DPL、A、PSW中。保護(hù)數(shù)據(jù)時(shí),進(jìn)棧、出棧的次序一定要符合“先進(jìn)后出”的原則。8.交換指令(5條)指令功能標(biāo)志位解釋POVACCYXCHA,Rn(A)←→(Rn)√×××累加器與工作寄存器Rn的內(nèi)容互換XCHA,@Ri(A)←→((Ri))√×××累加器與工作寄存器Ri所指的存儲(chǔ)單元中的內(nèi)容互換XCHA,direct(A)←→(direct)√×××累加器與直接地址單元中的內(nèi)容互換XCHDA,@Ri(A3-0)←→((Ri)3-0)√×××累加器與工作寄存器Ri所指的存儲(chǔ)單元中的內(nèi)容低半字節(jié)互換SWAPA(A3-0)←→(A7-4)×累加器中的內(nèi)容高低半字節(jié)互換【例】:設(shè)(R0)=30H,(A)=65H,(30H)=8FH執(zhí)行指令:XCHA,@R0 ;(R0)=30H,(A)=8FH, (30H)=65HXCHDA,@R0 ;(R0)=30H,(A)=6FH, (30H)=85HSWAPA ;(A)=56H指令功能標(biāo)志位解釋POVACCYMOVDPTR,#data16DPH←#dataH,DPL←#dataL××××16位常數(shù)的高8位送到DPH,低8位送到DPL9.16位數(shù)據(jù)傳送指令(1條)

【例】:將片內(nèi)RAM30H單元與40H單元中的內(nèi)容互換。 方法1(直接地址傳送法):

MOV31H,30H MOV30H,40H MOV40H,31H SJMP $

方法2(間接地址傳送法):

MOVR0,#40H MOVR1,#30H MOVA,@R0 MOVB,@R1 MOV@R1,A MOV@R0,B SJMP$

方法3(字節(jié)交換傳送法):

MOVA,30H XCHA,40H MOV30H,A SJMP$

方法4(堆棧傳送法):

PUSH30H PUSH40H POP30H POP40H SJMP$3.4算術(shù)運(yùn)算類指令算術(shù)運(yùn)算指令共有24條算術(shù)運(yùn)算主要是執(zhí)行加、減、乘、除法四則運(yùn)算;加1、減1操作及BCD碼的運(yùn)算調(diào)整利用進(jìn)位標(biāo)志C,可進(jìn)行多字節(jié)無(wú)符號(hào)整數(shù)運(yùn)算利用溢出標(biāo)志,還可以對(duì)帶符號(hào)數(shù)進(jìn)行補(bǔ)碼運(yùn)算除加1、減1指令外,這類指令都對(duì)PSW有影響

MnemonicDescriptionByteCycleADDA,RnAddstheregistertotheaccumulator11ADDA,directAddsthedirectbytetotheaccumulator22ADDA,@RiAddstheindirectRAMtotheaccumulator12ADDA,#dataAddstheimmediatedatatotheaccumulator22ADDCA,RnAddstheregistertotheaccumulatorwithacarryflag11ADDCA,directAddsthedirectbytetotheaccumulatorwithacarryflag22ADDCA,@RiAddstheindirectRAMtotheaccumulatorwithacarryflag12ADDCA,#dataAddstheimmediatedatatotheaccumulatorwithacarryflag22SUBBA,RnSubtractstheregisterfromtheaccumulatorwithaborrow11SUBBA,directSubtractsthedirectbytefromtheaccumulatorwithaborrow22SUBBA,@RiSubtractstheindirectRAMfromtheaccumulatorwithaborrow12SUBBA,#dataSubtractstheimmediatedatafromtheaccumulatorwithaborrow221.加法指令(4條)指令功能標(biāo)志位解釋POVACCYADDA,#dataA←(A)+#data√√√√累加器A中的內(nèi)容與立即數(shù)#data相加,結(jié)果存在A中ADDA,directA←(A)+(direct)√√√√累加器A中的內(nèi)容與直接地址單元中的內(nèi)容相加,結(jié)果存在A中ADDA,RnA←(A)+(Rn)√√√√累加器A中的內(nèi)容與工作寄存器Rn中的內(nèi)容相加,結(jié)果存在A中ADDA,@RiA←(A)+((Ri))√√√√累加器A中的內(nèi)容與工作寄存器Ri所指向地址單元中的內(nèi)容相加,結(jié)果存在A中

各標(biāo)志位的形成方法:如果位7有進(jìn)位輸出,則置位CY,否則清CY;如果位3有進(jìn)位輸出,則置位AC,否則清AC;

OV=CY7⊕CY6。若累加器A中1的個(gè)數(shù)為奇數(shù),則P=1,否則,P=0。

CYACF0RS1RS0OV--P【例】:設(shè)(A)=85H,(R1)=30H,(30H)=0AFH,執(zhí)行指令:

ADDA,@R1 10000101

+10101111 100110100執(zhí)行結(jié)果為:(A)=34H,CY=1,AC=1,OV=1,P=1

對(duì)于加法,溢出只能發(fā)生在兩個(gè)加數(shù)符號(hào)相同的情況。在進(jìn)行帶符號(hào)數(shù)的加法運(yùn)算時(shí),溢出標(biāo)志OV=1表示有溢出發(fā)生(即和大于+127或小于~128)。指令功能標(biāo)志位解釋POVACCYADDCA,directA←(A)+(direct)+(CY)√√√√累加器A中的內(nèi)容與直接地址單元的內(nèi)容連同進(jìn)位位相加,結(jié)果存在A中ADDCA,#dataA←(A)+#data+(CY)√√√√累加器A中的內(nèi)容與立即數(shù)連同進(jìn)位位相加,結(jié)果存在A中ADDCA,RnA←(A)+(Rn)+(CY)√√√√累加器A中的內(nèi)容與工作寄存器Rn中的內(nèi)容、連同進(jìn)位位相加,結(jié)果存在A中ADDCA,@RiA←(A)+((Ri))+(CY)√√√√累加器A中的內(nèi)容與工作寄存器Ri指向的地址單元中的內(nèi)容、連同進(jìn)位位相加,結(jié)果存在A中2.帶進(jìn)位加法指令(4條)3.帶借位減法指令(4條)指令功能標(biāo)志位解釋POVACCYSUBBA,directA←(A)-(direct)-(CY)√√√√累加器A中的內(nèi)容減去直接地址單元中的內(nèi)容再減借位位,結(jié)果存在A中SUBBA,#dataA←(A)-#data-(CY)√√√√累加器A中的內(nèi)容減立即數(shù)再減借位位,結(jié)果存在A中SUBBA,RnA←(A)-(Rn)-(CY)√√√√累加器A中的內(nèi)容減工作寄存器中的內(nèi)容再減借位位,結(jié)果存在A中SUBBA,@RiA←(A)-((Ri))-(CY)√√√√累加器A中的內(nèi)容減工作寄存器Ri指向的地址單元中的內(nèi)容再減借位位,結(jié)果存在A中

在減法運(yùn)算中CY=1表示有借位,CY=0則無(wú)借位。OV=1表明帶符號(hào)數(shù)相減時(shí),從一個(gè)正數(shù)減去一個(gè)負(fù)數(shù)結(jié)果為負(fù)數(shù),或者從一個(gè)負(fù)數(shù)中減去一個(gè)正數(shù)結(jié)果為正數(shù)的錯(cuò)誤情況。在進(jìn)行減法運(yùn)算前,如果不知道借位標(biāo)志位C的狀態(tài),則應(yīng)先對(duì)CY進(jìn)行清零操作。如果要進(jìn)行不帶借位減法,只需把CY先清零

【例】: 設(shè)(A)=0C9H,(R3)=54H,(CY)=1,執(zhí)行指令:

SUBBA,R3 11001001 -00000001 11001000 -0101010001110100

結(jié)果:(A)=74H,Cy=0,AC=0,OV=1,P=0在乘法運(yùn)算時(shí),如果OV=1,說(shuō)明乘積大于FFH,否則OV=0,但進(jìn)位標(biāo)志位CY總是等于0?!纠浚喝?A)=80H=128,(B)=32H=50,執(zhí)行指令:

MULAB

結(jié)果:(B)=19H,(A)=00H,OV=1,CY=04.乘法指令(1條)指令功能標(biāo)志位解釋POVACCYMULABBA←(A)×(B)√√×√累加器A中的內(nèi)容與寄存器B中的內(nèi)容相乘,乘積低8位存在A、高8位存B除法運(yùn)算總是使進(jìn)位標(biāo)志位CY等于0。如果OV=1,表明寄存器B中的內(nèi)容為00H,那么執(zhí)行結(jié)果為不確定值,表示除法有溢出?!纠浚涸O(shè)(A)=0BFH,(B)=32H,執(zhí)行指令:

DIVAB結(jié)果:(A)=03H,(B)=29H,CY=0,OV=05.除法指令(1條)指令功能標(biāo)志位解釋POVACCYDIVABA←(A)÷(B)的商B←(A)÷(B)的余數(shù)√√×√累加器A中的內(nèi)容除以寄存器B中的內(nèi)容,所得到的商存A,余數(shù)存B中6.加1指令(5條)指令功能標(biāo)志位解釋POVACCYINCAA←(A)+1××××累加器A中的內(nèi)容加1,結(jié)果存在A中INCdirectdirect←(direct)+1××××直接地址單元中的內(nèi)容加1,結(jié)果送回原地址單元INC@Ri(Ri)←((Ri))+1××××寄存器的內(nèi)容指向的地址單元中的內(nèi)容加1,結(jié)果送回原地址單元中INCRnRn←(Rn)+1××××寄存器Rn的內(nèi)容加1,結(jié)果送回原地址單元中INCDPTRDPTR←(DPTR)+1××××數(shù)據(jù)指針的內(nèi)容加1,結(jié)果送回?cái)?shù)據(jù)指針中在INCdirect指令中,如果直接地址是I/O口,其功能是先讀入I/O鎖存器的內(nèi)容,然后在CPU進(jìn)行加1操作,再輸出到I/O口中,這就是“讀—修改—寫”操作。加1指令不影響標(biāo)志。如果原寄存器的內(nèi)容為FFH,執(zhí)行加1后,結(jié)果就會(huì)是00H。但不會(huì)影響標(biāo)志。減1操作不影響標(biāo)志位。實(shí)現(xiàn)“讀—修改—寫”操作7.減1指令(4條)指令功能標(biāo)志位解釋POVACCYDECAA←(A)-1××××累加器A中的內(nèi)容減1,結(jié)果送回累加器A中DECdirectdirect←(direct)-1××××直接地址單元中的內(nèi)容減1,結(jié)果送回直接地址單元中DEC@Ri(Ri)←((Ri))-1××××寄存器Ri指向的地址單元中的內(nèi)容減1,結(jié)果送回原地址單元中DECRnRn←(Rn)-1××××寄存器Rn中的內(nèi)容減1,結(jié)果送回寄存器Rn中在進(jìn)行BCD碼運(yùn)算時(shí),這條指令總是跟在ADD或ADDC指令之后,其功能是對(duì)執(zhí)行加法運(yùn)算后存于累加器A中的結(jié)果進(jìn)行調(diào)整。注意:DAA

只能用于加法運(yùn)算8.十進(jìn)制調(diào)整指令(1條)指令標(biāo)志位解釋POVACCYDAA√√√√對(duì)累加器A中的BCD碼運(yùn)算結(jié)果進(jìn)行調(diào)整【例】:有兩個(gè)BCD數(shù)36與45相加,結(jié)果應(yīng)為BCD碼81,程序如下:

MOVA,#36H ADDA,#45H DAA

加法指令執(zhí)行后得結(jié)果7BH;第三條指令對(duì)累加器A中的結(jié)構(gòu)進(jìn)行十進(jìn)制調(diào)整,低4位(為0BH)大于9,因此要加6,最后得到調(diào)整的BCD碼為81。3.5邏輯運(yùn)算類指令邏輯運(yùn)算指令共有24條有與、或、異或、求反、左右移位、清0等邏輯操作有直接、寄存器和寄存器間址等尋址方式。1.清零指令(1條)指令功能標(biāo)志位解釋

POVACCYCLRAA←0√×××累加器A中的內(nèi)容清02.求反指令(1條)指令功能標(biāo)志位解釋POVACCYCPLAA←()××××累加器A中的內(nèi)容按位取反

【例】:

MOVA,#04H ;(A)=04RLA ;(A)=08 RRA ;(A)=04邏輯左移一位相當(dāng)于乘2,邏輯右移一位相當(dāng)于除2。4邏輯與操作指令(6條)指令功能標(biāo)志位解釋POVACCYANLA,directA←(A)∧(direct)√×××累加器A中的內(nèi)容和直接地址單元中的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在累加器A中ANLA,#dataA←(A)∧#data√×××累加器A的內(nèi)容和立即數(shù)執(zhí)行與操作。結(jié)果存在累加器A中ANLA,RnA←(A)∧(Rn)√×××累加器A的內(nèi)容和寄存器Rn中的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在累加器A中ANLA,@RiA←(A)∧((Ri))√×××累加器A的內(nèi)容和工作寄存器Ri指向的地址單元的內(nèi)容執(zhí)行與操作。結(jié)果存在累加器A中ANLdirect,Adirect←(direct)∧(A)××××直接地址單元中的內(nèi)容和累加器A的內(nèi)容執(zhí)行與邏輯操作。結(jié)果存在直接地址單元中ANLdirect,#datadirect←(direct)∧#data××××直接地址單元中的內(nèi)容和立即數(shù)執(zhí)行與邏輯操作。結(jié)果存在直接地址單元中5.邏輯或操作指令(6條)指令功能標(biāo)志位解釋POVACCYORLA,directA←(A)∨(direct)√×××累加器A中的內(nèi)容和直接地址單元中的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在累加器A中ORLA,#dataA←(A)∨#data√×××累加器A的內(nèi)容和立即數(shù)執(zhí)行邏輯或操作。結(jié)果存在累加器A中ORLA,RnA←(A)∨(Rn)√×××累加器A的內(nèi)容和寄存器Rn的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在累加器A中ORLA,@RiA←(A)∨((Ri))√×××累加器A的內(nèi)容和工作寄存器Ri指向的地址單元中的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在累加器A中ORLdirect,Adirect←(direct)∨(A)××××直接地址單元中的內(nèi)容和累加器A的內(nèi)容執(zhí)行邏輯或操作。結(jié)果存在直接地址單元中ORLdirect,#datadirect←(direct)∨#data××××直接地址單元中的內(nèi)容和立即數(shù)執(zhí)行邏輯或操作。結(jié)果存在直接地址單元中6.邏輯異或操作指令(6條)指令功能標(biāo)志位解釋POVACCYXRLA,directA←(A)(direct)√×××累加器A中的內(nèi)容和直接地址單元中的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在寄存器A中XRLA,@RiA←(A)((Ri))

√×××累加器A的內(nèi)容和工作寄存器Ri指向的地址單元中的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在累加器A中XRLA,#dataA←(A)#data√×××累加器A的內(nèi)容和立即數(shù)執(zhí)行邏輯異或操作。結(jié)果存在累加器A中XRLA,RnA←(A)(Rn)√×××累加器A的內(nèi)容和寄存器Rn中的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在累加器A中XRLdirect,Adirect←(direct)(A)××××直接地址單元中的內(nèi)容和累加器A的內(nèi)容執(zhí)行邏輯異或操作。結(jié)果存在直接地址單元中XRLdirect,#datadirect←(direct)#data××××直接地址單元中的內(nèi)容和立即數(shù)執(zhí)行邏輯異或操作。結(jié)果存在直接地址單元中【例】:利用邏輯運(yùn)算指令,可以模擬各種硬件邏輯電路。如下圖所示的組合邏輯電路,試編寫一程序模擬其功能。設(shè)輸入信號(hào)放在X、Y、Z單元中,輸出信號(hào)放在F單元。參考程序如下:MOVA,X ;A←(X)ANLA,Y ;A←(A)∧(Y)MOVR1,A ;A內(nèi)容暫存MOVA,Y ;A←(Y)XRLA,Z ;A←(Y)(Z)

CPLA ;A←ORLA,R1 ;得到輸出MOVF,A ;存輸出SJMP$3.6控制轉(zhuǎn)移類指令控制轉(zhuǎn)移指令共17條可對(duì)64kB程序空間地址單元進(jìn)行訪問(wèn)的長(zhǎng)調(diào)用、長(zhǎng)轉(zhuǎn)移指令,也有可對(duì)2kB字節(jié)進(jìn)行訪問(wèn)的絕對(duì)調(diào)用和絕對(duì)轉(zhuǎn)移指令,還有短相對(duì)轉(zhuǎn)移及無(wú)條件轉(zhuǎn)移指令這些指令都不會(huì)影響標(biāo)志位。

1.無(wú)條件轉(zhuǎn)移指令(4條)指令功能標(biāo)志位解釋POVACCYLJMPaddr16長(zhǎng)轉(zhuǎn)移PC←(PC)+3PC←addr16××××給程序計(jì)數(shù)器賦予新值(16位地址)AJMPaddr11絕對(duì)轉(zhuǎn)移PC←(PC)+2,PC10-0←addr11××××程序計(jì)數(shù)器賦予新值(11位地址),(PC15-11)不改變SJMPrel短轉(zhuǎn)移PC←(PC)+2+rel××××當(dāng)前程序計(jì)數(shù)器先加上2再加上偏移量賦予程序計(jì)數(shù)器JMP@A+DPTR間接轉(zhuǎn)移PC←(A)+(DPTR)××××累加器的值加上數(shù)據(jù)指針的值賦予程序計(jì)數(shù)器2.條件轉(zhuǎn)移指令(8條)指令功能標(biāo)志位解釋POVACCYJZrel(A)=0,PC←(PC)+2+rel××××若累加器中的內(nèi)容為0,則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行JNZrel(A)≠0,PC←(PC)+2+rel××××若累加器中的內(nèi)容不為0,則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行CJNEA,direct,rel(A)≠(direct),PC←(PC)+3+rel×××√若累加器中的內(nèi)容不等于直接地址單元的內(nèi)容,則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行CJNEA,#data,rel(A)≠#data,PC←(PC)+3+rel×××√累加器中的內(nèi)容不等于立即數(shù),則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行CJNERn,#data,rel(Rn)≠#data,PC←(PC)+3+rel×××√工作寄存器Rn中的內(nèi)容不等于立即數(shù),則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行CJNE@Ri,#data,rel((Ri))≠#data,PC←(PC)+3+rel×××√工作寄存器Ri指向地址單元中的內(nèi)容不等于立即數(shù),則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行DJNZRn,relRn←(Rn)-1,(Rn)≠0,PC←(PC)+2+rel××××工作寄存器Rn減1不等于0,則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行DJNZdirect,reldirect←(direct)-1,(direct)≠0,PC←(PC)+3+rel××××直接地址單元中的內(nèi)容減1不等于0,則轉(zhuǎn)移到偏移量所指向的地址,否則程序順序執(zhí)行

【例】:將外部數(shù)據(jù)RAM中地址單元在256字節(jié)范圍內(nèi)的一個(gè)數(shù)據(jù)塊傳送到內(nèi)部數(shù)據(jù)RAM中,兩者的首地址分別為DATA1和DATA2,遇到傳送的數(shù)據(jù)為0時(shí)停止。 解:外部RAM向內(nèi)部RAM的數(shù)據(jù)傳送一定要借助于累加器A,利用累加器判零轉(zhuǎn)移指令正好可以判別是否要繼續(xù)傳送或者終止。

MOVR0,#DATA1 ;外部數(shù)據(jù)塊首地址

MOVR1,#DATA2 ;內(nèi)部數(shù)據(jù)塊首地址

LOOP:MOVXA,@R0 ;外部數(shù)據(jù)送給A HERE:JZHERE ;為0則終止

MOV@R1,A ;不為0傳送內(nèi)部RAM數(shù) 據(jù)

INCR0 ;修改地址指針

INCR1 SJMPLOOP ;繼續(xù)循環(huán)3.子程序調(diào)用指令(4條)指令功能標(biāo)志位解釋POVACCYLCALLaddr16PC←(PC)+3,SP←(SP)+1,(SP)←(PC7-0),SP←(SP)+1,(SP)←(PC15-8),(PC)←addr16××××長(zhǎng)調(diào)用指令,可在64kB空間調(diào)用子程序。先保護(hù)PC當(dāng)前值,然后轉(zhuǎn)移到目標(biāo)地址ACALLaddr11PC←(PC)+2,SP←(SP)+1,(SP)←(PC7-0),SP←(SP)+1,(SP)←(PC15-8),(PC10-0)←addr11××××絕對(duì)調(diào)用指令,可在2kB空間調(diào)用子程序RETPC15-8

←(SP),SP←(SP)-1,PC7-0

←(SP),SP←(SP)-1××

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論