單片機原理及接口技術(shù):第3章 MCS51指令系統(tǒng)與程序設(shè)計_第1頁
單片機原理及接口技術(shù):第3章 MCS51指令系統(tǒng)與程序設(shè)計_第2頁
單片機原理及接口技術(shù):第3章 MCS51指令系統(tǒng)與程序設(shè)計_第3頁
單片機原理及接口技術(shù):第3章 MCS51指令系統(tǒng)與程序設(shè)計_第4頁
單片機原理及接口技術(shù):第3章 MCS51指令系統(tǒng)與程序設(shè)計_第5頁
已閱讀5頁,還剩164頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章

MCS51指令系統(tǒng)與程序設(shè)計學(xué)習(xí)目的及要求熟悉指令格式;掌握尋址方式;牢記指令。掌握匯編語言程序設(shè)計的語言結(jié)構(gòu);掌握常用的程序設(shè)計方法,如順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上使用廣泛的子程序及中斷服務(wù)子程序五種結(jié)構(gòu);重點掌握循環(huán)程序,子程序設(shè)計和查表程序設(shè)計。第3章MCS-51指令系統(tǒng)與程序設(shè)計3.1MCS-51指令系統(tǒng)概述3.2尋址方式3.3數(shù)據(jù)傳送指令3.4算術(shù)/邏輯運算和移位指令3.5控制轉(zhuǎn)移指令和位操作指令3.6匯編語言程序的設(shè)計3.7本章小結(jié)3.1

MCS-51指令系統(tǒng)概述指令:用于控制功能部件完成某一動作的指示或命令。指令系統(tǒng):指令的集合,是CPU的重要指標和設(shè)計基礎(chǔ)。指令的格式:

[標號]:操作碼[目的操作數(shù)],[源操作數(shù)];注釋

MAIN:MOVA,

#30H;74H

30H指令的字節(jié)數(shù):單、雙和三字節(jié)。3.1.1指令的分類單字節(jié)指令雙字節(jié)指令三字節(jié)指令按指令的字節(jié)數(shù)單周期指令雙周期指令四周期指令按指令的執(zhí)行時間數(shù)據(jù)傳送指令(28條)算術(shù)運算指令(24條)邏輯運算指令和移位指令(25條)控制轉(zhuǎn)移指令(17條)位操作指令(28條)按指令的功能3.1.1指令的分類指令系統(tǒng)中所用符號的說明:①Rn:工作寄存器,n=0,1…7②#data:8位立即數(shù)③direct:8位直接地址,00H~7FH或SFR④@Ri:寄存器間接尋址,i=0或1⑤#data16:16位立即數(shù)⑥@DPTR:以DPTR為數(shù)據(jù)指針的間接尋址⑦bit:位地址,00H~7FH或20H.2或PSW.0⑧addr11:11位的目標地址⑨addr16:16位的目標地址⑩rel:8位帶符號的地址偏移量

$:當(dāng)前指令的地址3.2尋址方式計算機尋找操作數(shù)或下一條要執(zhí)行的指令的地址的方式。1.立即尋址2.直接尋址3.寄存器尋址4.寄存器間接尋址5.變址尋址6.相對尋址7.位尋址“立即直接、寄存間接、相對變址”必須熟練掌握3.2.1立即尋址指令中直接給出操作數(shù)。例如:MOV A,#30H;74H

30HACC30H74H30H程序存儲器ROM3.2.2直接尋址指令中直接給出操作數(shù)的直接地址。例如:MOV A,30H;E5H

30H75HACC30H31H5AH33H內(nèi)部RAME0H5AH區(qū)別:MOV A,30H;E5H

30HMOV A,#30H;74H

30H可尋址空間:片內(nèi)RAM的低128字節(jié);特殊功能寄存器SFR。3.2.3寄存器尋址指令中給出存放操作數(shù)的寄存器名稱。例如:MOV A,R1;E9H75HACCR0R15DH3AH內(nèi)部RAME0H3AH常用寄存器:A、B、DPTR、R0~R7。3.2.4寄存器間接尋址以指令指定的寄存器內(nèi)容為地址,該地址所指向的內(nèi)部RAM單元的內(nèi)容為操作數(shù)。例如:MOV R1,#30H;A9H

30HMOV A,@R1;E7H75HACCR0R15DH30H內(nèi)部RAME0H30H33H33H區(qū)別:MOV A,@R1;E7HMOV A,R1;E9H可尋址空間:片內(nèi)RAM(@R0、@R1);片外RAM(@R0、@R1、

@DPTR)。4種尋址方式的總結(jié)1.立即尋址MOV A,#data;A←data;74H

dataMOV Rn,#data;Rn←data;78~FH

dataMOV @Ri,#data;(Ri)←data;76~7H

dataMOV direct,#data;direct←data;75H

data2.直接尋址MOV A,direct;A←(direct);E5Hdirect

MOV direct,A;A→direct;F5H

directMOV Rn,direct;Rn←(direct);A8~FH

directMOV @Ri,direct;(Ri)←(direct);A6~7H

directMOV direct2,direct1;direct2←direct1

;85Hdirect2direct1一般RAM區(qū)位尋址區(qū)寄存器3區(qū)寄存器2區(qū)寄存器1區(qū)寄存器0區(qū)0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7內(nèi)部數(shù)據(jù)存儲器SFR區(qū)80FF4種尋址方式的總結(jié)3.寄存器尋址MOV A,Rn ;A←Rn;E8~EFHMOV Rn,A ;Rn←A;F8~FFHMOV direct,Rn;direct←Rn;88~8FH4.寄存器間接尋址MOV A,@Ri ;A←(Ri);E6~E7HMOV @Ri,A;(Ri)←A;F6~F7HMOV direct,@Ri;direct←(Ri);86~87H

