第3章 指令系統(tǒng)LAST_第1頁
第3章 指令系統(tǒng)LAST_第2頁
第3章 指令系統(tǒng)LAST_第3頁
第3章 指令系統(tǒng)LAST_第4頁
第3章 指令系統(tǒng)LAST_第5頁
已閱讀5頁,還剩186頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章

指令系統(tǒng)與匯編程序設(shè)計學(xué)習(xí)目標(biāo)

MCS-51單片機的指令格式及尋址方式匯編語言的指令類型

MCS-51單片機匯編語言編程基本方法偽指令使用及匯編語言程序完整格式應(yīng)用MCS-51單片機指令系統(tǒng)進行編程主要內(nèi)容3.1指令概述

3.2尋址方式 3.3指令系統(tǒng) 3.4偽指令 3.5匯編語言程序設(shè)計3.1指令概述

3.1.1指令格式MCS-51單片機指令格式采用了單地址指令格式。一條匯編語句是由標(biāo)號、操作碼、目的操作數(shù)、源操作數(shù)和注釋等5部分組成的,其中方括號中的部分是可以選擇的。1、指令的具體格式為:

[標(biāo)號]:操作碼[目的操作數(shù)],[源操作數(shù)];[注釋]例如:HY1:MOVR3,#08H;執(zhí)行數(shù)據(jù)傳送操作一臺計算機所有指令的集合稱為該計算機的指令系統(tǒng)。其中方括號內(nèi)的部分為可選項二、指令的三種表示形式機器語言、匯編語言、高級語言以ADDA,#05H為例機器語言二進制:0010010000000101十六進制:24H05H匯編語言:ADDA,#05H高級語言:X=A+B指令的表示形式是識別指令的標(biāo)志。1)二進制的表示形式:特點:能被CPU直接識別、運行的形式。也稱機器碼、匯編語言的目標(biāo)代碼。缺點:不便于閱讀、記憶和調(diào)試修改。2、指令的三種表示形式:2)指令的“助記符”方式(也稱“匯編格式”):

00100100B24H00001000B08HADDA,#08H

這是一種由英文單詞或字母、數(shù)字來表征指令功能的形式。是一種便于閱讀、書寫和交流的表示形式。這種“匯編”格式的指令必須把它“翻譯”為二進制形式“機器碼”后才能為CPU所識別和執(zhí)行。三種不同的表示方法適用于不同的場合。本章內(nèi)容都以匯編的形式介紹指令系統(tǒng)。二進制表示形式十六進制表示匯編格式下面是一段匯編語言程序的4分段書寫格式:標(biāo)號字段操作操作數(shù)注釋碼字段字段字段START:MOVA,#00H;0→AMOVR7,#10;10→R7MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2);→ADJNZR7,LOOP;R7的內(nèi)容;減1不為0;則循環(huán)NOPSJMP$1、Rn:工作寄存器可以是R0~R74、@Ri:表示寄存器間接尋址Ri只能是R0或R1(1).指令系統(tǒng)中用的符號說明2、#data:8位立即數(shù)3、direct:8為直接地址,可以是00H~7fH,也可以是SFR的名稱。6、@DPTR:表示以DPTR為數(shù)據(jù)指針的間接尋址,訪問外部ROM/RAM5、#data16:16位立即數(shù)7、bit:位地址。10、rel;8位帶符號地址偏移量。(2)指令對標(biāo)志位的影響不同指令對標(biāo)志位的影響不同8、add11:11位目標(biāo)地址。9、add16:16位目標(biāo)地址。11、$;當(dāng)前指令的地址。助記符意義操作碼助記符對照英文傳送MOVMOVe代碼區(qū)數(shù)據(jù)傳送MOVCMOVeCode外部RAM區(qū)數(shù)據(jù)傳送MOVXMOVeeXternal壓棧PUSHPUSH退棧POPPOP交換XCHeXCHange3、51系列單片機匯編語言操作碼的對照英文助記符意義操作碼助記符對照英文十進制交換XCHDeXCHangeDecimal加法ADDADD帶進位加ADDCADDwithCarry帶借位減SUBBSUBtractwithBorrow加1INCINCrement減1DECDECrement乘MULMULtiply助記符意義操作碼助記符對照英文除DIVDIVide十進制調(diào)整DADecimalAdjust邏輯與ANLLogicleANd邏輯或ORLLogicleOR邏輯異或XRLLogicleeXclusive-oR求補CPLComPLement清零CLRCLeaR助記符意義操作碼助記符對照英文置位SETBSETBit左移RLRotateLeft帶進位左移RLCRotateLeftthrouththeCarryflag右移RRRotateRight帶進位右移RRCRotateRightthrouththeCarryflag(半字節(jié))互換SWAPSWAP助記符意義操作碼助記符對照英文絕對轉(zhuǎn)移AJMPAbsoluteJuMP相對轉(zhuǎn)移SJMPShortJuMP長轉(zhuǎn)移LJMPLongJuMP跳轉(zhuǎn)JMPJuMP累加器為零轉(zhuǎn)移JZJumpifaccisZero累加器不為零轉(zhuǎn)移JNZJumpifaccisNotZero助記符意義操作碼助記符對照英文進位位為1轉(zhuǎn)移JCJumpifCarry(ifCy=1)進位位為0轉(zhuǎn)移JNCJumpifNotCarry(ifCy=0)指定為為1轉(zhuǎn)移JBJumpifBitisset指定位為0轉(zhuǎn)移JNBJumpifNotBit(ifbit=0)指定位為1轉(zhuǎn)移并清該位JBCJumpifBitissetandClearbit助記符意義操作碼助記符對照英文比較不等轉(zhuǎn)移CJNECompareandJumpifNotEqual減1不為0轉(zhuǎn)移DJNZDecrementandJumpifNotZero短調(diào)用ACALLAbsoluteCALL長調(diào)用LCALLLongCALL子程序返回RETRETurn中斷返回RETIRETurnfromInterrupt空操作NOPNoOPeration主要內(nèi)容3.1指令概述 3.2尋址方式

