




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章
指令系統與匯編程序設計學習目標
MCS-51單片機的指令格式及尋址方式匯編語言的指令類型
MCS-51單片機匯編語言編程基本方法偽指令使用及匯編語言程序完整格式應用MCS-51單片機指令系統進行編程主要內容3.1指令概述
3.2尋址方式 3.3指令系統 3.4偽指令 3.5匯編語言程序設計3.1指令概述
3.1.1指令格式MCS-51單片機指令格式采用了單地址指令格式。一條匯編語句是由標號、操作碼、目的操作數、源操作數和注釋等5部分組成的,其中方括號中的部分是可以選擇的。1、指令的具體格式為:
[標號]:操作碼[目的操作數],[源操作數];[注釋]例如:HY1:MOVR3,#08H;執行數據傳送操作一臺計算機所有指令的集合稱為該計算機的指令系統。其中方括號內的部分為可選項二、指令的三種表示形式機器語言、匯編語言、高級語言以ADDA,#05H為例機器語言二進制:0010010000000101十六進制:24H05H匯編語言:ADDA,#05H高級語言:X=A+B指令的表示形式是識別指令的標志。1)二進制的表示形式:特點:能被CPU直接識別、運行的形式。也稱機器碼、匯編語言的目標代碼。缺點:不便于閱讀、記憶和調試修改。2、指令的三種表示形式:2)指令的“助記符”方式(也稱“匯編格式”):
00100100B24H00001000B08HADDA,#08H
這是一種由英文單詞或字母、數字來表征指令功能的形式。是一種便于閱讀、書寫和交流的表示形式。這種“匯編”格式的指令必須把它“翻譯”為二進制形式“機器碼”后才能為CPU所識別和執行。三種不同的表示方法適用于不同的場合。本章內容都以匯編的形式介紹指令系統。二進制表示形式十六進制表示匯編格式下面是一段匯編語言程序的4分段書寫格式:標號字段操作操作數注釋碼字段字段字段START:MOVA,#00H;0→AMOVR7,#10;10→R7MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2);→ADJNZR7,LOOP;R7的內容;減1不為0;則循環NOPSJMP$1、Rn:工作寄存器可以是R0~R74、@Ri:表示寄存器間接尋址Ri只能是R0或R1(1).指令系統中用的符號說明2、#data:8位立即數3、direct:8為直接地址,可以是00H~7fH,也可以是SFR的名稱。6、@DPTR:表示以DPTR為數據指針的間接尋址,訪問外部ROM/RAM5、#data16:16位立即數7、bit:位地址。10、rel;8位帶符號地址偏移量。(2)指令對標志位的影響不同指令對標志位的影響不同8、add11:11位目標地址。9、add16:16位目標地址。11、$;當前指令的地址。助記符意義操作碼助記符對照英文傳送MOVMOVe代碼區數據傳送MOVCMOVeCode外部RAM區數據傳送MOVXMOVeeXternal壓棧PUSHPUSH退棧POPPOP交換XCHeXCHange3、51系列單片機匯編語言操作碼的對照英文助記符意義操作碼助記符對照英文十進制交換XCHDeXCHangeDecimal加法ADDADD帶進位加ADDCADDwithCarry帶借位減SUBBSUBtractwithBorrow加1INCINCrement減1DECDECrement乘MULMULtiply助記符意義操作碼助記符對照英文除DIVDIVide十進制調整DADecimalAdjust邏輯與ANLLogicleANd邏輯或ORLLogicleOR邏輯異或XRLLogicleeXclusive-oR求補CPLComPLement清零CLRCLeaR助記符意義操作碼助記符對照英文置位SETBSETBit左移RLRotateLeft帶進位左移RLCRotateLeftthrouththeCarryflag右移RRRotateRight帶進位右移RRCRotateRightthrouththeCarryflag(半字節)互換SWAPSWAP助記符意義操作碼助記符對照英文絕對轉移AJMPAbsoluteJuMP相對轉移SJMPShortJuMP長轉移LJMPLongJuMP跳轉JMPJuMP累加器為零轉移JZJumpifaccisZero累加器不為零轉移JNZJumpifaccisNotZero助記符意義操作碼助記符對照英文進位位為1轉移JCJumpifCarry(ifCy=1)進位位為0轉移JNCJumpifNotCarry(ifCy=0)指定為為1轉移JBJumpifBitisset指定位為0轉移JNBJumpifNotBit(ifbit=0)指定位為1轉移并清該位JBCJumpifBitissetandClearbit助記符意義操作碼助記符對照英文比較不等轉移CJNECompareandJumpifNotEqual減1不為0轉移DJNZDecrementandJumpifNotZero短調用ACALLAbsoluteCALL長調用LCALLLongCALL子程序返回RETRETurn中斷返回RETIRETurnfromInterrupt空操作NOPNoOPeration主要內容3.1指令概述 3.2尋址方式
3.3指令系統 3.4偽指令 3.5匯編語言程序設計尋址方式實際上是指令中提供操作數的形式,即尋找操作數或操作數所在地址的方式。51系列單片機中,存放數據的存儲器空間有4種:內部RAM、SFR、外部RAM和程序存儲器。為了區別指令中操作數所處的地址空間,對于不同存儲器中的數據操作,采用不同的尋址方式。
51系列單片機尋址方式共有七種:立即數尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址。3.2尋址方式:3.2.1立即尋址指令中直接給出操作數的尋址方式稱為立即尋址。立即數用一個前面加“#”的8位數(#data,如#40H)或16位數(#data,如#2008H)表示。它直接出現在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲器中,可以立即得到并執行。因此立即尋址的指令多為2字節或3字節指令。(P42~46)例3-1MOVA,#20HMOVDPTR,#2009H執行指令后,A的內容為20H,立即數2009H送到DPTR,DPH的內容為20H,DPL的內容為09H。
3.2.2直接尋址
指令中直接給出操作數地址(direct)的尋址方式稱為直接尋址。由于直接尋址方式中只能使用8位二進制數表示地址,所以使用直接尋址只可訪問片內RAM的128個單元以及所有的特殊功能寄存器(SFR)。對于特殊功能寄存器,既可以使用它們的地址,也可以使用它們的名字。(1)尋址空間內部RAM的低128字節00H~07FHA:適當選擇累加器的形式,累加器在指令系統中有三種形式AACC0E0HINCA04H寄存器尋址二、直接尋址:給出操作數的地址MOVA,30HA(30H)特殊功能寄存器SFR(2)使用注意事項INCACC05E0H直接尋址INC0E0H05E0H直接尋址(3)特殊功能寄存器的尋址方式只有一種即直接尋址,直接尋址的SFR的名稱如書2324頁。
直接尋址方式示意圖如下:直接尋址例子若(A)=30H,(25H)=4DH,(P0)=3EH,(30H)=11H,(20H)=2FH則執行上述指令后,結果為:(A)=4DH,(25H)=4DH,(P0)=50H,(30H)=2FH,(20H)=2FH例3-2MOVA,25H;(25H)→(A)MOVP0,#50H;立即數50H→P0MOV80H,#50H;同上一條指令相同,只是表;達方式不一樣,建議用上條;指令格式,易讀MOV30H,20H;(20H)→(30H)操作數放于某個工作寄存器內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。直接尋址和寄存器尋址的差別:
直接尋址的操作數是以地址形式(如A=E0H,B=F0H,R0=00H)直接出現在指令碼中。寄存器尋址的操作數是以寄存器編碼形式出現在指令碼中。使用寄存器尋址的寄存器少、編碼少(至多三位二進制數),通常操作碼和寄存器編碼合用一個字節,因此寄存器尋址的指令機器碼短,占用空間小,執行快。除上面所指出的幾個寄存器外,其他SFR均為直接尋址。
寄存器尋址方式示意圖如下:11100010寄存器尋址實例例3-3MOVA,R0;(R0)→(A),機器碼為E8,僅占;1字節,A和R0均為寄存器尋址MULAB;(A)*(B)→(B)(A)機器碼為A4,;A和B均為寄存器尋址MOVB,R0;(R0)→(B),機器碼為88F0,其第;2字節F0為B的地址,B為直接尋;址,R0為寄存器尋址PUAHACC;A的內容壓入堆棧,機器碼為;C0E0,其第2字節E0為A的地址;A為直接尋址
MOVB,00H;(00H)→(B),機器碼為8500F0,寄存器間接尋址:指令碼含有操作數地址的寄存器號,寄存器用R0、R1、DPTR。
3.2.4寄存器間接尋址尋址范圍A片內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);的內容→(A)MOVX@DPTR,A;(A)→以DPTR內容為地址的;外部RAM若(A)=3AH,(R0)=74H,(74H)=21H,執行第一條指令后,(74H)=3AH,其余兩條指令類似。
寄存器間接尋址實例操作數地址=基址+變址PC基址DPTR變址A,八位無符號數00H~FFH
3.2.5變址尋址這種尋址方式常用于訪問程序存儲器中的常數表。由于程序存儲器是只讀存儲器,因此變址尋址只有讀操作而無寫操作在指令符號上,采用MOVC形式。變址尋址指令只有下列3條指令。MOVCA,@A+DPTR;((A)+(DPTR))→(A)MOVCA,@A+PC;((A)+(PC))→(A)JMP@A+DPTR;(A)+(DPTR)→(PC)變址尋址方式示意圖如下:ROM1EHMOVCA,@A+DPTR0211HDPTR0200HA1EHA11H+......變址尋址實例以當前程序計數器PC值加上指令中給出的偏移量rel,構成實際操作數地址的尋址方式稱為相對尋址。在使用相對尋址時要注意以下兩點:(1)當前PC值是指相對轉移指令的存儲首地址加上該指令的字節數。(2)偏移量rel是有符號的單字節數。以補碼表示其值是-128~+127(00~FFH),負數表示從當前地址向前轉移,正數表示從當前地址向后轉移。 滿足轉移條件的目的地址為:目的地址=當前PC值+rel=轉移指令所在首地址+轉移指令的字節數+rel
3.2.6相對尋址例3-6:JZrel;若(A)=0,則(PC)=(PC)+2+rel;若(A)≠0,則(PC)=(PC)+2
在實際編程應用中,rel通常是用轉移目的地址的標號來替代,由機器匯編程序自動計算偏移量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位尋址定義:對可位尋址的地址中的內容進行位操作的尋址方式位尋址方式中位地址常用兩種方式表示:(1)、直接使用位地址。對于20H~2FH的16個單元,共128位的位地址。地址分布是00H~7FH。(2)、對于特殊功能寄存器,可以直接用寄存器名字加位數表示如PSW.0、IE.7等。也可以用其對應的位地址符號如P、EA等表示。編程時常使用符號字節地址和符號位地址形式,而不用直接字節地址和位地址,這樣做便于閱讀和理解。
3.2.7位尋址例3-7:SETB20H;1→20H位SETBEA;1→EA位SETBIP.0;同上
位尋址實例判斷下列指令中操作數的尋址方式LOOP:MOVA,BMOVAcc,#30H;MOVA,R3MOV40H,@R0MULABMOVCA,@A+DPTRSETB20HJZLOOP主要內容3.1指令概述 3.2尋址方式 3.3指令系統
3.4偽指令 3.5匯編語言程序設計51系列單片機的指令系統共有111條指令。指令系統按指令在程序存儲器所占字節可分為:單字節指令49條;雙字節指令45條;三字節指令17條。按指令執行時間可分為:
1個機器周期的指令64條;
2個機器周期的指令45條;
4個機器周期的指令(乘、除)2條;3.3指令系統:
3.3.1指令系統概述
按指令的功能可分為:數據傳送類指令29條;算術運算類指令24條;邏輯操作類指令24條;控制轉移類指令17條;位操作類指令17條。比較指令系統中的操作數,可以看出:(1)A寄存器使用頻率最高。這說明正確掌握使用A寄存器的方法至關重要,同時A也成為程序設計的瓶頸。(2)Direct出現次數居第二。這表明正確掌握片內RAM和SFR的使用非常重要;(3)@Ri和#data出現次數居第三。立即數在程序初始化和參數設置方面應用很廣;寄存器間接尋址在程序設計中常常用到。把源操作數送給目的操作數,源操作數不變分為內部RAM和SFR、外部數據傳送、堆棧指令、數據交換一、內部數據傳送指令15條1、立即尋址型:源操作數字節是立即數MOVA,#data;Adata74dataMOVRn,#data;Rndata78~7FdataMOV@Ri,#data;(Ri)data76~77dataMOVdirect,#data;(direct)data75data
3.3.2數據傳送指令例:R0=30H執行如下程序后分析AR430H31H單元的內容MOVA,#10HMOVR4,#36HMOV@R0,#7AHMOV31H,#01H;(A)=10H;(R4)=36H;(30H)=7AH;(31H)=01H2、內部數據存儲器(Rn片內RAMSFR)與累加器之間的數據傳送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、內部數據存儲器(Rn片內RAMSFR)與片內RAM之間的數據傳送MOVdirect,Rn;(direct)Rn88H~8FHdirectMOVRn,direct;RndirectA8H~AFdirectMOV@Ri,direct;(Ri)directA6H~A7HMOVdirect,@Ri;direct(Ri)86H~87HdirectMOVdirect2,direct1;(direct2)(direct1)85Hdirect1direct2例:設內部RAM(30H)=40H,(40H)=10HP1口作輸入,輸入數據為0CAH執行如下程序后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內部數據傳送指令總結:內部數據指令中都是用MOV傳送A、指令系統中,指令格式和代碼由硬件系統決定,不得自己隨意編制指令;例如MOVR1,@R2B、要清楚每種尋址方式的尋址范圍。例如R0=90HMOVA,@R0是錯誤的原因是特殊功能寄存器只能是直接尋址C、以累加器為目的操作數會影響PSW中的奇偶標志位累加器Direct直接地址Rn寄存器#data立即數@Ri間接地址例3-8將RAM中20H~25H單元內容傳入RAM中60~65H單元。
分析:傳送內容只有6次,查指令表知可使用MOVdirect1,direct2共6條指令即可完成。合理可用。程序如下:MOV60H,20HMOV61H,21HMOV62H,22HMOV63H,23HMOV64H,24HMOV65H,25H例3-9將RAM中10H~35H單元內容傳入RAM中50H~75H單元。分析:(1)傳送內容共有35H-10H+1=26H=38次,如果仍使用上述指令需要38條相同形式的指令,程序太長,可實現但不易讀。(2)使用循環傳送較好,循環次數為26H次,查循環轉移指令,共有DJNZRn,rel和DJNZdirect,rel兩條指令,前者占用字節數少,故選前者Rn=R7。(3)源操作數地址存入R0,目的操作數地址存入R1,查表知無MOV@R1,@R0指令,因此需使用MOVA,@R0和MOV@R1,A兩條指令間接實現一次數據傳送,一次傳送完成后,R0和R1分別加1,R7內容(循環次數)減1,若R7內容不等于0,執行下一次傳送,反之傳送完成。程序如下:MOVR0,#10H;數據源起始地址送R0MOVR1,#50H;目標單元起始地址送R1MOVR7,#26H;循環次數送R7NET1:MOVA,@R0;要傳送的數據送AMOV@R1,A;通過A送入目標單元INCR0;R0+1→R0INCR1;R1+1→R1DJNZR7,NET1;R7內容減1,若為0結束循環,反之跳轉到NET1
可見使用間接尋址方式傳送,輔之控制轉移指令不僅程序簡單而且易讀,合理。1、16位數傳送指令二、外部存儲器的讀寫指令7條MOVDPTR#data2、ROM的字節傳送指令訪問程序存儲器的數據傳送指令又稱作查表指令,采用基址寄存器加變址寄存器間接尋址方式,把程序存儲器中存放的表格數據讀出,傳送到累加器A。共有如下兩條單字節指令,指令操作碼助記符為MOVC。指令助記符操作功能注釋機器碼(H)MOVCA,@A+DPTR;(A)←((A)+(DPTR))93MOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))83
前一條指令采用DPTR作基址寄存器,因此可以很方便地把一個16位地址送到DPTR,實現在整個64KB程序存儲器單元到累加器A的數據傳送。即數據表格可以存放在程序存儲器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的字節傳送指令4條MOVXA,@RiMOXX@Ri,AMOVXA,@DPTRMOVX@DPTR,A前面兩條指令的高位地址由P2口設置,可訪問片外64K的范圍。例3-10將片外RAM中2000H單元內容傳入RAM中50H單元。
分析:查表知從片外RAM讀取數據有2條指令:MOVXA,@Ri和MOVXA,@DPTR。后一條指令外部RAM的地址是直接放在DPTR中的,而前一條指令,由于Ri(即R0或R1)只是一個8位的寄存器,所以只提供低8位地址,須用P2口輸出高8位地址。這時就應事先預置P2的值。使用后一條指令較簡單.
程序如下:MOVDPTR,#2000HMOVXA,@DPTRMOV50H,A需要說明的是,對外部RAM的操作必須經過累加器A才能完成。如果將片外RAM中19FFH~2030H單元的內容傳送到內部RAM中30H~61H單元,程序應如編制呢?
程序如下:MOVDPTR,#19FFHMOVR0,#30HMOVR7,#32H;傳送次數32H送R7NET1:MOVXA,@DPTRMOV@R0,AINCDPTR;指向源地址下一單元
;指向目的地址下一單元INCR0;R7內容減,1不為0則跳轉到NET1DJNZR7,NET1
堆棧操作主要用在子程序和中斷服務子程序中用來保護和恢復SFR和片內RAM中其他單元的內容。在片內RAM的128B單元中可以設定一個后進先出的區域作為堆棧區,堆棧區要足夠大且不被破壞,以保證多重嵌套子程序使用,否則會出現非正常狀態。一般在程序初始化時給堆棧指針SP賦初值,此后棧頂由堆棧指針SP指出。堆棧操作有入棧和出棧,即壓入和彈出數據。三、堆棧操作指令2條入棧指令PUSHdirect用于保存片內RAM單元或SFR中需要保護的內容。操作時,先將堆棧指針SP內容加1,然后把直接地址單元的內容壓入SP所指內部RAM單元內。出棧指令POPdirect用于恢復片內RAM單元或特殊功能寄存器SFR的內容。操作時,先將堆棧指針SP所指內部RAM單元中內容送入direct單元中,然后堆棧指針SP內容減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單元一個數X和內部RAM20H單元中的Y互換的程序XCHA,@R1;MOVX@DPTR,A;MOVDPTR,#0020H;MOVXA,@DPTR;四、數據交換類指令5條XCHA,@RiA(Ri)XCHA,directA(direct)XCHA,RnARnSWAPA;執行結果為將A的高4位與低4位交換MOVR1,#20H;;執行結果為(A)=A5HXCHDA,@Ri指令的功能是將Ri間接尋址的單元內容與累加器A中內容的低4位互換,各自的高4位內容不變。SWAPA指令是將A的高4位與低4位交換。;執行結果為:(20H)=37H,(A)=5AH例3-12若(R0)=20H,(20H)=3AH,(A)=57H,執行程序:XCHDA,@R0SWAPA
算術運算指令包括加、減、乘、除基本四則運算,共有24條指令。算術運算的結果將對進位CY、半進位AC、溢出位OV三個標志位置位或是復位,只有加1和減1指令不影響這些標志位。3.3.3算數運算指令一、算術運算指令24條1、加法指令(1)不帶進位位CY的加法源操作數可以是立即數、直接地址、寄存器、寄存器間址。ADDA,#data;AA+dataADDA,Rn;AA+RnADDA,@Ri;AA+(Ri)ADDA,direct;A(direct)注意:a、加數和被加數都為8位二進制結果也為8位,對PSW有影響。10100011CYACF0RS0RS1OV-P例3-16(A)=45H,(R0)=10H,(10H)=2FH,執行指令:ADDA,@R0執行過程為:01000101+)0010111101110100
8位二進制加法運算的一個加數固定在累加器A中,計算結果也固定存放于累加器A中。當和的第3位和第7位有進位時,分別將AC,CY標志置位1;否則為0。溢出標志OV=CP⊕CS。其中CP是高位的進位位,CS是次高位進位位。所以(A)=74H,(CY)=0,(AC)=1,(OV)=0,(P)=0。(2)帶進位位的加法指令ADDCA,RnAA+Rn+CYADDCA,directAA+(direct)+CYADDCA,@RiAA+(Ri)+CYADDCA,#dataAA+data+CY例3-17(A)=45H,(R0)=10H,(10H)=2FH,(CY)=1,執行指令:ADDCA,@R0執行過程為:0100010100101111+)101110101
這條指令與不帶進位加法指令不同點是進位標志CY將參加運算,CY的值要加到累加起A中。其結果也是存放于累加器A中。當運算結果第3位和第7位有進位時,分別將AC,CY標志位置1;否則為0。若產生溢出時,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求執行結果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,執行指令:INCAINCDPTR執行結果:(A)=C4H,(DPTR)=2100H指令的功能是將操作數所指定的單元內容加1,內容改變后又存放于同一單元。其操作不影響PSW。若單元內容為FFH,加1后溢出為00H,也不影響PSW標志。INCDPTR是指令集中唯一的一條16位算術運算指令。它是將DPTR中的內容加1。若低8位DPL執行加1操作產生溢出時,就對高8位DPH的內容加1,其結果不影響標志位。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,執行指令:SUBBA,R2
執行過程:1010100100100100-)110000100
減法指令的功能是從累加器A中減去不同尋址方式的減數以及進位位CY的值,差的結果存放在累加器A中。所以(A)=84H,(CY)=0,(AC)=0,(OV)=0。在51系列單片機指令系統中,由于沒有不帶借位的減法指令,若是要執行不帶借位的減法,必須在“SUBB”指令前用“CLRC”指令將CY清0。同時,若第3位和第7位有借位時,AC和CY需置位,否則清0。DECA;AA-1DECdirect;directdirect-1DECRn;RnRn-1DEC@Ri;(Ri)(Ri)-1(2)、減1指令這條指令的功能是將操作數所指定的單元內容減1,內容改變后又存放于同一單元。其操作不影響PSW。若單元內容為00H,減1需借位,其值溢出為FFH,其結果也不影響PSW標志。例3-22(A)=C3H,執行指令:DECA執行結果:(A)=C2H
3、十進制調整指令DAA若AC=1或A3~0>9則AA+06H若CY=1或A7~4>9則AA+60H該指令是用于壓縮BCD碼加法運算的十進制調整
十進制調整指令DAA一條專用指令,用于對BCD碼十進制數加法運算的結果進行修正。該指令必須緊跟在加法指令之后。前面講過的ADD和ADDC指令都是二進制加法指令。但對于十進制數(BCD碼)的加法運算指令系統中并沒有專門的指令,因此只能借助于二進制加法指令來完成。然而二進制數的加法運算原則不能完全適用于十進制數的加法運算,有時會產生錯誤的結果例如:(a)6+3=9(b)8+4=12(c)8+9=17011010001000+0011+0100+1001100111001←0001其中:(a)運算結果正確。9的BCD碼就是1001(b)運算結果不正確。因為十進制數的BCD碼中沒有1100這個編碼。(c)運算結果不正確。因為8+9的正確結果應為17。
分析出錯的原因:4位二進制編碼一共有16個編碼,但BCD碼采用4位二進制編碼,卻只用了其中的10個(0000~1001B)編碼。剩余的6個編碼(1010~1111B)通常稱之為無效碼。在進行BCD碼加法運算時,其結果進入或跳過無效編碼區時結果就會出現錯誤。因此對于BCD碼十進制數進行加法運算時需要進行調整,調整的方法是:(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碼減法直接調整3、指令不影響溢出標志位OV4、借助標志位可實現多位BCD碼加法結果的調整。例:完成85+59的BCD加法調整解:ORG1000HMOVA,#85H;A85HADDA,#59H;A85H+59HA=DEHDAASJMP$END01011001低四位〉9高四位〉9例3-23(A)=01010110B,(R2)=01100111B,
執行指令:ADDA,R2DAA執行過程:01010110+)0110011110111101調整:01100110結果:100100011所以,BCD碼為123。MUL1、進位標志位CY總是清零2、P由累加器中1的個數決定3、當積大于255OV=1否則OV=0DIV1、對CY和P的影響與MUL相同2、當除數為零時除法沒有意義,OV=1,否則OV=04、乘法和除法指令MULABDIVAB形成進位標志位
3.3.4邏輯操作指令
邏輯操作指令可以對兩個8位二進制數進行與、或、異或、清除、求反、移位等操作。在這類指令中,除以累加器A為目標寄存器指令外,其余指令均不影響標志位。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分別執行如下程序后累加器和30H單元中的內容是什么?
例:已知片外RAM1000H單元中有一個數7BH完成將高4位取反,低4位不變的程序ORG2000HMOVDPTR,#1000HMOVXA,@DPTR,XRLA,#F0HMOVX@DPTR,ASJMP$END011110111111000010001011例3-24(R0)=10H,(10H)=7AH,執行指令:MOVA,#3EHANLA,@R0執行過程為:00111110∧0111101000111010
已知M1單元中有一個9的ASCII碼39H,試編程把它變為BCD碼(即高4位為0,低4位不變)例方法(1)ANLM1,#0FH001110010000111100001001方法(2)MOVA,M1ANLA,#0FH
美國標準信息交換代碼(AmericanStandardCodeforInformationInterchange)是由美國國家標準學會(AmericanNationalStandardInstitute,ANSI)制定的,ASCII碼是基于拉丁字母的一套電腦編碼系統。它主要用于顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,并等同于國際標準ISO/IEC646。在計算機中,所有的數據在存儲和運算時都要使用二進制數表示(因為計算機用高電平和低電平分別表示1和0),例如,象a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規則,于是美國有關的標準化組織就出臺了所謂的ASCII編碼,統一規定了上述常用符號用哪些二進制數來表示。
例3-26設(A)=AAH,P1=FFH,試通過編程把A的低4位送入P1口低4位,P1口高4位不變。ANLA,#0FH;取出A的低4位,高4位置0ANLP1,#0F0H;取出P1口的高4位,低4位置0ORLP1,A;字節裝配例3-27編程使內部RAM中的30H單元內容的低2位清0,高2位置1,中間4位取反。
ANL30H,#0FCH;低2位清0ORL30H,#0C0H;高2位置1XRL30H,#3CH;中間4位取反
51系列單片機的移位指令只能對累加器A進行移位,移位示意圖如下所示:移位
例3-28若(A)=01101100B,CY=1,(1)執行指令RRA,結果為(A)=00110110B,CY不變(2)執行指令RRCA,結果為A=10110110B,CY=0(3)執行指令RLA,結果為(A)=11011000B,(4)執行指令RLCA,結果為A)=11011001B,CY=0例3-29已知2DH單元有一正數,試編程求其負數的補碼并傳送到30H單元。MOVA,2DHCPLAINCAMOV30H,A
3.3.5控制轉移指令控制轉移類指令的功能是改變指令的執行順序,轉移到指令指示的新的地址執行程序。51系列單片機的控制轉移指令有以下類型:無條件轉移:無需判斷,執行該指令就轉移到目的地址。條件轉移:需判斷標志位是否滿足條件,若滿足條件,則轉移到目的地址,否則順序執行。
絕對轉移:轉移的目的地址用絕對地址指示,通常為無條件轉移。相對轉移:轉移的目的地址用相對于當前PC的偏移量來表示,通常為條件轉移。長轉移或長調用:目的地址在距當前PC的64KB范圍內。短轉移或短調用:目的地址在距當前PC的2KB范圍內。一、控制轉移指令17條1、無條件轉移指令02HAdd15~add8Add7~add0LJMPadd16;PCadd16AJMPadd11SJMPrelJMP@A+DPTR(1)長轉移指令LJMPadd16三字節雙周期;PCadd11PCadd16(2)絕對轉移指令AJMPadd112字節2周期A10A9A800001A7A6A5A4A3A2A1A0分兩步:1、PC=PC+2PC的高5位為頁面地址,a0~a10為頁內地址操作碼2、PC加2后,取高5位和操作碼的11位組成新的PC值A7A6A5A4A3A2A1A0pc15pc14pc13pc12pc11A10A9A8
例:AJMPadd11Add11=10110100101B0010H10000101101001010010H0011HPC=PC+2=0012HPC的高五位是00000新的PC值是0000010110100101B=05A5H程序跳轉到05A5H處執行(3)短轉移指令SJMPrel1PC=PC+22、PC=PC+rel80Hrel目的地址=當前PC值+rel=轉移指令首地址+轉移指令字節數+relRel=目標地址-轉移指令首地址-2Rel-128~127之間rel=目的地址-轉移指令首地址-轉移指令字節數0010H;01HA;AR0;0CF01HDPTR0018H80rel;轉到STARTRel用START表示ORG0010HSTART:MOVA,#01HMOVR0,ALOOP:MOVDPTR,#0CF01HSJMPSTARTRel=0010H-0018H-2=-10Rel-128~127之間HERE:SJMPHEREHERE:SJMP$Rel=0FEH(4)變址尋址轉移指令JMP@A+DPTRPC=A+DPTR
例3-31要求當(A)=0轉處理程序K0當(A)=2轉處理程序K1當(A)=4轉處理程序K2匯編程序如下:MOVDPTR,#TABLE;表首地址送DPTR中JMP@A+DPTR;以A中內容為偏移量跳轉TABLE:AJMPK0;(A)=0轉K0執行AJMPK1;(A)=2轉K1處執行AJMPK2;(A)=16轉K8執行JMP@A+DPTR指令常用于鍵盤輸入處理程序和命令解析程序中。2、條件轉移指令8條分為累加器A的判零轉移、比較條件轉移、減1條件轉移(1)累加器A的判零轉移JZrel如果A=0,PCPC+2+rel如果A≠0,PCPC+2JNZrel如果A≠0,PCPC+2+rel如果A=0,PCPC+2例:已知外部RAM中1000H為始地址的數據塊以零為結束標志,試編程將之傳送到以30H為開始地址的內部RAM中0data3data2data11000HORG0010MOVDPTR,#1000HMOVR0,#30HLOOP:MOVXA,@DPTRJZDONEMOV@R0,AINCDPTRINCR0SJMPLOOPDONE:SJMP$END數據移動程序
(2)比較條件轉移CJNEA,(#datadirect),rel如果A≠dataPCPC+3+rel如果A=dataPCPC+3形成CY標志位目的操作數-源操作數〉0CY=0目的操作數-源操作數<0CY=1CJNERn,#data,rel形成CY標志位CJNE@Ri,#data,rel形成CY標志位目的操作數-源操作數〉0CY=0目的操作數-源操作數<0CY=1如果Rn≠dataPCPC+3+rel如果Rn=dataPCPC+3如果(Ri)≠dataPCPC+3+rel如果(Ri)=dataPCPC+3(3)減1條件轉移DJNZRn,relDJNZdirect,rel如果Rn-1≠0PCPC+2+rel如果Rn-1=0PCPC+2如果(direct)-1≠0PCPC+3+rel如果(direct)-1=0PCPC+3
例3-33軟件延時
利用DJNZ指令可在一段程序中插入某些指令來實現軟件延時。DJNZ指令執行時間為2個機器周期,這樣循環一次可產生2個機器周期延時。設主頻為12MHZ,循環次數為24次,下段程序在P1.7引腳上輸出一個50us的脈沖。
CLRP1.7;P1.7輸出變低電平MOVR7,#18H;賦循環初值HERE:DJNZR7,HERE;(R7)←(R7)-1,不為0;繼續循環 SETBP1.7;P1.7輸出高電平
延時計算例:已知內部RAM中30H為始地址的數據塊存放連續十個無符號數,試編程求十個數的和并把和放到50H單元。
data3data2data130HORG0010MOVR2,#10MOVR1,#30HCLRALOOP:ADDA,@R1INCR1DJNZR2,LOOPMOV50H,AEND和3、子程序調用和返回指令把具有完整功能的程序定義為子程序主程序運行中可多次調用子程序,子程序還可以再調用子程序(子程序嵌套)調用子程序時,需要保護現場,把斷點處地址保存起來,通過堆棧來完成,先壓入PC的低八位,再壓入PC的高八位,兩條調用指令如下:LCALL長調用ACALL短調用一次調用子程序子程序的嵌套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中斷返回指令,返回后清除中斷優先標志。
例3-34設(SP)=53H,子程序首址在3000單元,并以標號STR表示。在(PC)=2000H處執行指令:LCALLSTR將使(SP)=55H,(54H)=03H,(55H)=20H,(PC)=3000H。例3-35設(SP)=55H,RAM中(54H)=03H,(55H)=20H,則執行RET后,PC=?SP=?(PC)8~15=20HSP=54H(SP)=53H,(PC)=2003H程序由2003H開始執行。(PC)0~7=03HSP=53H
例3-36用NOP指令產生方波。SQU1:CLRP2.7;P2.7清0輸出NOP;空操作NOPSETBP2.7;置位P2.7高電平輸出NOPNOP執行空操作指令NOP除PC加1外,不做任何操作,而轉向下一條指令去執行。不影響任何寄存器和標志。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務會計與管理知識實訓分析教程
- 設備工作計劃
- 2009年資產評估師-財務會計測驗試題分章練
- 從資源整合角度解析體能訓練行業的連鎖加盟模式
- 2025年Android中高級面試必知必會講的明明白白!-備戰2025,android中高級面試必知必會
- 建筑施工特種作業-建筑架子工附著式腳手架真題庫-1
- 閏土的題目及答案
- 2023年學業水平合格考試三年分類匯編(真題)-專題一宇宙中的地球02太陽對地球的影響
- 11 2 成對數據的統計分析-高考數學真題分類 十年高考
- 新疆且末縣堯勒薩依金礦開采項目環評報告
- 天津市河道管理條例
- CB/T 3177-1994船舶鋼焊縫射線照相和超聲波檢查規則
- 國家開放大學《傳感器與測試技術》實驗參考答案
- 【廣東】高層檔案館建筑方案文本2020
- 流行病學傳染病流行病學幻燈片
- 藥物配伍禁忌查詢表
- 參加培訓人員匯總表
- 0720小罐茶品牌介紹
- 手術記錄-頸胸椎前后路脫位c7t
- PPT模板:小學生防溺水安全教育主題班會08課件(45頁PPT)
- 如何當好副職
評論
0/150
提交評論