direct一般RAM區(qū)位尋址區(qū)寄存器3區(qū)寄存器2區(qū)寄存器1區(qū)寄存器0區(qū)0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7內(nèi)部數(shù)據(jù)存儲器SFR區(qū)80FF3.2.5變址尋址以DPTR(PC)為基地址,加上地址偏移量(A中8位無符號數(shù))形成操作數(shù)地址的方式。操作數(shù)存放在程序存儲器中,操作數(shù)的地址=基址寄存器的內(nèi)容+變址寄存器的內(nèi)容該地址所指向的程序存儲器單元的內(nèi)容為操作數(shù)。例如:MOVCA,@A+DPTR;93HADPTR22100H2102H=+Acc042100H2101H2103H2102H00H01H04H09HROM可尋址空間:程序存儲器3.2.6相對尋址

以指令中給出的操作數(shù)作為程序轉(zhuǎn)移的偏移量,用于訪問程序存儲器,用相對轉(zhuǎn)移指令來實現(xiàn)。MOVA,#30HCLRCSUBBA,R2JCNEXT ;40relSJMPOUT ;80relNEXT:NOP ;00OUT:·······目的地址=源地址+地址偏移量(rel)+轉(zhuǎn)移指令字節(jié)數(shù)可尋址空間:程序存儲器3.2.7位尋址對內(nèi)部RAM中的位尋址區(qū)和可位尋址的特殊功能寄存器進行位操作。3.2.7位尋址1SETB20HCLR31H10SETBCCLRACC.001

交流與思考1.執(zhí)行當(dāng)前指令后,PC的內(nèi)容為

。2.MOVXA,@DPTR源操作數(shù)尋址方式為

。3.JNCrel指令的尋址方式是

。4.MOVC,20H源操作數(shù)尋址方式為

。5.在訪問特殊功能寄存器時,只能使用

尋址方式。6.在寄存器間接尋址方式中,指定寄存器中存放的是

。下一條將要讀取指令碼的首地址寄存器間接尋址相對尋址位尋址直接尋址操作數(shù)地址

交流與思考

交流與思考1.JZe的操作碼地址為1000H,e=20H,它的轉(zhuǎn)移目的地址為

。2.JBC02H,e操作碼的地址為2000H,e=70H,它的轉(zhuǎn)移目的地址為

。1022H2073H3.3數(shù)據(jù)傳送指令最基本、最主要的操作3.3.1內(nèi)部數(shù)據(jù)傳送指令3.3.2外部數(shù)據(jù)傳送指令3.3.3堆棧操作指令3.3.4數(shù)據(jù)交換指令必須熟練掌握3.3數(shù)據(jù)傳送指令3.3數(shù)據(jù)傳送指令3.3.1內(nèi)部數(shù)據(jù)傳送指令1.立即尋址MOV A,#data ;A←dataMOV Rn,#data ;Rn←dataMOV @Ri,#data ;(Ri)←dataMOV direct,#data ;direct←dataMoveimmediatedatatoAccumulatorMoveimmediatedatatoregisterMoveimmediatedatatodirectbyteMoveimmediatedatatoindirectRAM3.3.1內(nèi)部數(shù)據(jù)傳送指令【例3.2】

已知:R0=20H,MOVA,#18HMOVR7,#28HMOV@R0,#38HMOV21H,#48H執(zhí)行指令后,A=________;R7=________;(20H)=______;(21H)=______。18H28H38H48H3.3.1內(nèi)部數(shù)據(jù)傳送指令2.直接尋址MOV A,direct ;A←(direct)MOV direct,A ;A→directMOV Rn,direct ;Rn←(direct)MOV @Ri,direct ;(Ri)←(direct)MOV direct2,direct1 ;direct2←direct1MovedirectbytetoAccumulatorMoveAccumulatortodirectbyteMovedirectbytetoregisterMovedirectbytetoindirectRAMMovedirectbytetodirect3.3.1內(nèi)部數(shù)據(jù)傳送指令【例3.3】

已知:R1=32H,(30H)=AAH,(31H)=BBH,(32H)=CCHMOVA,30HMOV50H,AMOVR6,31HMOV@R1,30HMOVP1,32H執(zhí)行指令后,A=________;(50H)=________;R6=________;(32H)=________;P1=_________。AAHAAHBBHAAHAAH3.3.1內(nèi)部數(shù)據(jù)傳送指令3.寄存器尋址MOV A,Rn ;A←RnMOV Rn,A ;Rn←AMOV direct,Rn ;direct←Rn4.寄存器間接尋址MOV A,@Ri ;A←(Ri)MOV @Ri,A ;(Ri)←AMOV direct,@Ri ;direct←(Ri)3.3.1內(nèi)部數(shù)據(jù)傳送指令【例3.4】

已知:(40H)=11H,(41H)=22H,R0=40H,R1=41HMOV A,@R0MOV @R1,AMOV 42H,@R1執(zhí)行指令后,A=________;(40H)=________;(41H)=______;(42H)=______。11H11H11H11H3.3.1內(nèi)部數(shù)據(jù)傳送指令5.內(nèi)部數(shù)據(jù)傳送指令的使用3.3.2外部數(shù)據(jù)傳送指令1.16位數(shù)據(jù)傳送指令MOV DPTR,#data16 ;DPTR←data162.ROM的字節(jié)傳送指令MOVC A,@A+DPTR ;A←(A+DPTR)MOVC A,@A+PC ;PC←PC+1,A←(A+PC)3.3.2外部數(shù)據(jù)傳送指令3.外部RAM的字節(jié)傳送指令MOVX A,@Ri ;A←(Ri)MOVX @Ri,A ;(Ri)←AMOVX A,@DPTR ;A←(DPTR)MOVX @DPTR,A ;(DPTR)←A

3.3.3堆棧操作指令PUSH direct ;SP←SP+1,(SP)←(direct)POP direct ;direct←(SP),(SP)←SP-1【例3.8】

已知(30H)=X,(40H)=Y,請編程以堆棧操作方式交換兩單元內(nèi)容。MOV SP,#70H;令棧底地址為70HPUSH 30H;SP←SP+1,71H←XPUSH 40H;SP←SP+1,72H←YPOP 30H;30H←Y,(SP)←SP-1=71HPOP 40H;40H←X,(SP)←SP-1=70H3.3.4數(shù)據(jù)交換指令XCH A,RnXCH A,directXCH A,@RiXCHD A,@Ri【例3.9】