3.3指令系統(tǒng) 3.4偽指令 3.5匯編語言程序設(shè)計尋址方式實際上是指令中提供操作數(shù)的形式,即尋找操作數(shù)或操作數(shù)所在地址的方式。51系列單片機中,存放數(shù)據(jù)的存儲器空間有4種:內(nèi)部RAM、SFR、外部RAM和程序存儲器。為了區(qū)別指令中操作數(shù)所處的地址空間,對于不同存儲器中的數(shù)據(jù)操作,采用不同的尋址方式。

51系列單片機尋址方式共有七種:立即數(shù)尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址。3.2尋址方式:3.2.1立即尋址指令中直接給出操作數(shù)的尋址方式稱為立即尋址。立即數(shù)用一個前面加“?!钡?位數(shù)(#data,如#40H)或16位數(shù)(#data,如#2008H)表示。它直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲器中,可以立即得到并執(zhí)行。因此立即尋址的指令多為2字節(jié)或3字節(jié)指令。(P42~46)例3-1MOVA,#20HMOVDPTR,#2009H執(zhí)行指令后,A的內(nèi)容為20H,立即數(shù)2009H送到DPTR,DPH的內(nèi)容為20H,DPL的內(nèi)容為09H。

3.2.2直接尋址

指令中直接給出操作數(shù)地址(direct)的尋址方式稱為直接尋址。由于直接尋址方式中只能使用8位二進制數(shù)表示地址,所以使用直接尋址只可訪問片內(nèi)RAM的128個單元以及所有的特殊功能寄存器(SFR)。對于特殊功能寄存器,既可以使用它們的地址,也可以使用它們的名字。(1)尋址空間內(nèi)部RAM的低128字節(jié)00H~07FHA:適當(dāng)選擇累加器的形式,累加器在指令系統(tǒng)中有三種形式AACC0E0HINCA04H寄存器尋址二、直接尋址:給出操作數(shù)的地址MOVA,30HA(30H)特殊功能寄存器SFR(2)使用注意事項INCACC05E0H直接尋址INC0E0H05E0H直接尋址(3)特殊功能寄存器的尋址方式只有一種即直接尋址,直接尋址的SFR的名稱如書2324頁。

直接尋址方式示意圖如下:直接尋址例子若(A)=30H,(25H)=4DH,(P0)=3EH,(30H)=11H,(20H)=2FH則執(zhí)行上述指令后,結(jié)果為:(A)=4DH,(25H)=4DH,(P0)=50H,(30H)=2FH,(20H)=2FH例3-2MOVA,25H;(25H)→(A)MOVP0,#50H;立即數(shù)50H→P0MOV80H,#50H;同上一條指令相同,只是表;達方式不一樣,建議用上條;指令格式,易讀MOV30H,20H;(20H)→(30H)操作數(shù)放于某個工作寄存器內(nèi)R0~R7,指令碼中含有寄存器編號。例如:MOVA,Rn E8~EFADDA,Rn28~2FINCRn08H~0FH

DECRn18H~1FH3.2.3寄存器尋址E8MOVA,R0;11101000Rn的物理地址由PSW中的RS1和RS0確定:EFMOVA,R7;11101111INCR008H00001000例如:MOVA,R2;R2A若RS1=0,RS0=0則R2的物理地址為02H35H02H03H01H35HA寄存器尋址定義通用寄存器包括R0-R7以及ABDPTR。直接尋址和寄存器尋址的差別:

直接尋址的操作數(shù)是以地址形式(如A=E0H,B=F0H,R0=00H)直接出現(xiàn)在指令碼中。寄存器尋址的操作數(shù)是以寄存器編碼形式出現(xiàn)在指令碼中。使用寄存器尋址的寄存器少、編碼少(至多三位二進制數(shù)),通常操作碼和寄存器編碼合用一個字節(jié),因此寄存器尋址的指令機器碼短,占用空間小,執(zhí)行快。除上面所指出的幾個寄存器外,其他SFR均為直接尋址。

寄存器尋址方式示意圖如下:11100010寄存器尋址實例例3-3MOVA,R0;(R0)→(A),機器碼為E8,僅占;1字節(jié),A和R0均為寄存器尋址MULAB;(A)*(B)→(B)(A)機器碼為A4,;A和B均為寄存器尋址MOVB,R0;(R0)→(B),機器碼為88F0,其第;2字節(jié)F0為B的地址,B為直接尋;址,R0為寄存器尋址PUAHACC;A的內(nèi)容壓入堆棧,機器碼為;C0E0,其第2字節(jié)E0為A的地址;A為直接尋址

MOVB,00H;(00H)→(B),機器碼為8500F0,寄存器間接尋址:指令碼含有操作數(shù)地址的寄存器號,寄存器用R0、R1、DPTR。

3.2.4寄存器間接尋址尋址范圍A片內(nèi)RAM00H~7FHMOVA,R0;AR0MOVA,@R0;A(R0)P2高八位Ri低八位B片外RAM64KDPTR作間接地址注意事項:寄存器間址指令不能用于尋址特殊功能寄存器MOVR0,#90H;MOVA,@R0;是錯誤的寄存器間接尋址方式示意圖如下:例3-4MOV@R0,A;(A)→((R0))MOVXA,@R1;外部RAM(地址為P2:R1);的內(nèi)容→(A)MOVX@DPTR,A;(A)→以DPTR內(nèi)容為地址的;外部RAM若(A)=3AH,(R0)=74H,(74H)=21H,執(zhí)行第一條指令后,(74H)=3AH,其余兩條指令類似。

寄存器間接尋址實例操作數(shù)地址=基址+變址PC基址DPTR變址A,八位無符號數(shù)00H~FFH

3.2.5變址尋址這種尋址方式常用于訪問程序存儲器中的常數(shù)表。由于程序存儲器是只讀存儲器,因此變址尋址只有讀操作而無寫操作在指令符號上,采用MOVC形式。變址尋址指令只有下列3條指令。MOVCA,@A+DPTR;((A)+(DPTR))→(A)MOVCA,@A+PC;((A)+(PC))→(A)JMP@A+DPTR;(A)+(DPTR)→(PC)變址尋址方式示意圖如下:ROM1EHMOVCA,@A+DPTR0211HDPTR0200HA1EHA11H+......變址尋址實例以當(dāng)前程序計數(shù)器PC值加上指令中給出的偏移量rel,構(gòu)成實際操作數(shù)地址的尋址方式稱為相對尋址。在使用相對尋址時要注意以下兩點:(1)當(dāng)前PC值是指相對轉(zhuǎn)移指令的存儲首地址加上該指令的字節(jié)數(shù)。(2)偏移量rel是有符號的單字節(jié)數(shù)。以補碼表示其值是-128~+127(00~FFH),負數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。 滿足轉(zhuǎn)移條件的目的地址為:目的地址=當(dāng)前PC值+rel=轉(zhuǎn)移指令所在首地址+轉(zhuǎn)移指令的字節(jié)數(shù)+rel

3.2.6相對尋址例3-6:JZrel;若(A)=0,則(PC)=(PC)+2+rel;若(A)≠0,則(PC)=(PC)+2

在實際編程應(yīng)用中,rel通常是用轉(zhuǎn)移目的地址的標(biāo)號來替代,由機器匯編程序自動計算偏移量rel,因此rel不需要手算。相對尋址實例

LOOP:MOVA,20HMOVA,#30H;MOVA,R3MOV40H,@R0MOVDPTR,#1006HMOVCA,@A+DPTRJZLOOP

若(20H)=77H(R0)=20H(R3)=88H

(A)=77H(A)=30H(A)=88H(40H)=77H(DPTR)=77H位尋址定義:對可位尋址的地址中的內(nèi)容進行位操作的尋址方式位尋址方式中位地址常用兩種方式表示:(1)、直接使用位地址。對于20H~2FH的16個單元,共128位的位地址。地址分布是00H~7FH。(2)、對于特殊功能寄存器,可以直接用寄存器名字加位數(shù)表示如PSW.0、IE.7等。也可以用其對應(yīng)的位地址符號如P、EA等表示。編程時常使用符號字節(jié)地址和符號位地址形式,而不用直接字節(jié)地址和位地址,這樣做便于閱讀和理解。

3.2.7位尋址例3-7:SETB20H;1→20H位SETBEA;1→EA位SETBIP.0;同上

位尋址實例判斷下列指令中操作數(shù)的尋址方式LOOP:MOVA,BMOVAcc,#30H;MOVA,R3MOV40H,@R0MULABMOVCA,@A+DPTRSETB20HJZLOOP主要內(nèi)容3.1指令概述 3.2尋址方式 3.3指令系統(tǒng)

3.4偽指令 3.5匯編語言程序設(shè)計51系列單片機的指令系統(tǒng)共有111條指令。指令系統(tǒng)按指令在程序存儲器所占字節(jié)可分為:單字節(jié)指令49條;雙字節(jié)指令45條;三字節(jié)指令17條。按指令執(zhí)行時間可分為:

1個機器周期的指令64條;

2個機器周期的指令45條;

4個機器周期的指令(乘、除)2條;3.3指令系統(tǒng):

3.3.1指令系統(tǒng)概述

按指令的功能可分為:數(shù)據(jù)傳送類指令29條;算術(shù)運算類指令24條;邏輯操作類指令24條;控制轉(zhuǎn)移類指令17條;位操作類指令17條。比較指令系統(tǒng)中的操作數(shù),可以看出:(1)A寄存器使用頻率最高。這說明正確掌握使用A寄存器的方法至關(guān)重要,同時A也成為程序設(shè)計的瓶頸。(2)Direct出現(xiàn)次數(shù)居第二。這表明正確掌握片內(nèi)RAM和SFR的使用非常重要;(3)@Ri和#data出現(xiàn)次數(shù)居第三。立即數(shù)在程序初始化和參數(shù)設(shè)置方面應(yīng)用很廣;寄存器間接尋址在程序設(shè)計中常常用到。把源操作數(shù)送給目的操作數(shù),源操作數(shù)不變分為內(nèi)部RAM和SFR、外部數(shù)據(jù)傳送、堆棧指令、數(shù)據(jù)交換一、內(nèi)部數(shù)據(jù)傳送指令15條1、立即尋址型:源操作數(shù)字節(jié)是立即數(shù)MOVA,#data;Adata74dataMOVRn,#data;Rndata78~7FdataMOV@Ri,#data;(Ri)data76~77dataMOVdirect,#data;(direct)data75data

3.3.2數(shù)據(jù)傳送指令例:R0=30H執(zhí)行如下程序后分析AR430H31H單元的內(nèi)容MOVA,#10HMOVR4,#36HMOV@R0,#7AHMOV31H,#01H;(A)=10H;(R4)=36H;(30H)=7AH;(31H)=01H2、內(nèi)部數(shù)據(jù)存儲器(Rn片內(nèi)RAMSFR)與累加器之間的數(shù)據(jù)傳送MOVA,Rn;ARnE8H~EFHMOVRn,A;RnAF8H~FFHMOV@Ri,A;(Ri)AE6H~E7HMOVA,@Ri;A(Ri)F6H~F7HMOVdirect,A;(direct)AE6H~E7HMOVA,direct;A(direct)F6H~F7H3、內(nèi)部數(shù)據(jù)存儲器(Rn片內(nèi)RAMSFR)與片內(nèi)RAM之間的數(shù)據(jù)傳送MOVdirect,Rn;(direct)Rn88H~8FHdirectMOVRn,direct;RndirectA8H~AFdirectMOV@Ri,direct;(Ri)directA6H~A7HMOVdirect,@Ri;direct(Ri)86H~87HdirectMOVdirect2,direct1;(direct2)(direct1)85Hdirect1direct2例:設(shè)內(nèi)部RAM(30H)=40H,(40H)=10HP1口作輸入,輸入數(shù)據(jù)為0CAH執(zhí)行如下程序后R0=R1=A=B=P1=(40)=MOVR0,#30HMOVA,@R0MOVB,@R1MOV@R1,P1MOVP2,P1;R030H;(30H)AMOVR1,A;R1A;(R0)=30H;(A)=40H;(R1)=40H;(40H)B;(B)=10H;(40H)=0CAH;(90H)(40H);(90H)(A0H);(P2)=0CAH內(nèi)部數(shù)據(jù)傳送指令總結(jié):內(nèi)部數(shù)據(jù)指令中都是用MOV傳送A、指令系統(tǒng)中,指令格式和代碼由硬件系統(tǒng)決定,不得自己隨意編制指令;例如MOVR1,@R2B、要清楚每種尋址方式的尋址范圍。例如R0=90HMOVA,@R0是錯誤的原因是特殊功能寄存器只能是直接尋址C、以累加器為目的操作數(shù)會影響PSW中的奇偶標(biāo)志位累加器Direct直接地址Rn寄存器#data立即數(shù)@Ri間接地址例3-8將RAM中20H~25H單元內(nèi)容傳入RAM中60~65H單元。

分析:傳送內(nèi)容只有6次,查指令表知可使用MOVdirect1,direct2共6條指令即可完成。合理可用。程序如下:MOV60H,20HMOV61H,21HMOV62H,22HMOV63H,23HMOV64H,24HMOV65H,25H例3-9將RAM中10H~35H單元內(nèi)容傳入RAM中50H~75H單元。分析:(1)傳送內(nèi)容共有35H-10H+1=26H=38次,如果仍使用上述指令需要38條相同形式的指令,程序太長,可實現(xiàn)但不易讀。(2)使用循環(huán)傳送較好,循環(huán)次數(shù)為26H次,查循環(huán)轉(zhuǎn)移指令,共有DJNZRn,rel和DJNZdirect,rel兩條指令,前者占用字節(jié)數(shù)少,故選前者Rn=R7。(3)源操作數(shù)地址存入R0,目的操作數(shù)地址存入R1,查表知無MOV@R1,@R0指令,因此需使用MOVA,@R0和MOV@R1,A兩條指令間接實現(xiàn)一次數(shù)據(jù)傳送,一次傳送完成后,R0和R1分別加1,R7內(nèi)容(循環(huán)次數(shù))減1,若R7內(nèi)容不等于0,執(zhí)行下一次傳送,反之傳送完成。程序如下:MOVR0,#10H;數(shù)據(jù)源起始地址送R0MOVR1,#50H;目標(biāo)單元起始地址送R1MOVR7,#26H;循環(huán)次數(shù)送R7NET1:MOVA,@R0;要傳送的數(shù)據(jù)送AMOV@R1,A;通過A送入目標(biāo)單元INCR0;R0+1→R0INCR1;R1+1→R1DJNZR7,NET1;R7內(nèi)容減1,若為0結(jié)束循環(huán),反之跳轉(zhuǎn)到NET1

可見使用間接尋址方式傳送,輔之控制轉(zhuǎn)移指令不僅程序簡單而且易讀,合理。1、16位數(shù)傳送指令二、外部存儲器的讀寫指令7條MOVDPTR#data2、ROM的字節(jié)傳送指令訪問程序存儲器的數(shù)據(jù)傳送指令又稱作查表指令,采用基址寄存器加變址寄存器間接尋址方式,把程序存儲器中存放的表格數(shù)據(jù)讀出,傳送到累加器A。共有如下兩條單字節(jié)指令,指令操作碼助記符為MOVC。指令助記符操作功能注釋機器碼(H)MOVCA,@A+DPTR;(A)←((A)+(DPTR))93MOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))83

前一條指令采用DPTR作基址寄存器,因此可以很方便地把一個16位地址送到DPTR,實現(xiàn)在整個64KB程序存儲器單元到累加器A的數(shù)據(jù)傳送。即數(shù)據(jù)表格可以存放在程序存儲器64KB地址范圍的任何地方。變址尋址ORG0000HLJMPSTARTORG0030HSTART:MOVA,#02MOVCA,@A+PCTABLE:DB00HDB01H DB04H DB09H DB10H DB19H

1009040100830030003100320033003400357402190036003700380039START:MOVR0,#01H LOOP:MOVA,R0ADDA,#05MOVCA,@A+PC MOV20H,A INCR0JMPLOOPTABLE:DB00HDB01H DB04H DB09H DB10H DB19HEND800820F583E8003000310032003300340035003A003B003C003D003E003F00407801F90001040910190036003700380039ORG0000HLJMPSTARTORG0030HSQUAREEQU22HSTART:MOVR0,#01H LOOP:MOVA,R0ADDA,#05MOVCA,@A+PC MOVSQUARE,A INCR0JMPLOOPTABLE:DB00HDB01H DB04H DB09H DB10H DB19HEND003600370038003920F5830524E8003000310032003300340035003A003B003C003D003E003F004078010880F7000104091019@A+PC實例3、外部RAM的字節(jié)傳送指令4條MOVXA,@RiMOXX@Ri,AMOVXA,@DPTRMOVX@DPTR,A前面兩條指令的高位地址由P2口設(shè)置,可訪問片外64K的范圍。例3-10將片外RAM中2000H單元內(nèi)容傳入RAM中50H單元。

分析:查表知從片外RAM讀取數(shù)據(jù)有2條指令:MOVXA,@Ri和MOVXA,@DPTR。后一條指令外部RAM的地址是直接放在DPTR中的,而前一條指令,由于Ri(即R0或R1)只是一個8位的寄存器,所以只提供低8位地址,須用P2口輸出高8位地址。這時就應(yīng)事先預(yù)置P2的值。使用后一條指令較簡單.

程序如下:MOVDPTR,#2000HMOVXA,@DPTRMOV50H,A需要說明的是,對外部RAM的操作必須經(jīng)過累加器A才能完成。如果將片外RAM中19FFH~2030H單元的內(nèi)容傳送到內(nèi)部RAM中30H~61H單元,程序應(yīng)如編制呢?

程序如下:MOVDPTR,#19FFHMOVR0,#30HMOVR7,#32H;傳送次數(shù)32H送R7NET1:MOVXA,@DPTRMOV@R0,AINCDPTR;指向源地址下一單元

;指向目的地址下一單元INCR0;R7內(nèi)容減,1不為0則跳轉(zhuǎn)到NET1DJNZR7,NET1

堆棧操作主要用在子程序和中斷服務(wù)子程序中用來保護和恢復(fù)SFR和片內(nèi)RAM中其他單元的內(nèi)容。在片內(nèi)RAM的128B單元中可以設(shè)定一個后進先出的區(qū)域作為堆棧區(qū),堆棧區(qū)要足夠大且不被破壞,以保證多重嵌套子程序使用,否則會出現(xiàn)非正常狀態(tài)。一般在程序初始化時給堆棧指針SP賦初值,此后棧頂由堆棧指針SP指出。堆棧操作有入棧和出棧,即壓入和彈出數(shù)據(jù)。三、堆棧操作指令2條入棧指令PUSHdirect用于保存片內(nèi)RAM單元或SFR中需要保護的內(nèi)容。操作時,先將堆棧指針SP內(nèi)容加1,然后把直接地址單元的內(nèi)容壓入SP所指內(nèi)部RAM單元內(nèi)。出棧指令POPdirect用于恢復(fù)片內(nèi)RAM單元或特殊功能寄存器SFR的內(nèi)容。操作時,先將堆棧指針SP所指內(nèi)部RAM單元中內(nèi)容送入direct單元中,然后堆棧指針SP內(nèi)容減1,指向新棧頂。PUSHdirect;SPSP+1(SP)(direct)POPdirect;(SP)(direct)SPSP-1POP00HPUSHACCPUSHAPOPR0錯的

錯的

正確

正確

MOV20H,#55HMOVA,#88HMOVSP,#30H PUSH20HPUSHACCMOV20H,#22H MOVA,#08H POPACC POP20H

(20H)=55H(A)=88H(SP)=30H(31H)=55H(32H)=88H(20H)=22H(A)=08H(A)=88H(20H)=55HPUSH實例XCHDA,@Ri;A3~0(Ri)3~0例:編出外部RAM20H單元一個數(shù)X和內(nèi)部RAM20H單元中的Y互換的程序XCHA,@R1;MOVX@DPTR,A;MOVDPTR,#0020H;MOVXA,@DPTR;四、數(shù)據(jù)交換類指令5條XCHA,@RiA(Ri)XCHA,directA(direct)XCHA,RnARnSWAPA;執(zhí)行結(jié)果為將A的高4位與低4位交換MOVR1,#20H;;執(zhí)行結(jié)果為(A)=A5HXCHDA,@Ri指令的功能是將Ri間接尋址的單元內(nèi)容與累加器A中內(nèi)容的低4位互換,各自的高4位內(nèi)容不變。SWAPA指令是將A的高4位與低4位交換。;執(zhí)行結(jié)果為:(20H)=37H,(A)=5AH例3-12若(R0)=20H,(20H)=3AH,(A)=57H,執(zhí)行程序:XCHDA,@R0SWAPA

算術(shù)運算指令包括加、減、乘、除基本四則運算,共有24條指令。算術(shù)運算的結(jié)果將對進位CY、半進位AC、溢出位OV三個標(biāo)志位置位或是復(fù)位,只有加1和減1指令不影響這些標(biāo)志位。3.3.3算數(shù)運算指令一、算術(shù)運算指令24條1、加法指令(1)不帶進位位CY的加法源操作數(shù)可以是立即數(shù)、直接地址、寄存器、寄存器間址。ADDA,#data;AA+dataADDA,Rn;AA+RnADDA,@Ri;AA+(Ri)ADDA,direct;A(direct)注意:a、加數(shù)和被加數(shù)都為8位二進制結(jié)果也為8位,對PSW有影響。10100011CYACF0RS0RS1OV-P例3-16(A)=45H,(R0)=10H,(10H)=2FH,執(zhí)行指令:ADDA,@R0執(zhí)行過程為:01000101+)0010111101110100

8位二進制加法運算的一個加數(shù)固定在累加器A中,計算結(jié)果也固定存放于累加器A中。當(dāng)和的第3位和第7位有進位時,分別將AC,CY標(biāo)志置位1;否則為0。溢出標(biāo)志OV=CP⊕CS。其中CP是高位的進位位,CS是次高位進位位。所以(A)=74H,(CY)=0,(AC)=1,(OV)=0,(P)=0。(2)帶進位位的加法指令A(yù)DDCA,RnAA+Rn+CYADDCA,directAA+(direct)+CYADDCA,@RiAA+(Ri)+CYADDCA,#dataAA+data+CY例3-17(A)=45H,(R0)=10H,(10H)=2FH,(CY)=1,執(zhí)行指令:ADDCA,@R0執(zhí)行過程為:0100010100101111+)101110101

這條指令與不帶進位加法指令不同點是進位標(biāo)志CY將參加運算,CY的值要加到累加起A中。其結(jié)果也是存放于累加器A中。當(dāng)運算結(jié)果第3位和第7位有進位時,分別將AC,CY標(biāo)志位置1;否則為0。若產(chǎn)生溢出時,OV置1。所以(A)=75H,(CY)=0,(AC)=1,(OV)=0,(P)=1.1、A=0B6HCY=02、A=85HCY=13、A=97HCY=04、A=0BHCY=1例:A=85H,R0=30H(30H)=11H(31H)=0FFH,CY=1求執(zhí)行結(jié)果A和CY1、ADDCA,R02、ADDCA,31H3、ADDCA,@R04、ADDCA,#85H185306B185FF581185117918585B01INCA;AA+1INCRn;RnRn+1INCdirect;(direct)(direct)+1INC@Ri;(Ri)(Ri)+1INCDPTR;DPTRDPTR+1例3-21(A)=C3H,(DPTR)=20FFH,執(zhí)行指令:INCAINCDPTR執(zhí)行結(jié)果:(A)=C4H,(DPTR)=2100H指令的功能是將操作數(shù)所指定的單元內(nèi)容加1,內(nèi)容改變后又存放于同一單元。其操作不影響PSW。若單元內(nèi)容為FFH,加1后溢出為00H,也不影響PSW標(biāo)志。INCDPTR是指令集中唯一的一條16位算術(shù)運算指令。它是將DPTR中的內(nèi)容加1。若低8位DPL執(zhí)行加1操作產(chǎn)生溢出時,就對高8位DPH的內(nèi)容加1,其結(jié)果不影響標(biāo)志位。2、減法指令(1)、帶CY減法指令SUBBA,Rn;AA-Rn-CYSUBBA,direct;AA-(direct)-CYSUBBA,@Ri;AA-(Ri)-CYSUBBA,#data;AA-data-CY例3-18(A)=A9H,(R2)=24H,(CY)=1,執(zhí)行指令:SUBBA,R2

執(zhí)行過程:1010100100100100-)110000100

