版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第2章單片機匯編語言編程技術(shù)2.1指令格式2.2尋址方式2.3指令系統(tǒng)2.4偽指令2.5幾種典型結(jié)構(gòu)的匯編語言程序設(shè)計2.6小結(jié)習(xí)題與思考題2.1指令格式
MCS-51系列單片機匯編語言的每一條語句由4部分組成:
[標號:]助記符[操作數(shù)][;注解]格式中用[]圍起的是按需要設(shè)置的部分,顯然,對所有指令而言,助記符是必不可少的。標號:由1~8個字符組成的語句地址符號,必須以字母開頭,其余字符可使用字母或數(shù)字。標號既可代表本條指令,也可代表本條指令操作碼在ROM中存放的第一個存儲單元地址。標號必須以冒號“:”結(jié)束。助記符:又稱操作符,是指令的必不可少部分,它使用接近于人類自然語言的形式幫助人們記住指令的功能,如MOV(傳送)、ORL(或邏輯運算)等。操作數(shù):參加操作的數(shù)據(jù)或數(shù)據(jù)所在存儲單元的地址。操作數(shù)允許沒有、1個、2個或3個,按指令的操作功能而設(shè)置。當有多個操作數(shù)時,每個操作數(shù)之間用逗號“,”隔開。若有兩個操作數(shù),則目的操作數(shù)在前,源操作數(shù)在后。操作結(jié)果存放的存儲單元稱為目的操作數(shù),操作數(shù)的來源稱為源操作數(shù)。目的操作數(shù)與助記符之間用空格隔開。注解:用分號“;”開頭,為本條指令的操作功能說明。按照有無操作數(shù)劃分,指令可分成兩大類:無操作數(shù)指令和有操作數(shù)指令。前一類指令由助記符組成;后一類指令由助記符和操作數(shù)組成。常見的指令格式有以下四種:
●助記符
●助記符1個操作數(shù)
●助記符目的操作數(shù),源操作數(shù)
●助記符第1操作數(shù),第2操作數(shù),第3操作數(shù)例如指令MOVA,#2AH,其中“MOV”就是助記符,“A”是目的操作數(shù),“#2AH”是源操作數(shù),該指令表示把立即數(shù)2AH送到累加器A中。2.2尋址方式尋找操作數(shù)或操作數(shù)所在存儲單元地址的方式,簡稱尋址方式。尋址方式越多,指令操作越靈活,操作功能越強。顯然,只有“有操作數(shù)指令”才存在尋址方式問題。操作數(shù)只可能出現(xiàn)在如下幾個地方:
(1)在指令中以立即數(shù)的形式出現(xiàn),立即數(shù)是存放在程序存儲器中的常數(shù),在指令中用“#”引出。
(2)在128BRAM中。
(3)在SFR中。
(4)在片外64KB數(shù)據(jù)RAM中。
(5)在片內(nèi)或片外64KB程序ROM中。
(6)在I/O端口中。由此得到相應(yīng)的單片機尋址方式有三種,分別為:立即尋址、存儲器尋址(含I/O端口尋址)和寄存器尋址。2.2.1立即尋址立即數(shù)出現(xiàn)在指令中的尋址方式,稱為立即尋址。例如,指令MOVA,#2AH的源操作數(shù)尋址方式就是立即尋址,因為源操作數(shù)#2AH是立即數(shù)。2.2.2存儲器尋址
1.直接尋址存儲單元地址以字節(jié)地址形式出現(xiàn)的尋址方式稱為直接尋址。對于片內(nèi)RAM,字節(jié)地址范圍為00H~FFH;對于ROM和片外RAM,字節(jié)地址范圍為0000H~FFFFH。例如,指令MOVA,2AH的源操作數(shù)尋址方式就是直接尋址。
2.寄存器間接尋址操作數(shù)在存儲器中,而存儲單元的地址由寄存器給出的尋址方式,稱為寄存器間接尋址。用于表示存儲單元地址的寄存器稱為間接尋址寄存器,簡稱間址寄存器。間接尋址用@后跟隨間址寄存器名表示,并不是所有的寄存器都能成為間址寄存器,僅僅只有R0、R1、DPTR、A+PC、A+DPTR才有資格成為間址寄存器。在指令中能夠見到的間接尋址形式只有@R0、@R1、@DPTR、@A+PC和@A+DPTR。寄存器間接尋址進一步劃分成兩類:單一寄存器間接尋址和基址加變址尋址,分別適合于數(shù)據(jù)RAM和程序ROM的尋址。
1)單一寄存器間接尋址用@R0、@R1、@DPTR指示操作數(shù)地址的方式就是單一寄存器間接尋址,這種尋址限于操作數(shù)在數(shù)據(jù)RAM中。例如:
MOV@R0,#30HMOV是數(shù)據(jù)RAM的送數(shù)指令,其中目的操作數(shù)所使用的尋址方式就是單一寄存器間接尋址。該指令執(zhí)行的操作就是把立即數(shù)30H送到片內(nèi)數(shù)據(jù)RAM的某一單元,該單元的地址由R0給出。又如:
MOVX@R0,#30HMOVX是數(shù)據(jù)RAM的送數(shù)指令,其中目的操作數(shù)所使用的尋址方式就是單一寄存器間接尋址。該指令執(zhí)行的操作就是把立即數(shù)30H送到片外數(shù)據(jù)RAM的某一單元,該單元的地址由P2R0給出,其中P2給出16位地址的高8位,R0給出16位地址的低8位。
2)基址加變址尋址用@A+PC、@A+DPTR指示操作數(shù)地址的方式就是基址加變址尋址。這種尋址限于操作數(shù)在程序ROM中。操作數(shù)地址有16位,由累加器A的內(nèi)容(8位)加程序計數(shù)器PC或數(shù)據(jù)指針DPTR的內(nèi)容(16位)形成。例如:
MOVCA,@A+PCMOVC是程序ROM的傳送指令,其中源操作數(shù)所使用的尋址方式就是基址加變址尋址方式。該指令執(zhí)行的操作就是先將累加器A的內(nèi)容(8位)與程序計數(shù)器PC(16位)相加,獲得程序ROM的單元地址,再將該單元內(nèi)容送累加器A。假設(shè)指令執(zhí)行前A=06H,PC=2000H,程序ROM2006H單元的內(nèi)容為5CH,指令執(zhí)行后,A=5CH?;芳幼冎穼ぶ穬H適用于程序ROM的3條指令,分別如下:
MOVCA,@A+PC MOVCA,@A+DPTR JMP@A+DPTR前兩條指令是對程序ROM的讀數(shù)指令,源操作數(shù)使用基址加變址尋址;后一條指令是程序無條件轉(zhuǎn)移的跳轉(zhuǎn)指令,其中的目的操作數(shù)使用基址加變址尋址。對于增強型單片機,片內(nèi)數(shù)據(jù)RAM有256B,有128B的RAM地址編號為80H~FFH,與SFR地址編號重合,這時需要用不同的尋址方式將它們區(qū)別開。使用直接尋址訪問80H~FFH的SFR;使用寄存器間接尋址訪問80H~FFH的片內(nèi)RAM。而兩種尋址方式都可以訪問00H~FFH的片內(nèi)RAM。
3.位尋址位操作指令中出現(xiàn)的是存儲單元某一位的地址,這種尋址方式為位尋址。位地址使用8位二進制數(shù)表示,字節(jié)地址范圍為00H~FFH。位尋址中的位地址和直接尋址中的字節(jié)地址,雖然都是8位二進制數(shù)00H~FFH,但它們的內(nèi)容不同:位地址的內(nèi)容只有1位二進制數(shù),字節(jié)地址的內(nèi)容有8位二進制數(shù)。區(qū)別它們的唯一方法是看有無“C”出現(xiàn)。試比較:
MOVA,70H;字節(jié)操作,源操作數(shù)使用直接尋址。
MOVC,70H;位操作,源操作數(shù)使用位尋址。
4.相對尋址存儲單元的目的地址由PC當前值+字節(jié)地址給出,但指令中只出現(xiàn)字節(jié)地址,而不出現(xiàn)PC值,這種尋址方式為相對尋址。該尋址方式適用于無條件或條件轉(zhuǎn)移指令。2.2.3寄存器尋址指令中出現(xiàn)的是21個特殊功能寄存器、R0~R7和CY的名字,稱為寄存器尋址。操作數(shù)就是這些寄存器的內(nèi)容。例如,指令MOVA,#2AH的目的操作數(shù)尋址方式就是寄存器尋址。
【例2-1】設(shè)下列每條指令執(zhí)行前都有A=0CH,(70H)=B8H,R0=30H,(30H)=F1H,PC=3000H,(300CH)=15H,位地址70H的內(nèi)容為1,判斷每條指令源操作數(shù)的尋址方式。
(1)?MOVA,#70H源操作數(shù)為立即尋址,#70為立即數(shù),指令功能為將立即數(shù)70H送入A中,執(zhí)行結(jié)果為A=70H。本條指令的目的操作數(shù)使用寄存器尋址,是21個SFR中的一個出現(xiàn)在指令中。
(2)?MOVA,70H
源操作數(shù)為直接尋址,70H為字節(jié)地址。指令功能是將地址70H單元的內(nèi)容送入A中,執(zhí)行結(jié)果為A=B8H。
(3)?MOVA,@R0
源操作數(shù)為單一寄存器間接尋址。指令功能為(30H)→A,執(zhí)行結(jié)果為A=F1H。
(4)?MOVA,R0
源操作數(shù)為寄存器尋址,指令功能為R0→A,執(zhí)行結(jié)果為A=30H。
(5)?MOVCA,@A+PC
源操作數(shù)為基址加變址尋址,指令功能為(A+PC)→A,執(zhí)行結(jié)果為A=15H。本條指令源操作數(shù)在ROM中。
(6)?MOVC,70H源操作數(shù)為位尋址,這是一條位操作指令,指令中“C”表示進位位CY。執(zhí)行結(jié)果為C=1。
(7)?SJMPA2H本條指令沒有源操作數(shù),無源操作數(shù)的尋址;僅有目的操作數(shù),目的操作數(shù)的尋址方式為相對尋址。轉(zhuǎn)移目的地址=PC當前值+指令中的字節(jié)地址 =本條指令的地址(PC值)+2+指令中的字節(jié)地址 =3000+2+A2H
=30A4H本條指令后,程序?qū)?zhí)行30A4H單元的內(nèi)容。單片機尋址方式歸結(jié)于表2-1中。2.3指令系統(tǒng)
MCS-51系列單片機的指令共有111條,按操作類型劃分共分成5大類:
(1)數(shù)據(jù)傳送類指令共29條,分為片內(nèi)RAM與片外RAM、程序ROM的數(shù)據(jù)傳送、堆棧操作及交換指令。
(2)算術(shù)運算類指令共24條,分為加、帶進位加、減、乘、除、加1、減1、十進制調(diào)整指令。
(3)邏輯運算類指令共24條,分為與、或、異或、移位指令。
(4)位操作指令17條,分為位傳送、位與、位或、位求反、位轉(zhuǎn)移指令。
(5)控制轉(zhuǎn)移指令17條,分為無條件轉(zhuǎn)移、條件轉(zhuǎn)移、調(diào)用指令。按字節(jié)數(shù)劃分,111條指令可分為單字節(jié)指令49條,雙字節(jié)指令45條,三字節(jié)指令17條。按功能劃分,111條指令共實現(xiàn)33種操作功能,使用42個助記符號。按執(zhí)行時間劃分,在111條指令中有64條執(zhí)行時間為12個時鐘周期,45條指令需24個時鐘周期,2條指令(乘、除)需48個時鐘周期。以晶振頻率12MHz作時鐘脈沖計算,三類指令的執(zhí)行時間分別為1μs、2μs和4μs。按照上面的分析,可以得出單片機指令系統(tǒng)有如下三個特點:
(1)指令執(zhí)行速度較快,指令執(zhí)行時間是1~4μs,長于PC機指令的執(zhí)行時間。
(2)指令字節(jié)數(shù)短,僅1~3字節(jié),放入ROM中占存儲單元數(shù)少,而PC機指令字節(jié)長(以8086/8088為例,有1~7字節(jié))。
(3)位指令操作豐富,給微控制帶來極大方便,而PC機無位指令。下面介紹的指令中有一些常用符號,含義如下:
Rn:當前寄存器組的8個通用寄存器R0~R7。
Ri:具有間接尋址功能的寄存器R0、R1。
dir:片內(nèi)256BRAM的字節(jié)地址,取值范圍為00H~FFH,如20H表示地址。
(dir):存儲單元的內(nèi)容,如(20H)=94H,表示地址為20H單元中的內(nèi)容是94H。
#data8:8位立即數(shù)。
#data16:16位立即數(shù)。
@:間接尋址寄存器的引導(dǎo)標志。
dest_lable:目標語句的標號。
addr11:11位地址。
addr16:16位地址。
bit:128BRAM和SFR中的位地址。
rel:8位補碼偏移量,取值范圍為-128~+127(00H~FFH)。
/:取反。
SFR名:SFR中存放的內(nèi)容,如A=60H表示A中存放的內(nèi)容為60H。
dest:目的操作數(shù)。
source:源操作數(shù)。2.3.1數(shù)據(jù)傳送指令
29條數(shù)據(jù)傳送指令需要用到8種不同含義的助記符:MOV、MOVX、MOVC、PUSH、POP、XCH、XCHD、SWAP。每一個助記符實現(xiàn)一種操作功能,一共能完成8種操作功能。按操作類型劃分,共分成5類,如表2-2所示。
1.片內(nèi)數(shù)據(jù)RAM傳送指令格式:MOVdest,source功能:source→dest。執(zhí)行結(jié)果為源操作數(shù)送目的操作數(shù),源操作數(shù)不變。本指令包括8位數(shù)傳送和16位數(shù)傳送兩種類型,指令格式共有16種。
1)?8位數(shù)傳送傳送示意圖如圖2-1所示。目的操作數(shù)和源操作數(shù)允許是片內(nèi)128BRAM任一單元以及SFR,此外,源操作數(shù)還允許是8位立即數(shù)。圖2-18位MOV指令
2)?16位數(shù)傳送傳送示意圖如圖2-2所示。16位數(shù)傳送指令僅一條,即MOVDPTR,#data16。圖2-216位MOV指令
【例2-2】指令“MOVDPTR,#4050H”的操作功能為4050H→DPTR,結(jié)果為DPTR=4050H。它相當于兩條8位數(shù)MOV傳送指令:
MOVDPL,#50H;50H→DPL MOVDPH,#40H;40H→DPH將累加器A為目的操作數(shù)的指令單獨列出,是因為這一類指令執(zhí)行時間短,執(zhí)行速度快。例如:
MOVA,R0的執(zhí)行時間是12個時鐘周期,而用字節(jié)地址表示的指令(A的字節(jié)地址是E0H) MOVE0H,R0執(zhí)行時間卻需要24個時鐘周期。但兩條指令的執(zhí)行結(jié)果完全相同。此外,MOVA,R0是單字節(jié)指令,機器碼只占ROM一個單元;MOVE0H,R0是雙字節(jié)指令,機器碼占ROM兩個單元。因此在選用指令的時候要盡量選用有A的指令。
【例2-3】將立即數(shù)40H送至A,將A的內(nèi)容送至寄存器R3,將R3的內(nèi)容送至50H單元,將50H單元內(nèi)容送至60H單元,相應(yīng)各條指令如下:
MOVA,#40H ;40H→A MOVR3,A ;A→R3 MOV50H,R3 ;R3→(50H) MOV60H,50H ;(50H)→(60H)
【例2-4】設(shè)A=80H,70H單元的內(nèi)容為F0H,記為(70H)=F0H。
MOVA,#70H;立即數(shù)70H→A,指令執(zhí)行結(jié)果A=70H MOVA,70H
;70H單元的內(nèi)容送A,執(zhí)行結(jié)果A=(70H)=F0H
2.片外數(shù)據(jù)RAM與A之間的傳送指令片外數(shù)據(jù)RAM與A之間的傳送指令操作碼、字節(jié)數(shù)、時鐘周期如下:
指令格式 操作碼 字節(jié)數(shù) 時鐘周期
MOVXA,@Ri E2,E3 1 12 MOVXA,@DPTR E0 1 24 MOVX@Ri,A F2,F(xiàn)3 1 24 MOVX@DPTR,A F0 1 24指令助記符MOVX的示意圖如圖2-3所示。圖2-3MOVX指令
1)從片外RAM傳送到A格式:MOVXA,@Ri MOVXA,@DPTR功能:片外64KBRAM中某一存儲單元內(nèi)容送入A。該單元的地址使用兩種方法出現(xiàn)在指令中。第一種使用@Ri尋址,片外64KBRAM的16位地址由P2Ri給出,P2中存放著高8位地址,不出現(xiàn)在指令中,指令格式中僅出現(xiàn)存放低8位地址的Ri(i=0,1);第二種使用@DPTR尋址,DPTR內(nèi)容就是16位地址。
2)從A傳送到片外RAM格式:MOVX@Ri,A MOVX@DPTR,A功能:A內(nèi)容送入片外RAM某一單元,該單元地址在P2Ri或DPTR中。
【例2-5】編程將累加器A中的內(nèi)容輸出到片外數(shù)據(jù)RAM7086H單元。
解:程序一:
MOVP2,#70H MOVR0,#86H ;建立片外數(shù)據(jù)RAM地址指針
MOV@R0,A ;輸出數(shù)據(jù)程序二:
MOVDPTR,#7086H ;建立地址指針
MOV@DPTR,A ;輸出數(shù)據(jù)
3.從程序ROM向A送數(shù)的指令格式:MOVCA,@A+PC ;(A+PC)→A MOVCA,@A+DPTR ;(A+DPTR)→A指令助記符MOVC的示意圖如圖2-4所示。從ROM向A送數(shù)指令的操作碼、字節(jié)數(shù)、時鐘周期如下:
指令格式 操作碼 字節(jié)數(shù) 時鐘周期
MOVCA,@A+DPTR 93 1 24 MOVCA,@A+PC 83 1 24圖2-4MOVC指令
【例2-6】查表求平方程序。
MOVA,#03H ;A=3 MOVCA,@A+PC
;執(zhí)行完本指令PC=RETU,A+PC=3+RETU RETU:RET ;返回指令,一字節(jié)
TABLE:DB01H04H09H10H19H
;DB建立了一個平方表依次存放著12、22、32、42、52執(zhí)行MOVC后,A﹦09H。
4.堆棧操作指令格式:
PUSHdir ;SP+1→SP,(dir)→(SP) POPdir ;(SP)→(dir),SP-1→SP功能:PUSH指令是入棧指令,入棧又稱推入堆棧或進入堆棧。指令操作分為兩步:首先SP自動加1,接著是存儲單元的內(nèi)容進入SP所指的單元,這樣,SP仍然指向棧頂。POP指令是出棧指令,又稱彈出,分兩步完成:SP所指單元內(nèi)容送到存儲單元(該單元地址由dir給出),隨后SP自動減1,依舊指向棧頂。操作特點:單片機堆棧操作為字節(jié)操作,入出棧均為1字節(jié)。單片機初始化后SP=07H,入棧的數(shù)據(jù)從08H單元開始存放,由于08H恰好在工作寄存器區(qū)(00H~1FH)內(nèi),因此在程序中最好用MOV指令重新給SP賦值建立堆棧區(qū),堆棧建立時不宜太深,通常設(shè)置在從20H開始的片內(nèi)RAM中。堆棧操作指令的操作碼、字節(jié)數(shù)、時鐘周期如下: 指令格式 操作碼 字節(jié)數(shù) 時鐘周期
PUSHdir C0dir 2 24 POPdir D0dir 2 24
【例2-7】利用堆棧操作將3AH單元和3BH單元內(nèi)容互換。
解:?MOV SP,#20H ;建立堆棧
PUSH 3AH ;3AH單元內(nèi)容入棧,進入21H單元
PUSH 3BH ;(3BH)→(22H) POP 3AH ;3BH單元內(nèi)容出棧,彈出到3AH單元
POP 3BH ;3AH單元內(nèi)容出棧,彈出到3BH單元
SJMP $ ;程序段結(jié)束
SJMP是相對轉(zhuǎn)移指令,$表示本條指令首地址,SJMP$的功能是循環(huán)執(zhí)行本條轉(zhuǎn)移指令實現(xiàn)動態(tài)停機。MCS-51系列單片機無停機指令,如果不用本條指令停機,單片機將依次執(zhí)行后面的隨機代碼而陷入死機。有關(guān)SJMP指令的詳細說明見2.3.5節(jié)。
5.交換指令交換指令有兩種,一種是8位數(shù)交換,一種是4位數(shù)交換。前一種是A與256BRAM單元內(nèi)容互換;后一種分成兩類:第一類是A與256BRAM單元內(nèi)容低半字節(jié)交換,第二類是A的高低4位交換。格式:
XCH A,Rn ;A←→Rn XCH A,@Ri ;A←→(Ri) XCH A,dir ;A←→(dir) XCHD A,@Ri ;A0~3←→(Ri)0~3 SWAP A, ;A0~3←→A4~7
【例2-8】
編程將60H單元內(nèi)容與70H單元內(nèi)容互換。
解:MOVA,60H ;(60H)→A XCHA,70H ;(A)←→(70H),A中為70H單元內(nèi)容
MOV60H,A ;(70H)→(60H) SJMP$ ;程序段結(jié)束交換指令執(zhí)行示意圖如圖2-5和圖2-6所示。圖2-58位交換指令圖2-64位交換指令交換指令的操作碼、字節(jié)數(shù)、時鐘周期如下:指令格式 操作碼 字節(jié)數(shù) 時鐘周期XCHA,Rn C8~CF 1 12XCHA,@Ri C6,C7 1 12XCHA,dir C5dir 2 12XCHDA,@Ri D6,D7 1 12SWAPA C4 1 122.3.2算術(shù)運算指令算術(shù)運算指令含有8類共24條,使用8種助記符完成8種不同的算術(shù)操作,指令一覽表如表2-3所示,其中加法指令和減法指令有一個共同的特點,就是目的操作數(shù)都是累加器A。
1.?ADD指令
ADD指令有4條,功能是不帶進位位相加,只有兩個加數(shù),相加以后,和放入A中,第3位和第7位的進位分別放在程序狀態(tài)字PSW的AC位和CY位中。當兩個有符號數(shù)相加時,加數(shù)與相加結(jié)果一律為補碼,還會對溢出標志OV產(chǎn)生影響,有溢出時使OV=1,否則OV=0。
【例2-9】設(shè)A=69H,R3=44H,執(zhí)行ADDA,R3。
A01101001
+)?R301000100 010101101→A兩正數(shù)相加得負數(shù),證明產(chǎn)生溢出,所以O(shè)V=1,CY=0,AC=0,A=0ADH。
2.?ADDC指令
ADDC指令有4條,功能是帶進位位加法,有3個加數(shù):目的操作數(shù)、源操作數(shù)和CY位。相加的結(jié)果和放入A中,半進位和進位放入AC和CY標志位中,對溢出位的影響同于ADD指令。
【例2-10】
設(shè)A=69H,R3=44H,CY=1,執(zhí)行ADDCA,R3。
A??01101001 ??R3?01000100
+)CY1
???0?10101110→A執(zhí)行結(jié)果:
A=0AEH,OV=1,CY=0,AC=0。
【例2-11】
編程計算1234H+5678H,和放在30H和31H中。
解:CLR C ;CY清零
MOV A,#34H ADD A,#78H ;低字節(jié)相加
MOV 30H,A ;送低字節(jié)之和
MOV A,#12H ADDCA,#56H ;高字節(jié)帶CY位相加
MOV 31H,A ;送高字節(jié)之和
SJMP $ 執(zhí)行結(jié)果:
1234H+5678H=68ACH,(30H)=ACH,(31H)=68H,
CY=0,OV=0,AC=0
【例2-12】
編程計算R5+R6+CY,結(jié)果放入R7。若程序從ROM2000H單元開始存放,畫出存儲圖。設(shè)時鐘頻率為12MHz,問該程序執(zhí)行完需要多長時間?
解:指令 操作碼 字節(jié)數(shù) 時鐘周期TMOV A,R5
EC
1
12ADDC A,R6
3E
1
12MOV R7,A
FF
1
12占ROM3個單元,存儲圖如圖2-7所示。程序執(zhí)行完需時36T=36×1/12MHz=3μs。圖2-7例2-12用圖
3.?SUBB指令
SUBB指令有4條,功能是帶進位位的減法指令。被減數(shù)是目的操作數(shù)A。有兩個減數(shù),一個是片內(nèi)RAM單元的內(nèi)容,一個是進位標志CY。相減的結(jié)果送入A和CY,其中A中存放差,CY中存放借位位。夠減時借位位為0,不夠減時為1。
【例2-13】
設(shè)A=46H,編程計算A-68H。解:CLRC ;沒有不帶進位位的減法指令,先使CY=0 SUBBA,#68H
SJMP$ 執(zhí)行結(jié)果為A=0DEH,CY=1(被減數(shù)有借位),AC=1(D3向D4有借位),OV=0(無溢出)。若是兩個無符號數(shù)相減,成為146H-68H,結(jié)果正確。若是兩個有符號數(shù)相減,因OV=0,結(jié)果是-34的補碼DEH,也正確。
4.?MUL指令
MUL指令(1條)的功能是A、B寄存器中的內(nèi)容相乘,乘積高8位放入B中,乘積低8位放入A中。指令執(zhí)行結(jié)果將對CY清零,并影響溢出標志位OV以及奇偶標志位P。其中積大于255時OV=1,否則為0;A中二進制數(shù)位“1”的個數(shù)為偶數(shù)時,P=1,否則P為0。
【例2-14】A=A0H,B=50H,執(zhí)行MULAB后,A=00H,B=32H,CY=0,OV=1,P=0。
5.?DIV指令
DIV指令(1條)的功能是A除以B,A中數(shù)據(jù)是被除數(shù),B中數(shù)據(jù)是除數(shù),相除結(jié)果的商數(shù)放入A,余數(shù)放入B。指令執(zhí)行結(jié)果將使CY清零,并影響溢出標志OV及奇偶標志P。當除數(shù)為0時OV=1,除數(shù)不為0時OV=0。A中“1”的個數(shù)為偶數(shù)時,P=1,否則P為0。
【例2-15】
A=13H,B=05H,執(zhí)行DIVAB后,A=03H,B=03H,CY=0,OV=0,P=1。
6.加1指令加1指令有5條,功能是源操作數(shù)內(nèi)容自動加1。例如設(shè)A=03H,執(zhí)行INCA后,A=04H。
7.減1指令減1指令有4條,功能是源操作數(shù)內(nèi)容自動減1。例如設(shè)A=03H,執(zhí)行DECA后,A=02H。加1指令與減1指令中,僅有INCA和DECA執(zhí)行后對奇偶標志P有影響(對P的影響同于乘法指令)。其它指令不影響標志位。
8.?DA指令
DA指令(1條)是十進制調(diào)整指令,它位于ADD指令或ADDC指令之后,將二進制數(shù)相加改變成十進制數(shù)相加。
【例2-16】
寫出下列程序的每條指令執(zhí)行結(jié)果。
MOVA,#48H ;A=48H ADD A,#23H ;48H+23H=6BH,即A=6BH DA?A
;A=48+23=81H,表示結(jié)果為十進制數(shù)81 SJMP??$ ;動態(tài)停機2.3.3邏輯運算指令邏輯運算指令使用9種助記符實現(xiàn)9個不同的邏輯操作,分別是:
ANL(與)、ORL(或)、XRL(異或)、RL(循環(huán)左移)、RR(循環(huán)右移)、RLC(帶CY位循環(huán)左移)、RRC(帶CY位循環(huán)右移)、CPL(求反)、CLR(清零)。邏輯運算指令包括4類24條,分別是:①與運算指令A(yù)NL6條;②或運算指令ORL6條;③異或運算指令XRL6條;④?A專用指令6條,包括將A清零(結(jié)果A=0)、將A求反(結(jié)果→A)和將A循環(huán)移位。其中A的循環(huán)移位指令見圖2-8。圖2-8A的循環(huán)移位指令目的操作數(shù)為A的指令影響奇偶標志P。帶CY位的指令影響進位標志CY。其它的指令不影響PSW各位。指令一覽表見表2-4。
【例2-17】
A=0F2H,R1=30H,(30H)=1AH。執(zhí)行ANLA,@R1后,A=12H;執(zhí)行ANLA,R1后,A=30H;執(zhí)行RLA后,A=E5H;執(zhí)行CPLA后,A=0DH。
【例2-18】
寫出每條都能使A=00H的指令。
MOVA,#00H
ANLA,#00H
XRLA,A
CLRA
【例2-19】
指令SUBBA,A能否使累加器A為0?答:不行,因為CY未知。2.3.4位操作指令位操作指令共有7類17條,使用11種助記符實現(xiàn)11個功能。指令格式如表2-5所示。格式中的C指進位標志CY,在位操作指令中,C起到位累加器的作用。而bit是位存儲器地址,包括片內(nèi)RAM位尋址空間的128位(位地址00H~7FH)和SFR中的可尋址位128位(位地址80H~FFH)。指令格式中的位地址“bit”的書寫形式有如下幾種:
(1)使用直接地址00H~FFH。
(2)使用SFR的第幾位,如PSW.5,P3.0。
(3)使用字節(jié)地址的第幾位,如21H.2指字節(jié)地址21H單元的第2位,該位地址為0AH。
(4)直接用位名稱表示,如RS1、RS0、EA等。
(5)使用BIT偽指令定義,如偽指令VOLBITC3H,含義為將位名(位的名字)VOL定義成C3H,若位名VOL在以后的指令中出現(xiàn),就表示位地址為C3H。偽指令的進一步敘述見2.4節(jié)。
【例2-20】
把位地址20H的內(nèi)容傳送到C。
MOVC,20H
【例2-21】把P1.0狀態(tài)傳送到RS1。
MOVC,P1.0 MOVRS1,C
【例2-22】X、Y、Z均為2位二進制數(shù),且Z=XY,已知X、Y,編程求Z。
解:設(shè)X=X1X0,Y=Y(jié)1Y0,Z=Z1Z0,異或運算為位運算,只需兩位分別進行。程序編制可按照異或運算規(guī)則實現(xiàn):X00=X0,X01=,選用Y0作轉(zhuǎn)移條件。設(shè)X1X0放在21H、20H位存儲器中,Y1Y0放在23H、22H位存儲器中,Z1Z0放在25H、24H位存儲器中。 X0BIT20H ;使用偽指令BIT定義位地址
X1BIT21H Y0BIT22H Y1BIT23H Z0BIT24H Z1BIT25H MOV C,X0 ;X0存入C JNB Y0,X0ZERO ;Y0=0轉(zhuǎn)Z0=X0=C CPL C ;求反,C中為 X0ZERO:MOV Z0,C ;送結(jié)果
MOV C,X1 JNB Y1,X1ZERO CPL C X1ZERO:MOV Z1,C SJMP $
【例2-23】檢測P1.0,若P1.0=0,則將P1.1送入C累加器;若P1.0=1,則從P1.4輸出1。
JNB P1.0,TEXTP11 ;P1.0=0轉(zhuǎn)至TEXTP11 SETB P1.4 ;P1.0=1時從P1.4輸出1
TEXTP11:MOV C,P1.1 ;將P1.1的內(nèi)容送入C2.3.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令包含控制、轉(zhuǎn)移、調(diào)用共3類17條指令,使用13種助記符實現(xiàn)13種功能。其中轉(zhuǎn)移類指令又分為無條件轉(zhuǎn)移和條件轉(zhuǎn)移兩種,調(diào)用類指令分為無條件調(diào)用和返回兩種。指令格式如表2-6所示。
1.?NOP指令本指令為空操作,什么事也不做,用于產(chǎn)生一個機器周期的延時或修改程序時作填充用,便于添加或刪去指令。
2.無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令可分為直接轉(zhuǎn)移和間接轉(zhuǎn)移兩種。直接轉(zhuǎn)移的特征是目標地址或目標語句的標號直接出現(xiàn)在指令格式中。直接轉(zhuǎn)移指令按目標地址與轉(zhuǎn)移指令地址距離的遠近分成3類:近距離轉(zhuǎn)移(SJMP)、短距離轉(zhuǎn)移(AJMP)和長距離轉(zhuǎn)移(LJMP)。用A+DPTR間接指出轉(zhuǎn)移目標屬于間接轉(zhuǎn)移,間接轉(zhuǎn)移指令的助記符僅有JMP一種。
1)?SJMP指令格式:SJMPdest_lable功能:PC首地址+2+rel→PC目標地址,其中箭頭“→”左邊的“PC首地址”是本條指令所占存儲單元的首地址,rel是轉(zhuǎn)移的相對偏移量,大小為1字節(jié)補碼(-128~+127),箭頭右邊的“PC目標地址”是轉(zhuǎn)移后的目標指令所占存儲單元的地址。目標地址限于在本條指令地址值上下-126~+129處,轉(zhuǎn)移范圍如圖2-9所示。人工計算rel的過程稱為人工匯編;由計算機編譯程序計算并填入rel的過程稱為機器匯編。圖2-9SJMP的轉(zhuǎn)移范圍
【例2-24】
計算HERE:SJMPHERE的偏移量rel,寫出機器碼,敘述其功能。
解:按照SJMP指令的功能:
PC首地址+2+rel=PC目標地址所以
rel=PC目標地址-PC首地址-2
=HERE-HERE-2
=-2取補碼,rel=[-2]補=FEH。本條指令機器碼為80FEH。本條指令還可以用SJMP$取代,指令中既用$代表“PC目標地址”,又用$代表“PC首地址”,機器碼仍然為80FEH。這是一條使程序原地踏步的指令,在仿真器上調(diào)試程序時,常用SJMP$結(jié)束程序段。
【例2-25】設(shè)SJMP的首地址為3210H,求機器碼中的rel。①目標地址324DH;②目標地址3206H。
解:①?rel=[324DH-3210H-2]補=3BH②?rel=[3206H-3210H-2]補=[-0CH]補=F4H
2)?AJMP指令格式:AJMPdest_lable功能:PC+2→PC,addr11→PC10~PC0。用a10a9…a1a0表示Addr11的11位二進制數(shù),本條指令執(zhí)行結(jié)果就是這11位二進制數(shù)送入PC的第10位~第0位。指令機器碼是a10a9a800001a7~a0,為2字節(jié)指令。指令特征:①?addr11是目標指令所在存儲單元地址的低11位a10~a0,因此目標地址轉(zhuǎn)移最大范圍為211=2KB,如圖2-10所示。如果轉(zhuǎn)移目標超出了這個范圍,就不能使用AJMP。②?addr11是轉(zhuǎn)移目標的部分地址值,通常不在程序中出現(xiàn),程序中書寫本條指令只需在AJMP后寫上目標語句的標號。圖2-10AJMP的轉(zhuǎn)移范圍
【例2-26】
人工匯編將機器碼填入下列程序的空格內(nèi)。地址(H) 機器碼(H) 程序段①201A — — MOVA,#0AH②201C 80 — SJMPX③201E 66H XRLA,@R0④201F F4H X: CPLA⑤2020 — — AJMPY⑥2032 23H Y: RLA⑦2033 80 — SJMP$第①句查MOV指令,機器碼為74
0AH。第②句rel=201FH-201CH-2=1H,機器碼填入8001H。第⑤句機器碼為a10a9a800001a7~a0,先查找標號為Y的語句,首地址
2032H=0010000000110010B它的a10~a0=00000110010B,所以機器碼是0000000100110010B=0132H,填入01
32H。第⑦句SJMP$的機器碼為80FEH。
3)?LJMP指令格式:LJMPdest_lable功能:PC+3→PC,addr16→PC,本條指令是3字節(jié)指令,機器碼占程序ROM中的3個單元。由于目標地址有16位出現(xiàn)在機器碼中,因此轉(zhuǎn)移范圍為216B=64KB,如圖2-11所示。LJMP指令又叫長距離轉(zhuǎn)移指令。本條指令在程序中出現(xiàn)時,LJMP后面只需寫出轉(zhuǎn)移目標的標號,不必寫出轉(zhuǎn)移目標的地址。圖2-11LJMP指令
4)間接轉(zhuǎn)移指令JMP格式:JMP@A+DPTR功能:A+DPTR→PC
【例2-27】設(shè)DPTR=3000H,在下列情況下執(zhí)行JMP@A+DPTR。①如果A=10H,執(zhí)行后,PC=3010H,程序轉(zhuǎn)移到3010H單元去執(zhí)行。②如果A=20H,執(zhí)行后,PC=3020H,程序轉(zhuǎn)移到3020H單元去執(zhí)行。③如果A=30H,執(zhí)行后,PC=3030H,程序轉(zhuǎn)移到3030H單元去執(zhí)行。
【例2-28】
分析下列程序執(zhí)行過程:
MOV DPTR,#TABLE JMP @A+DPTRTABLE: AJMP TUBLE0 AJMP TUBLE1 AJMP TUBLE2
AJMP TUBLEn當A=00H時,程序轉(zhuǎn)去執(zhí)行TUBLE0;當A=02H時,程序轉(zhuǎn)去執(zhí)行TUBLE1;當A=2nH時,程序轉(zhuǎn)去執(zhí)行TUBLEn這是一個多分支轉(zhuǎn)移程序,執(zhí)行哪一分支由A取值決定。由于AJMP是2字節(jié)指令,因而要求A取偶數(shù)。分支過程如圖2-12所示。圖2-12分支過程用圖
3.條件轉(zhuǎn)移指令
1)累加器A條件轉(zhuǎn)移
●JZ指令格式:JZdest_lable功能:A=0時轉(zhuǎn)至執(zhí)行dest_lable引出的指令,A≠0時執(zhí)行下一條指令。
●JNZ指令格式:JNZdest_lable功能:A≠0時轉(zhuǎn)至執(zhí)行dest_lable引出的指令,A=0時執(zhí)行下一條指令。說明:兩條指令rel的計算方法與SJMP指令相同。
2)?減1非零條件轉(zhuǎn)移(DJNZ)指令格式:DJNZRn,dest_lable功能:Rn-1→Rn,Rn≠0時轉(zhuǎn)至執(zhí)行dest_lable引出的指令;
Rn=0時執(zhí)行下一條指令;
rel計算同于SJMP指令。格式:DJNZdir,dest_lable功能:(dir)-1→(dir),(dir)≠0時轉(zhuǎn)至執(zhí)行dest_lable引出的指令;
(dir)=0時執(zhí)行下一條指令;
rel=PC目標地址-PC源地址-3,本指令為3字節(jié)。
【例2-29】
從P1.0輸出頻率為5Hz的方波,晶振頻率為12MHz。START: CLRP1.0DELAY: MOV20H,#C8H ;(20H)=200LOOP:
MOV21H,#FAH ;(21H)=250 DJNZ21H,$ ;本條指令執(zhí)行時間為2μs DJNZ20H,LOOP ;高低電平各延時100μs CPL?P1.0 AJMPDELAY
【例2-30】編程完成Y=X1+X2+…+Xn,設(shè)n=20,設(shè)Xi(i=1,2,3,…,n)依次存放在片內(nèi)RAM從40H開始的連續(xù)單元中,Y放入50H和51H兩個單元。解:MOV R0,#20 ;數(shù)據(jù)個數(shù)→R0MOV 50H,#00 MOV 51H,#00 MOV R1,#40H ;數(shù)據(jù)區(qū)首址→R1LOOP:?MOV A,50H ADD A,@R1 ;相加MOV 50H,A ;存和的低字節(jié)CLR A ADDC A,51H MOV 51H,A ;存和的高字節(jié)INC R1 ;修改地址指針DJNZ R0,LOOP ;未加完繼續(xù)取數(shù)相加SJMP $
3)比較不相等轉(zhuǎn)移指令比較不相等轉(zhuǎn)移指令有4條,格式和功能如下:比較不相等轉(zhuǎn)移指令的特征如下:①每條指令都有3個操作數(shù),各操作數(shù)均為無符號數(shù)。②指令執(zhí)行過程是:第一操作數(shù)與第二操作數(shù)進行比較,比較結(jié)果決定了程序下一步的走向。如果前兩個操作數(shù)不相等,則轉(zhuǎn)移執(zhí)行由第3操作數(shù)表示的目標語句;如果相等,則按順序執(zhí)行緊隨其后的下一條指令。③第一操作數(shù)與第二操作數(shù)比較后不送結(jié)果,它們各自的內(nèi)容不變。④第3操作數(shù)是轉(zhuǎn)移目標,轉(zhuǎn)移范圍在離源指令256B以內(nèi),計算公式為:rel=PC目標地址-PC源地址-3⑤每條指令均為3字節(jié)指令,在程序ROM中存放時占3個存儲單元。⑥每條指令執(zhí)行后對進位標志產(chǎn)生影響。如果第一操作數(shù)≥第二操作數(shù),無借位,CY=0;如果第一操作數(shù)<第二操作數(shù),有借位,CY=1。
【例2-31】人工匯編計算rel并填入機器碼。第1條指令是2字節(jié)指令,因此第2條指令存放的ROM單元地址是01
02。又CJNE是3字節(jié)指令,P0的字節(jié)地址為80H,rel=0120H-0102H-3=1DH,故機器碼填入B5
80
1D。
【例2-32】利用CJNE指令影響CY位用于判斷兩個無符號數(shù)的大小。大、小數(shù)分別存入GREAT和LESS單元。
4.調(diào)用指令調(diào)用指令全稱是子程序調(diào)用指令,分成無條件調(diào)用和返回指令兩類。按照被調(diào)用子程序與調(diào)用指令之間的距離長短,無條件調(diào)用分成短調(diào)用和長調(diào)用兩種。ACALL指令是短調(diào)用指令,該指令所調(diào)用的子程序入口地址在ACALL指令2KB范圍內(nèi),超出這個范圍無法調(diào)用。LCALL指令是長調(diào)用指令,它可調(diào)用64KB范圍內(nèi)程序ROM中任一個子程序,執(zhí)行后不影響標志位。返回指令有兩條,一條是RET,與ACALL或LCALL指令配合使用,子程序執(zhí)行完畢,必須依靠RET返回主程序,繼續(xù)執(zhí)行調(diào)用指令的下一條指令。返回過程由RET指令實施,因此,RET返回指令的位置必然位于子程序的最后,即子程序的最后一條指令必定是RET。另一條返回指令是RETI,專用于執(zhí)行中斷服務(wù)程序后返回主程序,所以中斷服務(wù)程序的最后一條指令必定是RETI。
1)無條件調(diào)用指令
●ACALL指令格式:ACALLdest_lable ;短調(diào)子程序功能:調(diào)用處斷點被自動推入堆棧,PC+2→PC,addr11→PC10~0,其中addr11是子程序入口地址的低11位a10~a0。本指令的機器碼是a10a9a810001a7~a0,確定方法與AJMP指令相同。本條指令使用時,格式中的addr11不出現(xiàn)在程序中,出現(xiàn)在助記符ACALL后面的是目標語句標號“dest_lable”,它是被調(diào)子程序第一條語句的標號或子程序名。本條指令是2字節(jié)指令,不影響PSW各位。
●LCALL指令格式:LCALLdest_lable ;長調(diào)子程序功能:在64KB程序ROM的全范圍內(nèi)調(diào)用子程序,addr16是子程序入口地址的a15~a0位,不出現(xiàn)在程序中,程序中出現(xiàn)在LCALL后面的目標語句標號“dest_lable”是子程序第一條語句的標號或子程序名。本指令是3字節(jié)指令,操作碼為12addr16。本條指令不影響PSW各位。
2)返回指令格式:RET ;從被調(diào)用子程序返回,機器碼22H?? RETI ;從中斷服務(wù)程序返回,機器碼32H2.4偽指令為匯編程序提供匯編說明的指令叫做偽指令。偽指令無機器代碼,不能被執(zhí)行。一個完整的匯編程序僅有可執(zhí)行指令是不完善的,必須要有偽指令才能使程序完整。匯編過程離不開偽指令提供的信息。匯編程序中用到的偽指令如表2-7所示。這些偽指令中,有7條是常用的,現(xiàn)介紹如下。
1.程序起始地址偽指令格式:ORG16位地址功能:ORG后面的16位地址就是源程序第1條指令的存放地址,位于程序ROM中。
【例2-33】???? ORG0120HSTART:MOVA,#80H
源程序從ROM0120H開始存放,START標號地址就是0120H。
2.程序結(jié)束偽指令格式:END或END標號功能:表示匯編結(jié)束,位于源程序結(jié)尾處。子程序后面的END不用加標號;主程序后面的END需要加標號,該標號只能是ORG后面執(zhí)行指令的標號,即主程序第一條執(zhí)行指令的標號或符號地址。
【例2-34】主程序中END的位置。
ORG0120HSTART:
MOVA,#80HSJMP$;本指令是執(zhí)行指令,用于動態(tài)停機
ENDSTART
;本指令是偽指令,不執(zhí)行,表示匯編到此結(jié)束
3.字節(jié)定義偽指令格式:標號:DB字節(jié)數(shù)據(jù)、字符或表達式功能:在ROM中開辟數(shù)據(jù)存儲區(qū),以字節(jié)為單位依次存放著DB后面的數(shù)據(jù)。這些數(shù)據(jù)如果是字符(必須用單引號括起),將以ASCII碼形式出現(xiàn);如果是表達式,則存放著表達式的值。數(shù)據(jù)區(qū)的起始地址可以用標號代替。
【例2-35】程序如下:偽指令YYY:DB01H,04H,09H,'A'就是從0124H單元開始創(chuàng)建一個數(shù)據(jù)區(qū),依次存放的內(nèi)容是(0124H)=01H,(0125H)=04H,(0126H)=09H,(0127H)=41H,其中41H是字符A的ASCII碼,這個數(shù)據(jù)區(qū)的首址0124H可以使用標號YYY代替。
4.字定義偽指令格式:標號:DW字數(shù)據(jù)、字符或表達式功能:在程序ROM中開辟以字為單位存放的數(shù)據(jù)存儲區(qū),一個字占兩個單元,依次存放。
【例2-36】
偽指令
ABC:DWABCDH,EFH,'AB'要求匯編在程序ROM中從ABC單元開始創(chuàng)建一個數(shù)據(jù)區(qū),以字為單位存放數(shù)據(jù),從ABC單元依次存放ABH、CDH、00H、EFH、41H、42H。
5.存儲區(qū)定義偽指令格式:標號:DS數(shù)值功能:從標號地址開始預(yù)留幾個字節(jié)的存儲單元,供程序備用。DS后面的數(shù)值就是預(yù)留的個數(shù)。該指令中也可以不要標號。
【例2-37】ORG300AH?DS5
;從300AH單元開始,空出5個存儲單元給程序使用
6.符號定義偽指令格式:符號EQU數(shù)值或數(shù)值表達式功能:匯編識別結(jié)果,把數(shù)值或數(shù)值表達式的值賦給符號,在下面的程序中若出現(xiàn)符號,它的大小就是所賦值。
【例2-38】
XEQU30H ;X=30H? MOVA,X ;結(jié)果A=30H
7.位符號定義偽指令格式:符號BIT位地址功能:將位地址賦給符號,該符號只要出現(xiàn)就代表位操作地址。
【例2-39】BINKOUBITP1.0
;將位地址P1.0賦給符號BINKOU CLR??BINKOU ;P1.0清零2.5幾種典型結(jié)構(gòu)的匯編語言程序設(shè)計匯編語言程序的基本結(jié)構(gòu)有3種:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。2.5.1順序結(jié)構(gòu)程序按操作順序依次排列指令的程序為順序結(jié)構(gòu)程序。程序一旦執(zhí)行,就從第一條指令開始依次執(zhí)行到最后一條指令結(jié)束。
【例2-40】查表求Y=X2+1,X為0~9的整數(shù)。
解:設(shè)變量X存放在40H單元中,Y值存放在41H單元中。
【例2-41】將片內(nèi)數(shù)據(jù)RAM21H和20H中的16位數(shù)求反后送回原單元。2.5.2分支結(jié)構(gòu)程序程序在執(zhí)行過程中,要根據(jù)測試條件決定程序的走向,這種程序稱為分支結(jié)構(gòu)程序。當程序從一條支路往下繼續(xù)執(zhí)行時,其它分支支路上的指令不再被執(zhí)行。分支程序中必須要有控制轉(zhuǎn)移類指令,測試結(jié)果不同,程序的走向不同。
【例2-42】編程實現(xiàn):
Y=設(shè)X以補碼形式位于片內(nèi)數(shù)據(jù)RAM20H單元,Y值存放在22H、21H單元。
解:先取出X進行是否為0判斷,如果不是零,再進行符號位正負判斷,每次判斷后按題目要求送結(jié)果。流程圖如圖2-13所示。圖2-13分支程序由此編制的程序如下:
ORG 0100H MOV 22H,#00H
MOV 21H,#00H CLR C MOV A,20H JZ ZERO JB ACC.7,MINUS
;A為負數(shù),轉(zhuǎn)MINUS MOV B,A
MUL AB
;得X2 MOV 22H,B ;送結(jié)果X2→Y MOV 21H,A SJMP $ ZERO:MOV 22H,#00H
MOV 21H,#FFH ;送結(jié)果FFH→Y
SJMP $ MINUS: ADD A,#01H
MOV 22H.0,C MOV 21H,A
SJMP $ END 多路分支程序的特點是根據(jù)不同輸入條件或運算結(jié)果,轉(zhuǎn)去執(zhí)行不同的處理程序。多路分支程序通常使用間接轉(zhuǎn)移指令JMP@A+DPTR實現(xiàn)。具體操作可以通過查轉(zhuǎn)移地址表或查轉(zhuǎn)移指令表完成。使用轉(zhuǎn)移地址表時,應(yīng)事先將轉(zhuǎn)移地址排成表格駐進存儲器,表格的內(nèi)容依次作為轉(zhuǎn)移目標的地址。使用轉(zhuǎn)移指令表時,同樣需事先將不同程序的轉(zhuǎn)移指令列成表格,查表時查到哪個程序的轉(zhuǎn)移指令,就執(zhí)行哪個程序。
【例2-43】
查轉(zhuǎn)移地址表的程序。設(shè)需要轉(zhuǎn)移的目標程序入口地址有n個,編號為DEST0~DESTn-1,每個地址占ROM兩個單元,依次排放在從TAB開始的單元中?,F(xiàn)在要根據(jù)片內(nèi)RAM20H單元的內(nèi)容決定轉(zhuǎn)入哪一個目標程序,由此編制的程序如下:
MOV A,20H
;取數(shù)
ADD A,A
;A+A→A MOV DPTR,#TAB ;置地址指針
MOVCA,@A+DPTR ;取某一地址高字節(jié)
MOV 21H,A
;高字節(jié)暫存 MOV A,20H
ADD A,A INC DPTR MOVCA,@A+DPTR ;取低字節(jié)
MOV DPH,B MOV DPL,A
;DPTR是TAB中地址
MOV A,#0
;清零
JMP @A+DPTR
;間接轉(zhuǎn)移
SJMP $
TAB:DW DEST0,DEST1,…DESTn-1 END
【例2-44】查轉(zhuǎn)移指令表的程序。設(shè)i=0,1。設(shè)單片機系統(tǒng)16個鍵對應(yīng)的鍵值00H~0FH存放在工作寄存器R0中,16個鍵的處理程序入口地址分別為PR0~PR15。在程序ROM中建立一張轉(zhuǎn)移指令表,每條無條件轉(zhuǎn)移指令占3個存儲單元,如果用LJMPPRi,機器碼將是02PRiHPRiL,如圖2-14所示。圖2-14轉(zhuǎn)移指令由此編制的程序如下:
ORG 0100H ;取鍵值
MOV A,R0 ;每條LJMP指令占3個單元
ADD A,R0 ADD A,R0 ;A×3→A MOV DPTR,#TAB ;置地址指針
JMP @A+DPTR ;散轉(zhuǎn)TAB:LJMP PR0 LJMP PR1
LJMP PR15 SJMP $ END 2.5.3循環(huán)結(jié)構(gòu)程序有一部分指令需要重復(fù)執(zhí)行的程序,稱為循環(huán)程序。循環(huán)程序的優(yōu)點是程序簡練,且占用較少的程序存儲空間,設(shè)計程序的時間大為縮短,但程序執(zhí)行的時間不會減少。設(shè)計循環(huán)程序的主要工作是確定循環(huán)體(重復(fù)執(zhí)行的那部分指令)和設(shè)置循環(huán)條件。分析一個循環(huán)程序,一般由4個部分組成:
(1)初始化部分,這是為循環(huán)所做的準備,如設(shè)置循環(huán)次數(shù),設(shè)置地址指針等。
(2)循環(huán)體部分,這是為了解決題目要求而設(shè)計的重復(fù)執(zhí)行指令。
(3)控制循環(huán)修改部分,這是為了下一次執(zhí)行循環(huán)體所做的準備,例如循環(huán)次數(shù)減1,地址指針加1等。
(4)循環(huán)判斷部分,用于判斷是進行循環(huán)還是退出循環(huán)。循環(huán)程序在安排上既可以先循環(huán)后判斷,也可以先判斷后循環(huán)。循環(huán)結(jié)構(gòu)允許嵌套,在多重循環(huán)中大循環(huán)內(nèi)套小循環(huán),但內(nèi)、外循環(huán)不允許交叉,也不允許從外循環(huán)跳入內(nèi)循環(huán)中。進入循環(huán)體只能從循環(huán)體的第一條指令進入,離開循環(huán)體既可以從循環(huán)體的最后一條指令退出,也可以從循環(huán)體中間跳出,顯然只需在循環(huán)體內(nèi)設(shè)置一條條件轉(zhuǎn)移指令便可跳出。
【例2-45】
延時程序。延時與晶振頻率和循環(huán)次數(shù)有關(guān),設(shè)單片機晶振頻率為12MHz,一個機器周期為1μs。
(1)使用單循環(huán)延時1ms程序。循環(huán)體延時計算后兩條指令延時4μs,循環(huán)250次,再加上第1條指令延時1μs,總共延時1.001ms。
(2)使用多循環(huán)延時200ms程序。
MOV R1,#200 ;循環(huán)200次DELAY200:MOV R0,#FAH ;R0=250為循環(huán)次數(shù)DELAY250:MOV R7,70H ;延時2μs DJNZ R0,DELAY250 DJNZ R1,DELAY200
;延時1ms的程序重復(fù)200次由于R1最大值為255,因此要想延時超過255ms,需增加循環(huán)次數(shù)。
【例2-46】排序程序。設(shè)片內(nèi)RAM20H單元開始放有50個無符號字節(jié)數(shù),要求將其按從小到大的順序重新排列,排好后依舊放入這些單元中。排序需要兩重循環(huán)。內(nèi)循環(huán)負責(zé)尋找最小值,兩個兩個比較,每次比較都保留小的數(shù),比完后就可以得到最小的數(shù)。第二次將余下的數(shù)再次兩兩比較,重復(fù)進行,直至剩下最后兩個數(shù)比較完即排好。由此確定的程序如下:
ORG 0100HSTART:
C CLR 20H
CLR R3,#50
MOV R0,#20H
MOV A,@R0LOOP2: MOV R1,A
MOV R0
INC A,@R0
SUBB A,R1
MOV GOON
JC 20H
SETB A,@R0
XCH R0
DEC A,@R0
XCH R0GOON: INC A,@R0 MOV R3,LOOP2 DJNZ 20H,START JB $ SJMP END 2.5.4子程序能夠獨立完成一段功能的小程序,稱為子程序,例如完成兩個字節(jié)相加、數(shù)制轉(zhuǎn)換、求補碼等等。子程序編好以后,存放在ROM的某個地方,當主程序需要時,就可以調(diào)用它。有了子程序,能夠使主程序更為簡練、明朗。子程序在設(shè)計時,除了一般程序設(shè)計的要求外,還有結(jié)合自身的一些注意事項。子程序中必然要用到寄存器和存儲單元,如果這些寄存器或存儲單元在主程序中已經(jīng)在使用,那么在調(diào)用子程序之前,必須首先把它們存放的內(nèi)容推入堆棧中保護起來。入棧操作通常在子程序一開始進行,因此,子程序一開始多為入棧指令。當子程序執(zhí)行完畢返回主程序時,理應(yīng)要把入棧的內(nèi)容彈出到相應(yīng)的寄存器或存儲單元中,才不致于影響主程序的執(zhí)行。出??梢栽诜祷刂鞒绦蚯斑M行。子程序從主程序接收到的已知條件稱為子程序的入口參數(shù)。子程序的運算結(jié)果稱為出口參數(shù)。在調(diào)用子程序之前,主程序必須把入口參數(shù)設(shè)置恰當,滿足子程序的要求。子程序也要把出口參數(shù)設(shè)置恰當,才能讓主程序享用。入、出口參數(shù)在主、子程序之間傳遞時,要采取雙方均認可并都能接受的方式。實現(xiàn)參數(shù)傳遞有多種方法,常用的有用累加器、用工作寄存器、用堆棧等幾種傳遞參數(shù)方法,各種不同的傳遞參數(shù)方法有各自不同的優(yōu)點。子程序也可以調(diào)用子程序,形成嵌套和遞歸。
【例2-47】
用累加器傳遞參數(shù)。把十六進制數(shù)的ASCII碼字符轉(zhuǎn)換成十六進制數(shù)。 ;對主程序要求:調(diào)用前將被轉(zhuǎn)換字符送入A,調(diào)用后直接從A中取結(jié)果 ;調(diào)用子程序標號:ASCIICHANG
;入口參數(shù):要轉(zhuǎn)換的ASCII碼字符位于A中 ;出口參數(shù):轉(zhuǎn)換結(jié)果放在A中
【例2-48】用工作寄存器傳遞參數(shù)。兩個64位無符號數(shù)相加。設(shè)兩數(shù)分別放在20H和30H開始的單元中,各占8個字節(jié),相加的和放在從40H開始的單元中。;對主程序的要求:調(diào)用前將工作寄存器的內(nèi)容入?;驎捍嬗诩拇嫫骰虼鎯卧?。調(diào)用后直接從工作寄存器獲取子程序結(jié)果;調(diào)用子程序標號:TWOADD;入口參數(shù):將兩數(shù)的首地址分別送入R0和R1,R0=20H,R1=30H。將字節(jié)長度送入R2,R2=08H;出口參數(shù):R0、R1中是相加的和TWOADD:LOOP:ORGMOVMOVMOVCLRINCINCMOVADDCMOVDJNZMOVRET012
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗
- 2024幼兒園保育員幼兒教育理念與實踐合同3篇
- 二零二五年房地產(chǎn)項目海外分銷代理協(xié)議3篇
- 二零二五版國際貿(mào)易人才招聘與培訓(xùn)合同2篇
- 2025年教育設(shè)施智能化改造與裝修服務(wù)合同范本3篇
- 2025年度環(huán)保設(shè)施運營管理合同范本及效益評估3篇
- 專業(yè)車輛運送協(xié)議模板(2024定制版)版B版
- 2024虛擬股投資退出機制合同范本3篇
- 二零二五年度駕校經(jīng)營管理權(quán)定制化服務(wù)協(xié)議2篇
- 二零二五年度文化產(chǎn)業(yè)發(fā)展前景調(diào)研合同3篇
- 24年追覓在線測評28題及答案
- TGDNAS 043-2024 成人靜脈中等長度導(dǎo)管置管技術(shù)
- 《陸上風(fēng)電場工程概算定額》NBT 31010-2019
- GB/T 29490-2013企業(yè)知識產(chǎn)權(quán)管理規(guī)范
- GB/T 14436-1993工業(yè)產(chǎn)品保證文件總則
- 湖南省鄉(xiāng)鎮(zhèn)衛(wèi)生院街道社區(qū)衛(wèi)生服務(wù)中心地址醫(yī)療機構(gòu)名單目錄
- 《中外資產(chǎn)評估準則》課件第6章 英國評估準則
- FZ∕T 63006-2019 松緊帶
- 罐區(qū)自動化系統(tǒng)總體方案(31頁)ppt課件
- BIQS評分表模板
- 工程建設(shè)項目內(nèi)外關(guān)系協(xié)調(diào)措施
評論
0/150
提交評論