已知外部RAM20H=X,內(nèi)部RAM20H=Y,請編程交換兩單元內(nèi)容。MOV R1,#20HMOVXA,@R1XCHA,@R1MOVX@R1,A3.4算術(shù)運算、邏輯運算和移位指令3.4.1算術(shù)運算指令3.4.2邏輯運算指令3.4.3移位指令必須熟練掌握3.4.1算術(shù)運算指令1.加法指令(1)不帶進位加法指令A(yù)DD A,RnADD A,directADD A,@RiADD A,#data(2)帶進位加法指令A(yù)DDC A,RnADDC A,directADDCA,@RiADDCA,#data3.4.1算術(shù)運算指令【例3.12】

設(shè)X=5AH,Y=6BH編程X+Y,并寫出A和PSW值。MOVA,#5AHADDA,#6BHA=C5HPSW=44H3.4.1算術(shù)運算指令(3)加1指令I(lǐng)NC AINCRnINCdirectINC@RiINC DPTR3.4.1算術(shù)運算指令【例3.14】

已知M1和M2單元存放兩個16位無符號數(shù)X1和X2(低8位在前,高8位在后),寫出X1+X2的程序并放在M1和M1+1中。MOVR0,#M1MOVR1,#M2MOVA,@R0ADDA,@R1MOV@R0,AINCR0INCR1MOVA,@R0ADDCA,@R1MOV@R0,ASJMP$3.4.1算術(shù)運算指令2.減法指令(1)帶借位的減法指令SUBB A,RnSUBBA,directSUBBA,@RiSUBBA,#data (2)減1指令DEC ADECRnDECdirectDEC@Ri3.4.1算術(shù)運算指令3.十進制調(diào)整指令DAA(1)BCD碼加法【例3.17】寫出完成85+59的BCD加法程序(2)BCD碼減法【例3.18】寫出完成91-36的BCD減法程序3.4.1算術(shù)運算指令4.乘法和除法指令MUL ABDIV AB3.4.1算術(shù)運算指令【例3.19】

已知兩個8位無符號乘數(shù)分別放在30H和31H中,試編程令它們相乘并把積的低8位放入32H,積的高8位放入33H中。MOVR0,#30HMOVA,@R0INCR0MOVB,@R0MULABINCR0MOV@R0,AINCR0MOV@R0,BSJMP$3.4.2邏輯運算指令1.邏輯與指令A(yù)NL A,RnANL A,directANL A,@RiANL A,#dataANL direct,AANL direct,#data3.4.2邏輯運算指令2.邏輯或指令ORL A,RnORL A,directORL A,@RiORL A,#dataORL direct,AORL direct,#data3.4.2邏輯運算指令【例3.22】

設(shè)A=AAH,P1=FFH,試通過編程將A中的低4位送入P1口低4位,P1口高4位不變。MOVR0,AANLA,#0FHANLP1,#0F0HORLP1,AMOVA,R0SJMP$3.4.2邏輯運算指令3.邏輯異或指令XRL A,RnXRL A,directXRL A,@RiXRL A,#dataXRL direct,AXRL direct,#data3.4.2邏輯運算指令【例3.23】

已知外部RAM30H=AAH,現(xiàn)欲使它高4位不變低4位取反,試編程。MOVR0,#30HMOVXA,@R0XRLA,#0FHMOVX@R0,ASJMP$3.4.2邏輯運算指令4.累加器的清零與取反指令CLR ACPL A3.4.2邏輯運算指令【例3.24】

已知30H單元有一個正數(shù)X,試編程求出-X的補碼。MOVA,30HCPLAINCAMOV30H,ASJMP$3.4.3移位指令循環(huán)左/右移位指令RL ARR A帶進位標志的循環(huán)左/右移位指令RLC ARRC A半字節(jié)交換指令SWAPA3.4.3移位指令例:在內(nèi)部RAMM1和M1+1單元中有兩個BCD數(shù),請編程把它們緊縮成一個字節(jié)并放入M1單元.0000BCD10000BCD2M1M1+1BCD1BCD2M1例:一字節(jié)數(shù)據(jù)拆分成高4位和低4位一般RAM區(qū)位尋址區(qū)寄存器3區(qū)寄存器2區(qū)寄存器1區(qū)寄存器0區(qū)0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7內(nèi)部數(shù)據(jù)存儲器SFR區(qū)80FF3.5控制轉(zhuǎn)移和位操作指令3.5.1控制轉(zhuǎn)移指令3.5.2位操作指令3.5.1控制轉(zhuǎn)移指令1.無條件轉(zhuǎn)移指令長轉(zhuǎn)移:LJMP addr16絕對轉(zhuǎn)移:AJMP addr11短轉(zhuǎn)移:SJMP rel散轉(zhuǎn)指令:JMP @A+DPTR外部內(nèi)部外部00000FFF1000FFFF程序存儲器EA=1EA=03.5.1控制轉(zhuǎn)移指令(1)長轉(zhuǎn)移指令長轉(zhuǎn)移指令的功能是把指令碼中的16位地址addr16送入程序計數(shù)器PC,使程序無條件地轉(zhuǎn)移到addr16處執(zhí)行.LJMP addr16 ;指令助記符LJMP NEXT ;應(yīng)用形式長轉(zhuǎn)移指令的機器碼為:轉(zhuǎn)移范圍64KB02Haddr15-8addr7-0指令碼高8位地址低8位地址3.5.1控制轉(zhuǎn)移指令(2)絕對轉(zhuǎn)移指令A(yù)JMP addr11 ;指令助記符AJMPNEXT ;應(yīng)用形式絕對轉(zhuǎn)移指令的機器碼為:a10a9a800001a7a6a5a4a3a2a1a0a10a9a8a7a6a5a4a3a2a1a0PC15-PC11目標地址:轉(zhuǎn)移范圍2KB3.5.1控制轉(zhuǎn)移指令(3)短轉(zhuǎn)移指令SJMP rel ;指令助記符SJMP NEXT ;應(yīng)用形式目的地址=源地址+地址偏移量(rel)+轉(zhuǎn)移指令字節(jié)數(shù)80Hrel操作碼地址偏移量短轉(zhuǎn)移指令的機器碼為:3.5.1控制轉(zhuǎn)移指令(4)變址尋址轉(zhuǎn)移指令JMP@A+DPTR例3.30應(yīng)用系統(tǒng)中有K0~K34個按鍵。如果其中某鍵按下,鍵檢測程序?qū)?yīng)的鍵號(0~3)送入累加器A,請編寫一段程序,根據(jù)A中的鍵號轉(zhuǎn)去執(zhí)行相應(yīng)的鍵處理程序PM0~PM3。K0K1K2K3LJMPPM0LJMPPM1LJMPPM2LJMPPM3PMTBPMTB+3PMTB+6PMTB+9……轉(zhuǎn)移指令表K0K3K2K1PM0PM1PM2PM33.5.1控制轉(zhuǎn)移指令PMTB:LJMPPM0LJMPPM1LJMPPM2LJMPPM3……PM0: ……PM1: ……K0K1K2K33.5.1控制轉(zhuǎn)移指令3.5.1控制轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令(1)累加器A判零轉(zhuǎn)移指令JZ relJNZ rel例3.31(P114)將外部RAM中以DATA1為起始地址的數(shù)據(jù)塊以零為結(jié)束標志,編程將之傳送到DATA2起始地址的內(nèi)部RAM區(qū)。MCS-51RAM1DATA1DATA2RAM2DATA23.5.1控制轉(zhuǎn)移指令【例3.31】