減法指令的功能是從累加器A中減去不同尋址方式的減數(shù)以及進位位CY的值,差的結(jié)果存放在累加器A中。所以(A)=84H,(CY)=0,(AC)=0,(OV)=0。在51系列單片機指令系統(tǒng)中,由于沒有不帶借位的減法指令,若是要執(zhí)行不帶借位的減法,必須在“SUBB”指令前用“CLRC”指令將CY清0。同時,若第3位和第7位有借位時,AC和CY需置位,否則清0。DECA;AA-1DECdirect;directdirect-1DECRn;RnRn-1DEC@Ri;(Ri)(Ri)-1(2)、減1指令這條指令的功能是將操作數(shù)所指定的單元內(nèi)容減1,內(nèi)容改變后又存放于同一單元。其操作不影響PSW。若單元內(nèi)容為00H,減1需借位,其值溢出為FFH,其結(jié)果也不影響PSW標(biāo)志。例3-22(A)=C3H,執(zhí)行指令:DECA執(zhí)行結(jié)果:(A)=C2H

3、十進制調(diào)整指令DAA若AC=1或A3~0>9則AA+06H若CY=1或A7~4>9則AA+60H該指令是用于壓縮BCD碼加法運算的十進制調(diào)整

十進制調(diào)整指令DAA一條專用指令,用于對BCD碼十進制數(shù)加法運算的結(jié)果進行修正。該指令必須緊跟在加法指令之后。前面講過的ADD和ADDC指令都是二進制加法指令。但對于十進制數(shù)(BCD碼)的加法運算指令系統(tǒng)中并沒有專門的指令,因此只能借助于二進制加法指令來完成。然而二進制數(shù)的加法運算原則不能完全適用于十進制數(shù)的加法運算,有時會產(chǎn)生錯誤的結(jié)果例如:(a)6+3=9(b)8+4=12(c)8+9=17011010001000+0011+0100+1001100111001←0001其中:(a)運算結(jié)果正確。9的BCD碼就是1001(b)運算結(jié)果不正確。因為十進制數(shù)的BCD碼中沒有1100這個編碼。(c)運算結(jié)果不正確。因為8+9的正確結(jié)果應(yīng)為17。