將外部RAM中以DATA1為起始地址的數(shù)據(jù)塊以零為結(jié)束標志,編程將之傳送到DATA2起始地址的內(nèi)部RAM區(qū)。MOVR0,#DATA1MOVR1,#DATA2LOOP:MOVXA,@R0JZDONEMOV@R1,AINCR0INCR1SJMPLOOPDONE:SJMP$END3.5.1控制轉(zhuǎn)移指令(2)比較條件轉(zhuǎn)移指令CJNE A,#data,relCJNE A,direct,relCJNERn,#data,relCJNE @Ri,#data,rel3.5.1控制轉(zhuǎn)移指令(3)減1條件轉(zhuǎn)移指令DJNZ Rn,relDJNZ direct,rel3.5.1控制轉(zhuǎn)移指令【例3.32】

試編寫一程序?qū)?nèi)RAM中以DAT為起始地址的數(shù)據(jù)塊中的連續(xù)10個無符號數(shù)相加,將和送到SUM單元。設(shè)和不超過一個字節(jié)。0010010100011110DAT+1DAT……SUM一般RAM區(qū)位尋址區(qū)寄存器3區(qū)寄存器2區(qū)寄存器1區(qū)寄存器0區(qū)0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7內(nèi)部數(shù)據(jù)存儲器SFR區(qū)80FF3.5.1控制轉(zhuǎn)移指令【例3.33

】試編一程序?qū)⑵瑑?nèi)RAM中以DAT為起始地址的數(shù)據(jù)塊中的連續(xù)10個無符號數(shù)相加,并將結(jié)果送到SUM單元。設(shè)結(jié)果不超過8位二進制數(shù)所能表達的范圍。ORG1000HMOVR2,#0AHMOVR0,#DATCLRALOOP:ADDA,@R0INCR0DJNZR2,LOOPMOVSUM,ADONE:SJMP$END3.5.1控制轉(zhuǎn)移指令3.子程序調(diào)用和返回指令(1)調(diào)用指令①長調(diào)用指令LCALL addr16②絕對調(diào)用指令A(yù)CALL addr11(2)返回指令RETRETI3.5.1控制轉(zhuǎn)移指令子程序設(shè)計例:0010010100011110DAT1+1DAT1……SUM10000110100011110DAT2+1DAT2……SUM2一般RAM區(qū)位尋址區(qū)寄存器3區(qū)寄存器2區(qū)寄存器1區(qū)寄存器0區(qū)0007080F17101F187F2F3020R0~R7R0~R7R0~R7R0~R7內(nèi)部數(shù)據(jù)存儲器SFR區(qū)80FF3.5.1控制轉(zhuǎn)移指令ORG1000H MOV R2,#0AH;待求和數(shù)據(jù)個數(shù) MOV R0,#DAT1;數(shù)據(jù)塊的首地址 CLR ALOOP:ADDA,@R0 INC R0;循環(huán)程序求和 DJNZ R2,LOOP MOV SUM1,A;存放和 SJMP$ END3.5.1控制轉(zhuǎn)移指令主程序MOV R2,#05HMOV R0,#DAT1MOV R1,#SUM1ACALL ADDNMOV R2,#08HMOV R0,#DAT2MOV R1,#SUM2ACALL ADDNSJMP $END改造的子程序ADDN:CLR ALOOP:ADD A,@R0 INC R0 DJNZR2,LOOP MOV@R1,A RET3.5.1控制轉(zhuǎn)移指令4.空操作指令NOP3.5.1控制轉(zhuǎn)移指令3.5.2位操作指令1.位傳送指令MOV C,bitMOV bit,C2.位置位和清零指令CLR CCLR bitSETB CSETB bit3.5.2位操作指令3.位運算指令A(yù)NL C,bitANL C,/bitORL C,bitORL C,/bitCPL CCPL bitW=(M)∧(N)+(M)∧(N)MNW3.5.2位操作指令4.位控制轉(zhuǎn)移指令(1)以Cy為條件的轉(zhuǎn)移指令JC relJNC rel(2)以位的內(nèi)容為條件的轉(zhuǎn)移指令JB bit,relJNB bit,relJBC bit,rel3.5.2位操作指令

【例3.38】內(nèi)部RAM的M1,M2單元中各有一個無符號8位二進制數(shù),編程比較它們的大小,并把大數(shù)送入MAX單元.MOVA,M1 CJNEA,M2,NEXTNEXT:JNCNEXT1 MOVA,M2NEXT1:MOVMAX,A RET

交流與思考1.假定(A)=56,(R5)=67.執(zhí)行指令A(yù)DDA,R5DA后,累加器A的內(nèi)容為

,CY的內(nèi)容為

。2.假定(A)=0C5H,執(zhí)行指令:SWAPA后,累加器A的內(nèi)容為

。0010001115CH

交流與思考3.已知片內(nèi)RAM的20H中為01H,執(zhí)行下列程序后(30H)=?MOVA,20HINCACPLAMOV30H,A0FDH

交流與思考4.判斷以下指令的正誤。1)MOV28H,@R42)MOVE0H,@R03)INCDPTR4)DECDPTR5)CLRR03.6匯編語言程序設(shè)計匯編語言程序設(shè)計既是軟件問題,又與硬件密切相關(guān),這是匯編語言的特點。3.6.1程序設(shè)計語言

1.機器語言:由二進制或十六進制組成,計算機能夠直接識別和執(zhí)行。難寫、難懂、難查、難交流。2.匯編語言:由助記符、保留字、偽指令組成,通過“匯編程序”翻譯成機器語言。可直接操作到計算機內(nèi)部,益于寫實時控制程序。3.高級語言:面向問題獨立于機器,通用語言。通過解釋程序和編譯程序、連接程序,編譯成目標代碼。3.6.1匯編語言格式地址標號:操作碼操作數(shù);注釋地址標號:任選項,字母開頭,1-8個字符組成。操作碼:指令保留字(MOV等)、偽指令(ORG等),指示計算機進行何種操作操作數(shù):存放指令的操作數(shù)或操作數(shù)地址,由指令確定(解釋見P128)注釋字段:任選項,助于編寫、閱讀程序。3.6.1匯編語言構(gòu)成匯編語言語句有三種基本類型:指令語句、偽指令語句和宏指令語句。1.指令性語句:用指令助記符構(gòu)成的語句,指令系統(tǒng),它要產(chǎn)生機器代碼。2.指示性語句:偽指令,不產(chǎn)生機器碼,只為匯編程序提供信息,是匯編程序識別執(zhí)行的命令,用來對匯編過程進行某種控制。3.宏指令語句:用以代替匯編語言源程序中重復(fù)使用的程序段的一種語句,由匯編程序在匯編時產(chǎn)生相應(yīng)的目標代碼。3.6.1偽指令定義:僅向匯編程序發(fā)出的,并僅由匯編程序在匯編過程中識別和執(zhí)行的一種匯編控制命令,它本身在目標程序中不產(chǎn)生機器碼。匯編起始偽指令:ORG匯編結(jié)束偽指令:END定義字節(jié)偽指令:DB定義字偽指令:DW定義位偽指令:BIT賦值偽指令:EQUDATA3.6.1偽指令1.匯編起始偽指令格式:ORG<起始地址>(ORiGin)功能:指定匯編源程序編譯成機器語言程序的起始地址。例如:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AHSJMP$END程序中可以有多條ORG語句,但定義的起始地址既不要交叉,也不要重疊。必須從小地址向大地址分配程序所占空間。3.6.1偽指令2.匯編結(jié)束偽指令格式:END[ENDofassembly]功能:停止匯編示例:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AhSJMP$END

3.6.1偽指令3.定義字節(jié)偽指令格式:<標號:>DB<項或項表>功能:把項或項表的數(shù)值存入從標號開始的連續(xù)單元,其中項或項表可以是一個字節(jié)、數(shù)或以引號括起來的字符串。

ORG1000HDat:DB11h,-1,’A’,’BCD’END

該指令只能為程序存儲器賦初值,不能為其他存儲器賦初值,尤其不能為內(nèi)部數(shù)據(jù)存儲器賦初值。注意:1000H11HFFH41H42H43H44H補碼ASCII碼程序存儲器3.6.1偽指令4.定義字偽指令格式:<標號:>DW<項或項表>功能:把項或項表的數(shù)值存入從標號開始的連續(xù)單元,其中項或項表是一個字(兩字節(jié))。

ORG1000HDat:DW1122h,3344h,-1END1000H11H22H33H44H程序存儲器只對程序存儲器起作用FFHFFH3.6.1偽指令5.定義位偽指令格式:<符號>BIT<位地址>功能:定義位變量地址

UBIT20H.0VBIT20H.1WBIT20H.2XBITP1.0YBITP2.4ZBITP3.2QBITTCON.23.6.1偽指令6.賦值偽指令格式:<符號>EQU<變量值>功能:定義符號變量值

XEQU05HYEQU06HNEXTEQU2000H格式:<符號>DATA<變量值>功能:定義符號變量值(內(nèi)部RAM)

ONEDATA30H(數(shù)據(jù)或地址)

TWODATAONE+13.6.1偽指令例.

偽指令應(yīng)用

ORG8100H DW“AB” DW100H,1ACH說明

(1)(8100H)=41H(‘A’) (8101H)=42H(‘B’) (2)8102H單元起存放01H、00H、01H、ACH3.6.2匯編語言源程序的設(shè)計和匯編匯編原理和方法

1.擬制設(shè)計任務(wù)書

2.建立數(shù)學(xué)模型

3.確立算法

4.繪制流程圖

5.編制源程序

6.上機調(diào)試3.6.2匯編語言源程序的設(shè)計和匯編把匯編語言源程序翻譯成目標代碼的過程

1.人工匯編

1)確定指令碼和地址,對于一時無法確定的地址偏移量應(yīng)照原樣寫上;2)地址符號的‘代真’過程。 2.機器匯編自動將匯編語言源程序翻譯成目標代碼,兩次掃描,完成編譯3.6.3匯編語言程序設(shè)計的結(jié)構(gòu)便于總結(jié)方法編制高質(zhì)優(yōu)秀程序。順序、分支和循環(huán)結(jié)構(gòu)

1.簡單程序設(shè)計順序結(jié)構(gòu)特點:不分長短、從頭到尾、沒有分支

語句1語句2語句n結(jié)束……入口出口簡單程序設(shè)計

【例3.39】把壓縮BCD碼變成兩個ASCII碼,分別存放。