分析出錯的原因:4位二進制編碼一共有16個編碼,但BCD碼采用4位二進制編碼,卻只用了其中的10個(0000~1001B)編碼。剩余的6個編碼(1010~1111B)通常稱之為無效碼。在進行BCD碼加法運算時,其結(jié)果進入或跳過無效編碼區(qū)時結(jié)果就會出現(xiàn)錯誤。因此對于BCD碼十進制數(shù)進行加法運算時需要進行調(diào)整,調(diào)整的方法是:(1)累加器低4位大于9或是AC=1,則將低4位加6進行修正。(2)累加器高4位大于9或是CY=1,則將高4位加6進行修正。(3)累加器高4位為9,低4位大于9,則高4位和低4位分別加6進行修正。說明:1、本指令使用時跟在ADD或ADDC之后2、不能用DA指令對BCD碼減法直接調(diào)整3、指令不影響溢出標(biāo)志位OV4、借助標(biāo)志位可實現(xiàn)多位BCD碼加法結(jié)果的調(diào)整。例:完成85+59的BCD加法調(diào)整解:ORG1000HMOVA,#85H;A85HADDA,#59H;A85H+59HA=DEHDAASJMP$END01011001低四位〉9高四位〉9例3-23(A)=01010110B,(R2)=01100111B,