方法:先拆開,再加30H。ORG 0000H MOV A,20H ANL A,#0F0H SWAP A ORL A,#30H MOV 21H,A MOV 22H,20H ANL 22H,#0FH ORL 22H,#30H SJMP $ END簡單程序設(shè)計【例3.40】一個16位二進制負數(shù)(補碼),低8位在NUM單元,高8位在NUM+1單元,編寫程序求該數(shù)的絕對值.MOV A,NUMCPL AADD A,#01HMOV NUM,AMOVA,NUM+1CPL AADDCA,#00HMOV NUM+1,A簡單程序設(shè)計【例3.41】在20H中有一個8位無符號數(shù),請編寫程序把它轉(zhuǎn)換成三位BCD數(shù),把百位送入FIRST單元的低四位,十位和個位放在SECOND單元里.FIRST DATA30HSECONDDATA31HMOVA,20HMOVB,#64HDIVABMOVFIRST,AMOVA,BMOVB,#0AHDIV ABSWAPAORL A,BMOV SECOND,ASJMP$簡單程序設(shè)計【例3-43】設(shè)被加數(shù)存放在內(nèi)部RAM的30H(最高字節(jié))、31H(次高字節(jié))和32H(低位字節(jié))單元中,加數(shù)的相應(yīng)字節(jié)存放在內(nèi)部RAM的33H、34H和35H單元中,試將兩數(shù)相加,運算結(jié)果存放在30H、31H和32H中,進位位存放在位尋址區(qū)的00H位中?!纠?-44】設(shè)在8031單片機的外部RAM的60H單元存有1字節(jié)代碼,要求將其分解成兩個4位字段,高4位存入原單元的低4位,其低4位存入61H單元的低4位且要求這兩單元的高4位均為0,試編制相應(yīng)的程序。分支程序設(shè)計【例3.42】變量X存放在VAR單元,按如下條件為函數(shù)值Y賦值,Y存放在FUNC單元.Y=1 X>00 X=0-1 X<0A←XA=0?A>0?A←0FFHA←1存結(jié)果NYNY分支程序設(shè)計VARDATA30HFUNCDATA31HMOVA,VARJZ DONEJBACC.7,NEG MOVFUNC,#01HSJMP$NEG:MOVFUNC,#0FFHSJMP$DONE:MOVFUNC,#00HSJMP$分支程序設(shè)計【例3.43】多分支程序.已知R3的值為00H~7FH中的一個,請編寫出根據(jù)R3的值轉(zhuǎn)移到相應(yīng)的分支程序去的程序.分支較少時,可以使用比較條件轉(zhuǎn)移指令,如R3的值為00~03H,可以按下面的方法設(shè)計程序:00010203K0K1K2K分支程序設(shè)計MOVA,R3CJNEA,#00H,NEXT1SJMPK0NEXT1:CJNEA,#01H,NEXT2SJMPK1NEXT2:CJNEA,#02H,NEXT3SJMPK2NEXT3:CJNEA,#03H,NEXT4SJMPK3NEXT4:RET K0: …K1: …K2: …K3: …分支程序設(shè)計MOVA,R3RLAMOVDPTR,#BRTABJMP@A+DPTRBRTAB:AJMPROUT00AJMPROUT01AJMPROUT02……AJMP ROUT127ROUT00: …ROUT01: … …ROUT127: … END分支程序設(shè)計【例3.44】兩個有符號數(shù)分別存于ONE和TWO單元,編程比較它們的大小,并把大數(shù)存入MAX單元.分析:有符號數(shù)比較大小可以采用X-Y>0, OV=0 OV=1(負數(shù)-正數(shù))X-Y<0, OV=0 OV=1(正數(shù)-負數(shù))分支程序設(shè)計X-Y>0, OV=0 OV=1(負數(shù)-正數(shù))X-Y<0, OV=0 OV=1(正數(shù)-負數(shù))X 累加器A求X-Y的差差=0?MAX X差>0?OV=1?YNYNMAX YYOV=1?NNY分支程序設(shè)計ORG0400HONEDATA30HTWODATA31HMAXDATA32HMOVA,ONECLR CSUBBA,TWOJZXMAXJB ACC.7,NEGJB OV,YMAXSJMPXMAXNEG: JBOV,XMAXYMAX:MOVA,TWO SJMPDONEXMAX:MOVA,ONEDONE:MOVMAX,A SJMP$ END分支程序設(shè)計【例3-46】比較內(nèi)部RAM的40H和50H單元中無符號數(shù)的大小,使得40H單元存放大數(shù),50H單元存放小數(shù)?!纠?-48】假定有3個分支程序段,各分支程序段的功能依次是從內(nèi)部RAM取數(shù)、從外部RAM低256B范圍取數(shù)和從外部RAM的64KB范圍內(nèi)取數(shù)。R0中存放內(nèi)部RAM地址或外部RAM的低8位地址,R1中存放外部RAM的高8位,R3中存放分支序號值(0,1,2)。試編制程序段,根據(jù)R3的內(nèi)容轉(zhuǎn)入不同的處理功能。循環(huán)結(jié)構(gòu)的程序設(shè)計循環(huán)程序的結(jié)構(gòu):循環(huán)初值設(shè)置循環(huán)體循環(huán)變量修改循環(huán)是否結(jié)束?YN退出循環(huán)循環(huán)初值設(shè)置循環(huán)體循環(huán)變量修改循環(huán)是否結(jié)束?YN退出循環(huán)循環(huán)程序設(shè)計【例3.45】內(nèi)部RAM的BLOCK單元開始存放一個無符號的數(shù)據(jù)塊,數(shù)據(jù)個數(shù)存放在LEN單元,編程求數(shù)據(jù)塊各數(shù)的累加和,并存入SUM單元.R2=數(shù)據(jù)個數(shù)+1R1=塊首地址累加器A清零循環(huán)結(jié)束?A=A+@R1R1=R1+1SUM=和等待NY循環(huán)程序設(shè)計ORG0200HLENDATA20HSUMDATA21HBLOCKDATA22HMOVR2,LENINCR2MOVR1,#BLOCKCLRALOOP:DJNZR2,NEXT SJMPSTORENEXT:ADDA,@R1 INCR1 SJMPLOOPSTORE:MOVSUM,A SJMP$循環(huán)程序設(shè)計【例3.46】已知內(nèi)部RAMADDR為首地址的數(shù)據(jù)塊內(nèi)存放無符號數(shù)據(jù),塊長存放在LEN單元,請編程求出塊中最大值并存入MAX單元.循環(huán)程序設(shè)計A清零數(shù)據(jù)塊首地址 R0求A與塊中數(shù)據(jù)的差A(yù)>塊中數(shù)據(jù)A 塊中數(shù)據(jù)修改數(shù)據(jù)地址指針循環(huán)是否結(jié)束?MAX A中最大值恢復(fù)A中數(shù)據(jù)YNYN循環(huán)程序設(shè)計LEN DATA20HMAX DATA21HORG 0300HCLR AMOV R0,#ADDRLOOP:

CLR CSUBBA,@R0JNC NEXTMOV A,@R0SJMPNEXT1NEXT:ADDA,@R0NEXT1:INCR0 DJNZLEN,LOOP MOVMAX,A SJMP$循環(huán)程序設(shè)計采用比較條件轉(zhuǎn)移指令MOVMAX,#00HMOVR0,#ADDRLOOP:MOVA,@R0CJNEA,MAX,NEXT1NEXT1:JCNEXTMOVMAX,ANEXT:INCR0DJNZLEN,LOOPSJMP$循環(huán)程序設(shè)計【例3.47】多重循環(huán)程序設(shè)有10組三字節(jié)被加數(shù)和加數(shù),分別存放在內(nèi)部RAM中以BLOCK1和BLOCK2為首地址的兩個數(shù)據(jù)塊中.請編程求10組數(shù)的和(設(shè)和仍為三字節(jié)),把和送回以BLOCK1為首地址的數(shù)據(jù)塊中。D7~D0D15~D8D23~D16D7~D0D15~D8D23~D16BLOCK1BLOCK2+D7~D0D15~D8D23~D16BLOCK1和R0 BLOCK1R1 BLOCK2R2 10R3 3CY 01個字節(jié)相加修改被加數(shù)地址指針修改加數(shù)地址指針字節(jié)數(shù)-1=0?數(shù)據(jù)個數(shù)-1=0?等待NNY循環(huán)程序設(shè)計ORG0050HBLOCK1DATA20HBLOCK2DATA40HMOVR0,#BLOCK1MOVR1,#BLOCK2MOVR2,#0AHLOOP:MOVR3,#03HCLRCLOOP1:MOVA,@R0ADDCA,@R循環(huán)程序設(shè)計MOV@R0,AINCR0INCR1DJNZR3,LOOP1DJNZ R2,LOOPSJMP$END循環(huán)結(jié)構(gòu)的程序設(shè)計【例3-49】設(shè)長度不超過100字節(jié)的字符串放在8031單片機外部RAM以STA為首址的連續(xù)單元,該字符串用空格符SP('SP'=20H)作為結(jié)束標志。要求統(tǒng)計此字符串的長度并存入內(nèi)部RAM的LONG單元中,試編寫實現(xiàn)此要求的程序。【例3-50】某系有200名學(xué)生參加外語統(tǒng)考,若成績已存放在MCS-51外部RAM起始地址為ENGLISH的連續(xù)存儲單元,現(xiàn)要求統(tǒng)計90~100、80~89、70~79分之間的學(xué)生人數(shù),并將統(tǒng)計結(jié)果存入內(nèi)部RAM的GRADA、GRADB和GRADC單元。循環(huán)結(jié)構(gòu)的程序設(shè)計【例3-51】設(shè)有32個無符號數(shù)存放在8031單片機內(nèi)部以30H為起始地址的單元中,試編寫一程序?qū)⑺鼈儼磸拇蟮叫〉捻樞蚺帕?。【?-52】設(shè)8031單片機使用12MHz晶振(機器周期T為1μs),試設(shè)計延時100ms的延時程序。查表程序設(shè)計查表指令:MOVC A,@A+DPTRMOVC A,@A+PC應(yīng)用:y=f(x)或數(shù)據(jù)轉(zhuǎn)換X有規(guī)律變化,表格的結(jié)構(gòu)形式:例如:TAB: DB 30H DB 31H ……TAB1:DW 99H,99H DW 99H,98H DW 99H,94H DW 99H,86H ……查表程序設(shè)計

查表程序?qū)崿F(xiàn)查表算法。該方法把事先計算或?qū)嶒灁?shù)據(jù)按一定順序編成表格,存于程序存儲器內(nèi),然后根據(jù)輸入?yún)?shù)值,從表中取得結(jié)果。查表指令:MOVCA,@A+DPTR查表前數(shù)據(jù)表格表頭地址存入DPTR,要查得的數(shù)在表中相對表頭地址的偏移量送入累加器A,最后MOVCA,@A+DPTR完成查表,可在64KB內(nèi)查表因為DPTR可以人為修改。MOVCA,@A+PC分為三步:1)用傳送指令把所查數(shù)據(jù)的項數(shù)送入累加器A;2)使用ADDA,#data指令對累加器A進行修正,data值由下式確定:PC當(dāng)前值+data=數(shù)據(jù)表頭地址實際上data值等于查表指令和數(shù)據(jù)表格之間的字節(jié)數(shù);3)用指令MOVCA,@A+PC完成查表由于PC指針只能在A中提供的偏移地址的范圍內(nèi)查表,故,查表范圍進在一頁內(nèi)。7402240383F880FE30313233PCASCTAB+00123ASCTAB+2PC當(dāng)前值3BPC當(dāng)前值+3=PC當(dāng)前值+3+2=表頭(A)補償值=表頭地址-PC當(dāng)前值表中偏移量

MOVA,#2ADDA,#03H;計算偏移量

MOVCA,@A+PC ;查表

MOVR0,A;存結(jié)果

SJMP$ASCTAB:DB ‘0’,‘1’,‘2’,‘3’

ORG0100HMOVA,R0;取轉(zhuǎn)換值

ANLA,#0FH;屏蔽高四位

ADDA,#03H;計算偏移量

MOVCA,@A+PC ;查表