執(zhí)行指令:ADDA,R2DAA執(zhí)行過程:01010110+)0110011110111101調(diào)整:01100110結(jié)果:100100011所以,BCD碼為123。MUL1、進位標(biāo)志位CY總是清零2、P由累加器中1的個數(shù)決定3、當(dāng)積大于255OV=1否則OV=0DIV1、對CY和P的影響與MUL相同2、當(dāng)除數(shù)為零時除法沒有意義,OV=1,否則OV=04、乘法和除法指令MULABDIVAB形成進位標(biāo)志位

3.3.4邏輯操作指令

邏輯操作指令可以對兩個8位二進制數(shù)進行與、或、異或、清除、求反、移位等操作。在這類指令中,除以累加器A為目標(biāo)寄存器指令外,其余指令均不影響標(biāo)志位。ANL(ORL、XRL)A,direct;ANL(ORL、XRL)A,#data;ANL(ORL、XRL)direct,A;ANL(ORL、XRL)direct,#data;AA^(direct)AA^datadirectA^(direct)directA^dataANL(ORL、XRL)A,Rn;ANL(ORL、XRL)A,@Ri;CLRA;將A清0CPLA;將A按位取反RLC/RLA;帶/不帶進位位的左移指令RRC/RRA;帶/不帶進位位的右移指令

例:1MOVA,#0FFHANLA,R02MOVA,#0F0HANLA,@R0解:A=30H

2A=A0H(30H)=0AAH已知R0=30H和(30H)=0AAH,試問8031分別執(zhí)行如下程序后累加器和30H單元中的內(nèi)容是什么?

例:已知片外RAM1000H單元中有一個數(shù)7BH完成將高4位取反,低4位不變的程序ORG2000HMOVDPTR,#1000HMOVXA,@DPTR,XRLA,#F0HMOVX@DPTR,ASJMP$END011110111111000010001011例3-24(R0)=10H,(10H)=7AH,執(zhí)行指令:MOVA,#3EHANLA,@R0執(zhí)行過程為:00111110∧0111101000111010

已知M1單元中有一個9的ASCII碼39H,試編程把它變?yōu)锽CD碼(即高4位為0,低4位不變)例方法(1)ANLM1,#0FH001110010000111100001001方法(2)MOVA,M1ANLA,#0FH

美國標(biāo)準(zhǔn)信息交換代碼(AmericanStandardCodeforInformationInterchange)是由美國國家標(biāo)準(zhǔn)學(xué)會(AmericanNationalStandardInstitute,ANSI)制定的,ASCII碼是基于拉丁字母的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC646。在計算機中,所有的數(shù)據(jù)在存儲和運算時都要使用二進制數(shù)表示(因為計算機用高電平和低電平分別表示1和0),例如,象a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數(shù)字還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數(shù)來表示,而具體用哪些二進制數(shù)字表示哪個符號,當(dāng)然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規(guī)則,于是美國有關(guān)的標(biāo)準(zhǔn)化組織就出臺了所謂的ASCII編碼,統(tǒng)一規(guī)定了上述常用符號用哪些二進制數(shù)來表示。