MOVR0,A;存結(jié)果

SJMP$ASCTAB:DB ‘0’,‘1’,‘2’,‘3’DB ‘4’,‘5’,‘6’,‘7’DB ‘8’,‘9’,‘A’,‘B’DB ‘C’,‘D’,‘E’,‘F’END303132333435363738394142ASCTAB1B2BPC當(dāng)前值3B以PC為指針查表程序TB1:movA,R2addA,R2movR3,AincR3addA,#07HmovcA,@A+PCxchA,R3addA,#03HmovcA,@A+PCmovR4,Asjmp$TAB1:DW1520H,7586HDW2345H,1000HDW883H,9943HDW4051H,6785HDW4468H,5871HEND152075862345100008839943TAB11B2B1B1B2B以DPTR為指針查表程序LTB2:movDPTR,#TAB2movA,R3clrCrlcAmovR3,AxchA,R2rlcAxchR2,AaddA,DPLmovDPL,AmovA,DPHaddcA,R2movDPH,A

clrAmovcA,@A+DPTRmovR2,AclrAincDPTRmovcA,@A+DPTRmovR3,AretTAB2:DW......……END雙字節(jié)R2R3查表雙字節(jié)結(jié)果查表程序設(shè)計【例3.48】編程將十六進制數(shù)轉(zhuǎn)換成為ASCII碼.ORG0050HMOVA,R0MOVDPTR,#TABMOVCA,@A+DPTRMOVR0,ASJMP$TAB:DB30H,31H,……39H DB41H,……,46H查表程序設(shè)計【例3-53】在8031單片機內(nèi)部RAM的LOC單元中存放一位非壓縮BCD碼,求其立方值并將它存放到內(nèi)部RAM的RESULT和RESULT+1單元中,試編制相應(yīng)程序?!纠?-54】已知R0低4位有一個十六進制數(shù)(0~F中的一個),試編寫能將它轉(zhuǎn)換成相應(yīng)ASCII碼并存入R0的程序?!纠?-55】已知一個以BLOCK1為起始地址的數(shù)據(jù)塊(數(shù)據(jù)塊長度在LEN單元),數(shù)據(jù)塊中每個存儲單元中的高、低4位分別為兩個十六進制數(shù),請通過編程將它們轉(zhuǎn)換為相應(yīng)的ASCII碼,并存放在以BLOCK2為起始地址的連續(xù)存儲單元中(低4位ASCII碼在前,高4位ASCII碼在后)。子程序和運算程序設(shè)計主程序……ACALLSUB(LCALLSUB)……SUB: ……;子程序RET子程序和運算程序設(shè)計子程序的參數(shù)傳遞共享1.利用寄存器或片內(nèi)RAM存儲器區(qū)2.利用寄存器傳送子程序參數(shù)地址3.利用堆棧傳送子程序參數(shù)4.利用位尋址區(qū)傳送子程序參數(shù)格式:;子程序名;子程序功能:;入口參數(shù):;出口參數(shù):;占用資源:子程序名:通過寄存器傳遞方法簡單、參數(shù)有限例:

ORG0000HMain:movsp,#5FHmovR0,#40HmovR7,#10HlcallZerosjmp$;子程序名:Zero;功能:對內(nèi)部數(shù)據(jù)區(qū)清零;入口參數(shù):R0內(nèi)部數(shù)據(jù)區(qū);R7內(nèi)部數(shù)據(jù)區(qū)長度;出口參數(shù):無;占用資源:A,R0,R7Zero:

clrALoop:

mov@R0,A

incR0

djnz,R7,Loop

ret

END

通過堆棧傳遞

ORG0000HMain:MOVSP,#5FHmov70H,#40hmov71H,#10Hpush70hpush71hlcallZerosjmp$;子程序名:Zero;功能:對內(nèi)部數(shù)據(jù)區(qū)清零;入口參數(shù):70內(nèi)部數(shù)據(jù)區(qū)地址;71h內(nèi)部數(shù)據(jù)區(qū)長度;出口參數(shù):無;占用資源:,R0,R7,70h,71hZero:popDPHpopDPLpop07h;R7pop00h;R0clrALoop:mov@R0,AincR0djnz,R7,LooppushDPLpushDPHretEND

SP5FH61H40H10HPCLPCH63H通過數(shù)據(jù)指針(DPTR)傳遞將待傳遞參數(shù)緊跟在調(diào)用指令之后

ORG0000HMain:MOVSP,#6FHNOPACALLPRINTDB‘THISISAN’DB’EXAMPLE’DB0AH,0DH,00HNEXT:NOPSJMP$PRINT:POPDPHPOPDPLPPP1:MOVA,#00HMOVCA,@A+DPTR

INCDPTRJZPPPENDPPP2:MOVP1,ASJMPPPP1PPPEND:JMP@A+DPTREND子程序和運算程序設(shè)計【例3.49】設(shè)MDA和MDB中有兩數(shù)a和b,請編寫程序求c=a2+b2,并把c送入MDC.設(shè)a和b都是小于10的數(shù).ORG 0000HMDA DATA20HMDB DATA21HMDC DATA22HMOVA,MDAACALLSQRMOVR1,AMOV A,MDBACALLSQRADDA,R1MOVMDC,ASJMP$SQR: ADDA,#01H MOVCA,@A+PC RETSTAB:DB0,1,4,9,… END子程序和運算程序設(shè)計【例3.50】在HEX單元有兩個十六進制數(shù),編程分別把它們轉(zhuǎn)換成ASCII碼,存入ASC和ASC+1單元.ORG0000HPUSHHEXACALLHASCPOPASCMOVA,HEXSWAP APUSH ACCACALLHASCPOPASC+1SJMP$子程序和運算程序設(shè)計PUSHACCINCSPINCSPRETASCTAB:DB30H,31H,… DB41H,42H,…HASC:DEC SP DEC SP POP ACC ANL A,#0FH ADD A,#07H MOVCA,@A+PC子程序和運算程序設(shè)計【例3.51】已知片內(nèi)RAM中有一個五位BCD數(shù)(高位在前,低位在后)

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論