例3-26設(shè)(A)=AAH,P1=FFH,試通過編程把A的低4位送入P1口低4位,P1口高4位不變。ANLA,#0FH;取出A的低4位,高4位置0ANLP1,#0F0H;取出P1口的高4位,低4位置0ORLP1,A;字節(jié)裝配例3-27編程使內(nèi)部RAM中的30H單元內(nèi)容的低2位清0,高2位置1,中間4位取反。

ANL30H,#0FCH;低2位清0ORL30H,#0C0H;高2位置1XRL30H,#3CH;中間4位取反

51系列單片機的移位指令只能對累加器A進行移位,移位示意圖如下所示:移位

例3-28若(A)=01101100B,CY=1,(1)執(zhí)行指令RRA,結(jié)果為(A)=00110110B,CY不變(2)執(zhí)行指令RRCA,結(jié)果為A=10110110B,CY=0(3)執(zhí)行指令RLA,結(jié)果為(A)=11011000B,(4)執(zhí)行指令RLCA,結(jié)果為A)=11011001B,CY=0例3-29已知2DH單元有一正數(shù),試編程求其負數(shù)的補碼并傳送到30H單元。MOVA,2DHCPLAINCAMOV30H,A

3.3.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移類指令的功能是改變指令的執(zhí)行順序,轉(zhuǎn)移到指令指示的新的地址執(zhí)行程序。51系列單片機的控制轉(zhuǎn)移指令有以下類型:無條件轉(zhuǎn)移:無需判斷,執(zhí)行該指令就轉(zhuǎn)移到目的地址。條件轉(zhuǎn)移:需判斷標(biāo)志位是否滿足條件,若滿足條件,則轉(zhuǎn)移到目的地址,否則順序執(zhí)行。

絕對轉(zhuǎn)移:轉(zhuǎn)移的目的地址用絕對地址指示,通常為無條件轉(zhuǎn)移。相對轉(zhuǎn)移:轉(zhuǎn)移的目的地址用相對于當(dāng)前PC的偏移量來表示,通常為條件轉(zhuǎn)移。長轉(zhuǎn)移或長調(diào)用:目的地址在距當(dāng)前PC的64KB范圍內(nèi)。短轉(zhuǎn)移或短調(diào)用:目的地址在距當(dāng)前PC的2KB范圍內(nèi)。一、控制轉(zhuǎn)移指令17條1、無條件轉(zhuǎn)移指令02HAdd15~add8Add7~add0LJMPadd16;PCadd16AJMPadd11SJMPrelJMP@A+DPTR(1)長轉(zhuǎn)移指令LJMPadd16三字節(jié)雙周期;PCadd11PCadd16(2)絕對轉(zhuǎn)移指令A(yù)JMPadd112字節(jié)2周期A10A9A800001A7A6A5A4A3A2A1A0分兩步:1、PC=PC+2PC的高5位為頁面地址,a0~a10為頁內(nèi)地址操作碼2、PC加2后,取高5位和操作碼的11位組成新的PC值A(chǔ)7A6A5A4A3A2A1A0pc15pc14pc13pc12pc11A10A9A8

例:AJMPadd11Add11=10110100101B0010H10000101101001010010H0011HPC=PC+2=0012HPC的高五位是00000新的PC值是0000010110100101B=05A5H程序跳轉(zhuǎn)到05A5H處執(zhí)行(3)短轉(zhuǎn)移指令SJMPrel1PC=PC+22、PC=PC+rel80Hrel目的地址=當(dāng)前PC值+rel=轉(zhuǎn)移指令首地址+轉(zhuǎn)移指令字節(jié)數(shù)+relRel=目標(biāo)地址-轉(zhuǎn)移指令首地址-2Rel-128~127之間rel=目的地址-轉(zhuǎn)移指令首地址-轉(zhuǎn)移指令字節(jié)數(shù)0010H;01HA;AR0;0CF01HDPTR0018H80rel;轉(zhuǎn)到STARTRel用START表示ORG0010HSTART:MOVA,#01HMOVR0,ALOOP:MOVDPTR,#0CF01HSJMPSTARTRel=0010H-0018H-2=-10Rel-128~127之間HERE:SJMPHEREHERE:SJMP$Rel=0FEH(4)變址尋址轉(zhuǎn)移指令JMP@A+DPTRPC=A+DPTR

例3-31要求當(dāng)(A)=0轉(zhuǎn)處理程序K0當(dāng)(A)=2轉(zhuǎn)處理程序K1當(dāng)(A)=4轉(zhuǎn)處理程序K2匯編程序如下:MOVDPTR,#TABLE;表首地址送DPTR中JMP@A+DPTR;以A中內(nèi)容為偏移量跳轉(zhuǎn)TABLE:AJMPK0;(A)=0轉(zhuǎn)K0執(zhí)行AJMPK1;(A)=2轉(zhuǎn)K1處執(zhí)行AJMPK2;(A)=16轉(zhuǎn)K8執(zhí)行JMP@A+DPTR指令常用于鍵盤輸入處理程序和命令解析程序中。2、條件轉(zhuǎn)移指令8條分為累加器A的判零轉(zhuǎn)移、比較條件轉(zhuǎn)移、減1條件轉(zhuǎn)移(1)累加器A的判零轉(zhuǎn)移JZrel如果A=0,PCPC+2+rel如果A≠0,PCPC+2JNZrel如果A≠0,PCPC+2+rel如果A=0,PCPC+2例:已知外部RAM中1000H為始地址的數(shù)據(jù)塊以零為結(jié)束標(biāo)志,試編程將之傳送到以30H為開始地址的內(nèi)部RAM中0data3data2data11000HORG0010MOVDPTR,#1000HMOVR0,#30HLOOP:MOVXA,@DPTRJZDONEMOV@R0,AINCDPTRINCR0SJMPLOOPDONE:SJMP$END數(shù)據(jù)移動程序

(2)比較條件轉(zhuǎn)移CJNEA,(#datadirect),rel如果A≠dataPCPC+3+rel如果A=dataPCPC+3形成CY標(biāo)志位目的操作數(shù)-源操作數(shù)〉0CY=0目的操作數(shù)-源操作數(shù)<0CY=1CJNERn,#data,rel形成CY標(biāo)志位CJNE@Ri,#data,rel形成CY標(biāo)志位目的操作數(shù)-源操作數(shù)〉0CY=0目的操作數(shù)-源操作數(shù)<0CY=1如果Rn≠dataPCPC+3+rel如果Rn=dataPCPC+3如果(Ri)≠dataPCPC+3+rel如果(Ri)=dataPCPC+3(3)減1條件轉(zhuǎn)移DJNZRn,relDJNZdirect,rel如果Rn-1≠0PCPC+2+rel如果Rn-1=0PCPC+2如果(direct)-1≠0PCPC+3+rel如果(direct)-1=0PCPC+3

例3-33軟件延時

利用DJNZ指令可在一段程序中插入某些指令來實現(xiàn)軟件延時。DJNZ指令執(zhí)行時間為2個機器周期,這樣循環(huán)一次可產(chǎn)生2個機器周期延時。設(shè)主頻為12MHZ,循環(huán)次數(shù)為24次,下段程序在P1.7引腳上輸出一個50us的脈沖。

CLRP1.7;P1.7輸出變低電平MOVR7,#18H;賦循環(huán)初值HERE:DJNZR7,HERE;(R7)←(R7)-1,不為0;繼續(xù)循環(huán) SETBP1.7;P1.7輸出高電平

延時計算例:已知內(nèi)部RAM中30H為始地址的數(shù)據(jù)塊存放連續(xù)十個無符號數(shù),試編程求十個數(shù)的和并把和放到50H單元。

data3data2data130HORG0010MOVR2,#10MOVR1,#30HCLRALOOP:ADDA,@R1INCR1DJNZR2,LOOPMOV50H,AEND和3、子程序調(diào)用和返回指令把具有完整功能的程序定義為子程序主程序運行中可多次調(diào)用子程序,子程序還可以再調(diào)用子程序(子程序嵌套)調(diào)用子程序時,需要保護現(xiàn)場,把斷點處地址保存起來,通過堆棧來完成,先壓入PC的低八位,再壓入PC的高八位,兩條調(diào)用指令如下:LCALL長調(diào)用ACALL短調(diào)用一次調(diào)用子程序子程序的嵌套PCPC+3SPSP+1(SP)PC7~PC0SPSP+1(SP)PC15~PC8PCadd16ACALLadd11PCPC+2SPSP+1(SP)PC7~PC0SPSP+1(SP)PC15~PC8PC10~0add11LCALLAdd16與LJMP和AJMP類似,只是多了自動保存斷點地址的功能ORG0010MOVSP,#70HLCALLA060H16H00H

70H71H72H0010H75H0011H81H0012H70H0013H12H0014HA0H0015H60H先壓入斷點地址的低八位,再壓入斷點地址的高八位(2)返回指令RET(RETI)PC15~8(SP)SPSP-1PC7~0(SP)SPSP-1RET子程序返回指令RETI中斷返回指令,返回后清除中斷優(yōu)先標(biāo)志。

例3-34設(shè)(SP)=53H,子程序首址在3000單元,并以標(biāo)號STR表示。在(PC)=2000H處執(zhí)行指令:LCALLSTR將使(SP)=55H,(54H)=03H,(55H)=20H,(PC)=3000H。例3-35設(shè)(SP)=55H,RAM中(54H)=03H,(55H)=20H,則執(zhí)行RET后,PC=?SP=?(PC)8~15=20HSP=54H(SP)=53H,(PC)=2003H程序由2003H開始執(zhí)行。(PC)0~7=03HSP=53H

例3-36用NOP指令產(chǎn)生方波。SQU1:CLRP2.7;P2.7清0輸出NOP;空操作NOPSETBP2.7;置位P2.7高電平輸出NOPNOP執(zhí)行空操作指令NOP除PC加1外,不做任何操作,而轉(zhuǎn)向下一條指令去執(zhí)行。不影響任何寄存器和標(biāo)志。

溫馨提示

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

評論

0/150

提交評論