第2章MCS-51單片機指令系統(tǒng)及匯編語言程序設(shè)計基礎(chǔ)_第1頁
第2章MCS-51單片機指令系統(tǒng)及匯編語言程序設(shè)計基礎(chǔ)_第2頁
第2章MCS-51單片機指令系統(tǒng)及匯編語言程序設(shè)計基礎(chǔ)_第3頁
第2章MCS-51單片機指令系統(tǒng)及匯編語言程序設(shè)計基礎(chǔ)_第4頁
第2章MCS-51單片機指令系統(tǒng)及匯編語言程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩96頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第2章章 MCS-51單片機指令系統(tǒng)及匯編語單片機指令系統(tǒng)及匯編語言程序設(shè)計基礎(chǔ)言程序設(shè)計基礎(chǔ)2.1 MCS-51單片機指令格式單片機指令格式2.2 MCS-51單片機尋址方式單片機尋址方式2.3 MCS-51單片機指令單片機指令2.4 匯編語言程序設(shè)計基礎(chǔ)匯編語言程序設(shè)計基礎(chǔ)2.1 MCS-51單片機指令格式單片機指令格式2.1.1 指令格式指令格式2.1.2 指令的字節(jié)數(shù)指令的字節(jié)數(shù)2.1.3 指令分類指令分類2.1.1 指令格式指令格式指令格式是指指令碼的結(jié)構(gòu)形式,通常,指令可以分為操作碼和操作數(shù)兩部分,其中,操作碼部分比較簡單,而操作數(shù)部分就比較復(fù)雜了,一般來說,根據(jù)計算機類型的不同

2、而具有較大的差異。MCS-51系統(tǒng)單片機的指令系統(tǒng)采用了地址壓縮技術(shù),將操作數(shù)字段的四個地址壓縮到一個地址中,故稱為單地址指令,其具體的指令格式為: 操作碼操作碼 操作數(shù)或操作數(shù)地址操作數(shù)或操作數(shù)地址2.1.2 指令的字節(jié)數(shù)指令的字節(jié)數(shù)在指令的二進制形式中,指令不同,指令的操作碼和操作數(shù)也不相同,MCS-51機器語言指令根據(jù)其指令編碼長短的不同有單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令三種格式。1、單字節(jié)指令(49條)2、雙字節(jié)指令(45條)3、三字節(jié)指令(17條)1、單字節(jié)指令(49條)單字節(jié)指令碼只有一個字節(jié),由八位二進制數(shù)組成,這類指令共有49條,其操作碼中包含了操作數(shù)的信息。單字節(jié)指令碼可以

3、分為兩種形式,一類是無操作數(shù)單字節(jié)指令,另一類是含有操作數(shù)寄存器編號的單字節(jié)指令。(1)無操作數(shù)單字節(jié)指令這類指令的指令碼的8位全表示操作碼,沒有專門指示操作數(shù)的字段,操作數(shù)是隱含在操作碼中的。例如,空操作指令NOP,其機器碼為: 0 0 0 0 0 0 0 0(2)含有操作數(shù)寄存器編號的單字節(jié)指令這類指令的指令碼的8位編碼中既包含操作碼字段,也包含專門用來指示操作數(shù)所在寄存器編號的字段。例如:8位數(shù)傳送指令:MOV A,Rn;ARn這條指令的功能是把寄存器Rn(n=0,1,2,3,4,5,6,7)中的內(nèi)容送到累加器A中去。其機器碼為: 1 1 1 0 1 Rn操作碼 寄存器編號 2、雙字節(jié)指

4、令(45條) 雙字節(jié)指令含有兩個字節(jié),可以分別存放在兩個存儲單元中,操作碼字節(jié)在前,操作數(shù)字節(jié)在后,其中,操作數(shù)字節(jié)可以是立即數(shù)(指令碼中的數(shù)),也可以是操作數(shù)所在的片內(nèi)RAM地址。例如:MOV A,#DATA;Adata這條指令的功能是將立即數(shù)DATA送到累加器A中去。假設(shè)立即數(shù)DATA=85H,則其機器碼為:0 1 1 1 0 1 0 01 0 0 0 0 1 0 1 第一字節(jié) 操作碼第二字節(jié) 操作數(shù)(立即數(shù)85H) 3、三字節(jié)指令(17條)這類指令的指令碼的第一個字節(jié)為操作碼,第二和第三個字節(jié)為操作數(shù)或操作數(shù)地址。例如:MOV direct,#data這條指令是將立即數(shù)data送到地址為

5、direct的單元中去。假設(shè)direct=78H,data=80H,則MOV 78H,#80H指令的機器碼為: 0 1 1 1 0 1 0 10 1 1 1 1 0 0 01 0 0 0 0 0 0 0 第一字節(jié) 操作碼第二字節(jié) 第一操作數(shù)(目的地址)第三字節(jié) 第二操作數(shù)(立即數(shù)) 用二進制編碼表示的機器語言指令由于不便閱讀理解和記憶,因此在微機控制系統(tǒng)中采用匯編語言(用助記符和專門的語言規(guī)則表示指令的功能和特征)指令來編寫程序。一條匯編語言指令中最多包含四個區(qū)段,如下所示: 標號:標號: 操作碼助記符操作碼助記符 目的操作數(shù)目的操作數(shù),源操作數(shù),源操作數(shù) ;注釋;注釋例如,把立即數(shù)F0H送累

6、加器的指令為: START : MOV A,#0F0H ; 立即數(shù)F0HAMCS-51指令系統(tǒng)有42種助記符代表了33種操作功能,這是因為有的功能可以有幾種助記符(例如數(shù)據(jù)傳送的助記符有MOV,MOVC,MOVX)。指令功能助記符與操作數(shù)各種可能的尋址方式相結(jié)合,共構(gòu)成111條指令。2.1.3 指令分類指令分類1、根據(jù)指令在程序存儲器中所占的字節(jié)數(shù),指令系統(tǒng)分為:(1)單字節(jié)指令(49條)(2)雙字節(jié)指令(45條)(3)三字節(jié)指令(17條)2、根據(jù)指令執(zhí)行的時間,指令系統(tǒng)分為:(1)1個機器周期(12個時鐘振蕩器周期)指令(64條)(2)2個機器周期指令(45條)(24個時鐘振蕩器周期)(3)

7、乘、除兩條指令為4個機器周期指令(48個時鐘振蕩周期) 3、根據(jù)指令的功能,指令系統(tǒng)分為:(1)數(shù)據(jù)傳送類(29條)(2)算術(shù)運算類(24條)(3)邏輯操作類(24條)(4)控制轉(zhuǎn)移類(17條)(5)位操作類(17條)符符 號號說說 明明Rn表示當(dāng)前工作寄存器區(qū)中的工作寄存器,n取07,表示R0R7direct8位內(nèi)部數(shù)據(jù)存儲單元地址。它可以是一個內(nèi)部數(shù)據(jù)RAM單元(0127)或特殊功能寄存器地址或地址符號Ri通過寄存器R1或R0間接尋址的8位內(nèi)部數(shù)據(jù)RAM單元(0255),i=0,1#data指令中的8位立即數(shù)#data16指令中的16位立即數(shù)addR1616位目標地址。用于LCALL和LJ

8、MP指令,可指向64K字節(jié)程序存儲器地址空間的任何地方addR1111位目標地址。用于ACALL和AJMP指令,轉(zhuǎn)至當(dāng)前PC所在的同一個2K字節(jié)程序存儲器地址空間內(nèi)rel補碼形式的8位偏移量。用于相對轉(zhuǎn)移和所有條件轉(zhuǎn)移指令中。偏移量相對于當(dāng)前PC計算,在-128+127范圍內(nèi)取值DPTR數(shù)據(jù)指針,用作16位的地址寄存器A累加器表2-1 MCS-51指令系統(tǒng)符號說明 bitB特殊功能寄存器,專用于乘(MUL)和除(DIV)指令中C進位標志或進位位bit內(nèi)部數(shù)據(jù)RAM或部分特殊功能寄存器里的可尋址位的位地址表示對該位操作數(shù)取反(X)X中的內(nèi)容(X)表示以X單元的內(nèi)容為地址的存儲器單元內(nèi)容,即(X)

9、作地址,該地址單元的內(nèi)容用(X)表示間址寄存器的前綴標志肩頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所取代符號符號說說 明明續(xù)表2.2 MCS-51單片機尋址方式單片機尋址方式2.2.1 立即尋址立即尋址2.2.2 直接尋址直接尋址2.2.3 寄存器尋址寄存器尋址2.2.4 寄存器間接尋址寄存器間接尋址2.2.5 變址尋址變址尋址2.2.6 相對尋址相對尋址2.2.7 位尋址位尋址2.2.1 立即尋址立即尋址立即尋址方式的操作數(shù)包含在指令字節(jié)中,指令操作碼后面字節(jié)的內(nèi)容就是操作數(shù)本身,采用立即尋址方式的指令一般為雙字節(jié)指令,第一個字節(jié)為操作碼,第二個字節(jié)為立即操作數(shù),立即操作數(shù)的前面冠以#符號作前綴,就表示

10、該數(shù)為立即尋址。例如: 助 記 符 注釋 MOV A,#70H ;A 70H注意:注意:在MCS-51匯編語言指令中,#data表示8位立即數(shù),#data16表示16位立即數(shù),立即數(shù)前面必須有符號“#”,上述兩例寫成一般格式為:MOV A, #dataMOV DPTR,#data16在指令中含有操作數(shù)的直接地址,該地址指出了參與操作的數(shù)據(jù)所在的字節(jié)地址或位地址。直接尋址方式中操作數(shù)存儲的空間有三種:(1)片內(nèi)數(shù)據(jù)存儲器的低128個字節(jié)單元(00H7FH)例如: MOV A,70H ;A(70H)(2)位地址空間例如: MOV C,00H ;進位位直接位00H內(nèi)容(3)特殊功能寄存器(特殊功能寄

11、存器只能用直接尋址方式進行訪問)例如:MOV IE,#85H ;中斷允許寄存器IE立即數(shù)85H2.2.2 直接尋址直接尋址2.2.3 寄存器尋址寄存器尋址寄存器尋址是對通用寄存器中的內(nèi)容作為操作數(shù)進行的尋址方式,通用寄存器包括A、B、DPTR以及R0R7。寄存器尋址按所選定的工作寄存器R0R7進行操作,指令機器碼的低3位的八種組合000,001,110,111分別指明所用的工作寄存器R0,R1,R6,R7。如:MOV A,Rn(n=07),這8條指令對應(yīng)的機器碼分別為E8HEFH。例如: INC R0 ; R0(R0)1CLR A ;(A) #00HINC DPTR ;(DPTR) (DPTR

12、)+1ADD A,20H ;(A)(A)+(20H)2.2.4 寄存器間接尋址寄存器間接尋址是以寄存器中的內(nèi)容為地址,再以該地址單元中的內(nèi)容為操作數(shù)的尋址方式。注意,在寄存器間接尋址方式中,存放在寄存器中的內(nèi)容不是操作數(shù),而是操作數(shù)所在的存儲器單元地址,寄存器起地址指針的作用,寄存器間接尋址用符號“”表示。寄存器間接尋址只能使用寄存器R0或R1作為地址指針,來尋址內(nèi)部RAM(00HFFH)中的數(shù)據(jù)。(1)寄存器間接尋址也適用于訪問外部RAM,此時可使用R0,R1或DPTR作為地址指針。例如:MOV A,R0 ;A (R0)(2)如果訪問外部數(shù)據(jù)存儲器時,只需要將MOV改為MOVX就可以了。例如

13、:MOVX DPTR,A;(DPTR)(A)2.2.5 變址尋址變址尋址這種尋址方式用于訪問程序存儲器中的數(shù)據(jù)表格,它把基址寄存器(DPTR或PC)和變址寄存器A的內(nèi)容作為無符號數(shù)相加形成16位的地址,訪問程序存儲器中的數(shù)據(jù)表格。例如:MOVC A,ADPTR ;A (DPTR)()MOVC A,APC ;A (PC)() 應(yīng)說明兩點:應(yīng)說明兩點:(1)變址尋址指令的變址尋址區(qū)是程序存儲器ROM,而不是數(shù)據(jù)存儲器RAM,因此變址尋址只有讀操作,而沒有寫操作。(2)變址尋址是單字節(jié)兩周期指令,CPU執(zhí)行這條指令前應(yīng)預(yù)先在DPTR和累加器A中為該指令的執(zhí)行準備條件。 2.2.6 相對尋址相對尋址以

14、當(dāng)前PC的內(nèi)容作為基地址,加上指令中給定的偏移量(rel)所得結(jié)果作為轉(zhuǎn)移地址,即對形成新的PC值進行的尋址方式,它只適用于雙字節(jié)轉(zhuǎn)移指令。偏移量是帶符號數(shù),在-128+127范圍內(nèi),用補碼表示。例如:JC rel ;C=1跳轉(zhuǎn) 相對尋址用于修改PC值,主要用于實現(xiàn)程序的相對轉(zhuǎn)移,相對轉(zhuǎn)移指令執(zhí)行時,是以當(dāng)前PC值加上指令中所規(guī)定的偏移量(rel)而形成實際的目標轉(zhuǎn)移地址,這里所說的當(dāng)前PC值是指完成相對轉(zhuǎn)移指令取指令后的PC值。一般地,稱相對轉(zhuǎn)移指令操作碼所在的首地址為源地址,稱轉(zhuǎn)移后的地址為目標地址。則有:目標地址目標地址 = 源地址源地址 + 相對轉(zhuǎn)移指令的字節(jié)數(shù)相對轉(zhuǎn)移指令的字節(jié)數(shù) +

15、 rel例如:SJMP 08H ;(PC)(PC)+2+08H2.2.7 位尋址位尋址是對片內(nèi)RAM的尋址區(qū)(20H2FH)和特殊功能寄存器的93個位進行位操作時尋址方式。在進行位操作時,需要借助進位C作為操作累加器,操作數(shù)直接給出該位的地址,然后根據(jù)操作碼的性質(zhì)對其進行位操作。位尋址的位地址和直接尋址的字節(jié)地址形式完全一樣,主要由操作碼來區(qū)分。例如:MOV 20H, C;將位地址為20H的數(shù)據(jù)送給進位標志C中MOV A,70H ;A(70H)表2-2 操作數(shù)尋址方式及其尋址空間尋址方式尋址方式利用的變量利用的變量尋址空間尋址空間立即尋址程序存儲器ROM直接尋址內(nèi)部RAM的低128位特殊功能寄

16、存器內(nèi)部RAM中的20H2FH的128位特殊功能寄存器中可尋址的位寄存器尋址R0R7;A;B;Cy;DPTRR0R7A,B,C,AB(雙字節(jié)),DPTR(雙字節(jié))寄存器間接尋址R0;R1內(nèi)部RAM(R0,R1,SP(僅PUSH、POP)內(nèi)部數(shù)據(jù)存儲單元的低4位(R0,R1)R0;R1;DPTR外部RAM或I/O口(R0,R1,DPTR)變址尋址DPTR+A;PC+A程序存儲器ROM(A+PC,A+DPTR)相對尋址PC+rel程序存儲器ROM位尋址內(nèi)部RAM中的20H2FH的128位特殊功能寄存器中可尋址的位地址空間2.3 MCS-51單片機指令單片機指令2.3.1 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指

17、令 2.3.2 算術(shù)運算類指令算術(shù)運算類指令2.3.3 邏輯運算及移位指令邏輯運算及移位指令2.3.4 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令2.3.5 位操作類指令位操作類指令2.3.6 偽指令偽指令2.3.1 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令是把源操作數(shù)傳送到指令所指定的目標地址,指令執(zhí)行后,源操作數(shù)不變,目的操作數(shù)被源操作數(shù)所代替。數(shù)據(jù)傳送是最基本、最重要、使用最頻繁的一種指令,其性能對整個程序的執(zhí)行效率起很大的作用。數(shù)據(jù)傳送指令共有29條,主要是用于單片機片內(nèi)RAM和特殊功能寄存器SFR之間數(shù)據(jù)的傳遞,也可以用于單片機片內(nèi)和片外存儲單元之間傳送數(shù)據(jù)。 數(shù)據(jù)傳送指令一般不影響標志位,只有堆

18、棧操作可以直接修改程序狀態(tài)字PSW,另外,對目的操作數(shù)為A的指令將影響奇偶標志P位。 數(shù)據(jù)傳送類指令用到的助記符有:MOV,MOVX,MOVC,XCH,XCHD,SWAP,PUSH,POP。源操作數(shù)可以采用寄存器尋址、寄存器間接尋址、直接尋址、立即尋址和變址尋址5種尋址方式,目的操作數(shù)可以采用寄存器尋址、寄存器間接尋址和直接尋址3種尋址方式。 1、內(nèi)部數(shù)據(jù)傳送指令這類指令的源操作數(shù)和目的操作數(shù)地址都在單片機內(nèi)部,可以是片內(nèi)RAM的地址,也可以是特殊功能寄存器SFR的地址,其指令格式為:MOV ,指令功能是將源字節(jié)送到目的字節(jié)單元,源字節(jié)單元中的源字節(jié)不變。按照尋址方式,內(nèi)部數(shù)據(jù)傳送指令又可以分

19、為立即型、直接型、寄存器型和寄存器間址型四類。(1)立即尋址型傳送指令這類指令的特點是源操作數(shù)是8位的立即數(shù),處在指令碼的第二字節(jié)或第三字節(jié)位置,目的地址不同,可以講8位的立即數(shù)直接傳送到片內(nèi)RAM的各單元中,共有4條:MOV A, #data;AdataMOV Rn, #data;RndataMOV Ri, #data;(;(Ri)dataMOV direct,#data;directdata(2)直接尋址型傳送指令直接傳送型指令的特點是指令碼中至少含有一個操作數(shù)的直接地址,直接地址處在指令的第二字節(jié)或第三字節(jié)位置上,共有5條:MOV A,direct ;A(direct)MOV direc

20、t, A;directAMOV Rn,direct ;Rn(direct)MOV Ri,direct ;(;(Ri)(direct)MOV direct2,direct1;direct2(direct1)這類指令的功能是將上述逗號右側(cè)所規(guī)定的源操作數(shù)傳送到逗號左側(cè)的目的存儲單元智能光,目的存儲單元可以有累加器A,工作寄存器Rn和片內(nèi)RAM。(3)寄存器尋址型傳送指令采用工作寄存器Rn作為尋址寄存器的數(shù)據(jù)傳送指令有3條:MOV A,Rn;ARnMOV Rn,A;RnAMOV direct, Rn;directRn1)第一條指令和第二條指令屬于同一種類型,用于累加器A和工作寄存器Rn之間的數(shù)據(jù)傳送

21、;2)第三條指令用于將工作寄存器Rn中的內(nèi)容傳送到以direct為地址的RAM單元中。(4)寄存器間址型傳送指令寄存器間址型傳送指令的特點是Ri中存放的不是操作數(shù)本身,而是操作數(shù)所在存儲單元的地址。共有3條:MOV A,Ri;A(Ri)MOV Rn,A;(Ri) AMOV direct,Ri;direct(Ri)1)第一條指令的功能是將Ri中地址所指操作數(shù)傳送到累加器A中;第二條指令的功能是將累加器A中操作數(shù)傳送到以Ri中內(nèi)容為地址的存儲單元;2)第三條指令的功能是將以Ri中內(nèi)容為地址的源操作數(shù)傳送到direct存儲單元中。 2、外部數(shù)據(jù)傳送指令(1)16位數(shù)據(jù)傳送MCS-51的指令系統(tǒng)中,只

22、有唯一1條16位數(shù)據(jù)傳送指令。MOV DPTR,#data16 ;DPTRdata16該指令的功能是將指令碼中16位立即數(shù)傳送到DPTR中,其高8位送入DPH中;低8位送入DPL中,這個16位立即數(shù)實際上是外部RAM/ROM地址,是專門配合外部數(shù)據(jù)傳送指令用的。(2)外部ROM的字節(jié)傳送指令這類指令共有2條,均屬于變址尋址指令,因?qū)iT用于查表,因此又成為查表指令。指令格式為:MOVC A,A+DPTR;A(A+DPTR)MOVC A,A+PC;PCPC+1,A(A+PC)(3)外部RAM的字節(jié)傳送指令這類指令可以實現(xiàn)外部RAM和累加器A之間的數(shù)據(jù)傳送,其指令格式為:MOVX A,Ri;A(Ri

23、)MOVX Ri, A;(Ri) AMOVX A,DPTR;A(DPTR)MOVX DPTR,A;(DPTR) A3、堆棧操作指令堆棧操作指令是一種特殊的數(shù)據(jù)傳送指令,其特點是根據(jù)堆棧指針SP中棧頂?shù)刂愤M行數(shù)據(jù)傳送操作,共有2條:PUSHdirect;SPSP+1,(SP) (direct)POPdirect;direct(SP),SPSP-11)第一條指令為壓棧指令,用于將direct為地址的操作數(shù)傳送到堆棧中。指令在執(zhí)行時分為兩步,第一步先將堆棧指針SP中的棧頂?shù)刂芳?,使之指向堆棧的新的棧頂單元;第二步將direct中操作數(shù)壓入由SP指示的棧頂單元。2)第二條指令為彈出指令,其功能是將堆

24、棧中操作數(shù)傳送到direct單元。指令執(zhí)行時也分為兩步,第一步是將由堆棧指針SP所指棧頂單元中操作數(shù)彈出到direct單元中;第二步是使SP中的原棧頂?shù)刂窚p1,使之指向新的棧頂?shù)刂贰?4、數(shù)據(jù)交換指令數(shù)據(jù)交換指令共有4條,其格式為:XCHA,Rn;ARnXCHA,direct ;A (dirent)XCHA,Ri;A (Ri)XCHD A,Ri;A30 (Ri)301)前3條指令字節(jié)交換指令,其功能是將累加器A中內(nèi)容和片內(nèi)RAM單元內(nèi)容相互交換;2)而第4條指令是半字節(jié)交換指令,用于將累加器A中低4位和Ri為間接地址單元的低4位相互交換,而各自的高4位保持不變。 2.3.2 算術(shù)運算類指令算術(shù)

25、運算類指令算術(shù)運算指令共有24條,用于對兩個操作數(shù)進行加、減、乘、除算術(shù)運算。兩個操作數(shù)中,一個應(yīng)放于累加器A中,另一個可以放在某個寄存器或片內(nèi)RAM單元中,也可以放在指令碼的第二個和第三個字節(jié)中。指令執(zhí)行后,運算結(jié)果可以保留再累加器A中;運算中產(chǎn)生的進位標志、奇偶標志和溢出標志等皆可以保留在PSW中。 1、加法指令加法指令共有13條,分為不帶Cy加法ADD、帶Cy加法ADDC和加1指令I(lǐng)NC三類。(1)不帶Cy加法指令這組指令有如下4條:ADDA,Rn;AA+RnADDA,direct ;AA+(direct)ADDA,Ri;AA+(Ri)ADDA,#data ;AA+data(2)帶Cy加

26、法指令帶Cy加法指令有4條,主要用于多字節(jié)加法運算中。ADDC A,Rn;AA+Rn+CyADDC A,direct;AA+(direct)+CyADDC A,Ri;AA+(Ri)+CyADDC A,#data;AA+data+Cy注意:注意:這組指令可以使指令中規(guī)定的源操作數(shù)、累加器A中操作數(shù)和Cy中值相加,并將操作結(jié)果保留在累加器A中,這里Cy中的值指的是指令執(zhí)行前的Cy值,而不是指令指令后得到的Cy值。PSW中其他各標志位狀態(tài)變化和不帶Cy加法指令相同。 1)前4條指令是8位數(shù)加1指令,用于將源地址所規(guī)定的RAM單元中內(nèi)容加1;2)第5條指令的功能是對DPTR中內(nèi)容加1,是MCS-51中

27、唯一1條16位算術(shù)運算指令。注意:注意:在執(zhí)行加1指令時,應(yīng)按照帶符號數(shù)相加運算,但與加法指令不同的是,上述只有第1條指令能對奇偶標志位P產(chǎn)生影響,其余指令在執(zhí)行時均不會對任何標志位產(chǎn)生影響。 (3)加1指令加1指令又稱為增量指令,共有5條:INCA;AA+1INCRn;RnRn+1INCdirect;direct(direct)+1INCRi;(Ri) (Ri)+1INCDPTR;DPTRDPTR+12、減法指令MCS-51的指令系統(tǒng)提供了8條減法指令,分為帶Cy減法指令和減1指令兩類。(1)帶Cy減法指令帶Cy減法指令共有4條:SUBA,Rn;AA-Rn-CySUBA,direct ;AA

28、-(direct)-CySUBA,Ri;AA-(Ri)-CySUBA,#data ;AA-data-Cy(2)減1指令減1指令又稱為減量指令,減1指令共有4條:DECA;AA-1DECRn;RnRn-1DECdirect ;direct(direct)-1DECRi;(Ri) (Ri)-1 注意:注意:這組指令可以使指令中源地址所指的RAM單元中的內(nèi)容減1,和加1指令類似,除了第1條減1指令對奇偶校驗標志位P有影響外,其余減1指令并不影響PSW標志位狀態(tài), 3、十進制調(diào)整指令十進制調(diào)整指令是一條專用指令,用于對累加器A中的BCD碼加法結(jié)果進行調(diào)整運算,BCD碼進行二進制數(shù)相加運算后,必須經(jīng)過此

29、條指令調(diào)整,才能得到正確的結(jié)果,指令的格式為:DA A;若;若AC=1或或A309,則,則AA+06H;若;若Cy=1或或A749,則,則AA+60H4、乘法和除法指令乘法和除法指令均為單字節(jié)4周期指令,相當(dāng)于執(zhí)行4條加法指令的時間。指令格式為:MULAB;BA(A)(B),產(chǎn)生標志,產(chǎn)生標志DIVAB;(;(A)/(B)=(A)余(余(B)2.3.3 邏輯運算及移位指令邏輯運算及移位指令邏輯操作指令共有24條,包括邏輯操作和環(huán)移兩類。(1)邏輯操作指令用于對兩個8位操作數(shù)進行邏輯乘、邏輯加、邏輯取反和邏輯異或等操作,常用來對數(shù)據(jù)進行邏輯處理,使之適合于傳送、存儲和輸出打印等操作。大多數(shù)指令需

30、要將兩個操作數(shù)中的一個預(yù)先放入累加器A中,操作結(jié)果也存放在累加器A中。這類指令中,除了以累加器A為目標寄存器指令外,其余指令均不會對PSW中各個標志位產(chǎn)生影響;(2)環(huán)移指令可以對累加器A中的操作數(shù)進行環(huán)移,環(huán)移指令又分為左環(huán)移和右環(huán)移,帶進位位Cy環(huán)移和不帶進位位Cy 環(huán)移。 1、邏輯運算指令(1)邏輯與運算指令邏輯與運算指令又稱為邏輯乘運算指令,共有6條:ANLA,Rn;AARnANLA,direct ;AA(direct)ANLA,Ri;AA(Ri)ANLA,#data ;AAdataANLdirect,A;direct(direct)AANLdirect,#data ;direct(d

31、irect)data(2)邏輯或運算指令OLRA,Rn;AARnOLRA,direct ;AA(direct)OLRA,Ri;AA(Ri)OLRA,#data ;AAdataOLRdirect,A;direct(direct)AOLRdirect,#data ;direct(direct)data(3)邏輯異或運算指令XRLA,Rn;AA RnXRLA,direct ;AA (direct)XRLA,Ri;AA (Ri)XRLA,#data ;AA dataXRLdirect,A;direct(direct) AXRLdirect,#data ;direct(direct) data(4)累加

32、器清零和取反指令CLRA;A0CPLA;AA2、移位指令MCS-51指令系統(tǒng)提供了5條對累加器中的數(shù)據(jù)進行移位操作的指令。(1)左環(huán)移指令RLA這條指令的功能是將累加器中的數(shù)據(jù)向左環(huán)移位,7位循環(huán)移入0位,并不影響各個標志位狀態(tài)。 70累加器A(2)帶進位左環(huán)移指令RLCA這條指令的功能是將累加器A中的數(shù)據(jù)和進位標志Cy一起向左環(huán)移1位,A7移入進位標志位Cy,而Cy移入A0中,不影響其他標志位狀態(tài)。 7 0累加器ACy(3)右環(huán)移指令RR A這條指令的功能是將累加器中的數(shù)據(jù)右環(huán)移位,該指令操作不影響各個標志位狀態(tài)。 70累加器A(4)帶進位右環(huán)移指令RRCA這條指令的功能是累加器中的數(shù)據(jù)和進

33、位標志位Cy一起向右環(huán)移1位,A0移入進位標志位Cy,而Cy移入A7,該指令操作不影響其他標志位狀態(tài)。7 0累加器ACy(5)累加器A半字節(jié)交換指令SWAP A這條指令的功能是將累加器A的高半字節(jié)(A7A4)和低半字節(jié)(A3A0)互換。累加器AA7A4A3A02.3.4 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令控制轉(zhuǎn)移指令共有17條,用于改變程序執(zhí)行的流向,執(zhí)行后都以改變程序計數(shù)器PC中的值為目標??刂妻D(zhuǎn)移指令分為條件轉(zhuǎn)移指令、無條件轉(zhuǎn)移指令、子程序調(diào)用和返回指令、空操作指令四類。 1、無條件轉(zhuǎn)移指令(1)短跳轉(zhuǎn)指令(-128+127范圍內(nèi)轉(zhuǎn)移指令)SJMPrel;PCPC+2,PCPC+rel(2)長跳

34、轉(zhuǎn)指令(64KB范圍內(nèi)轉(zhuǎn)移指令)LJMPaddr16;PCaddr16該指令為3字節(jié)2周期指令。該指令提供16位地址,目標地址由指令第2字節(jié)(高8位地址)和第3字節(jié)(低8位地址)組成,因此,程序轉(zhuǎn)向的目標地址可以包含程序存儲器的整個64KB空間。執(zhí)行這條指令時把指令的第2和第3字節(jié)分別裝入PC的高位和低位字節(jié)中,無條件地轉(zhuǎn)向指定地址。轉(zhuǎn)移的目標地址可以在64K程序存儲器地址空間的任何地方,不影響任何標志。(3)絕對轉(zhuǎn)移指令(2KB范圍內(nèi)轉(zhuǎn)移指令)AJMPaddr11;PCPC+2,PC10PC0addr11這是2K字節(jié)范圍內(nèi)的無條件轉(zhuǎn)跳指令,把程序的執(zhí)行轉(zhuǎn)移到指定的地址。該指令在運行時先將PC

35、+2,然后通過把指令中的A10A0(PC100)得到跳轉(zhuǎn)目的地址送入PC。目標地址必須與AJMP后面一條指令的第一個字節(jié)在同一個2K區(qū)域的存儲器區(qū)內(nèi)(即高5位地址必須相同)。絕對轉(zhuǎn)移指令執(zhí)行時分為兩步:第一步是取指令操作,程序計數(shù)器PC中內(nèi)容被加1了兩次;第二步是將PC加1兩次后的高5位地址PC1511和指令碼低11位地址構(gòu)成目標轉(zhuǎn)移地址。 (4)變址尋址轉(zhuǎn)移指令JMPA+DPTR;PCA+DPTR該指令又稱為散轉(zhuǎn)指令,其功能是把累加器中8位無符號數(shù)與數(shù)據(jù)指針DPTR中的16位數(shù)相加,將結(jié)果作為下條指令地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR中的內(nèi)容,也不影響標志,利用這條指令能實現(xiàn)程序

36、的散轉(zhuǎn)。 使用以上調(diào)用與轉(zhuǎn)移指令應(yīng)注意的問題:使用以上調(diào)用與轉(zhuǎn)移指令應(yīng)注意的問題:1) 以上指令均為無條件,執(zhí)行該類指令時程序計數(shù)器PC一定轉(zhuǎn)向非順序單元執(zhí)行。2)調(diào)用與返回指令常成對使用,返回指令RET應(yīng)出現(xiàn)在每一個子程序的末尾。3)調(diào)用與返回指令都要有棧操作,使用該類指令前要建立堆棧,以便保護斷點。4)轉(zhuǎn)移指令與調(diào)用子程序指令的異同:相同之處是它們都是改變PC值,使程序轉(zhuǎn)入非順序單元執(zhí)行;不同之處是調(diào)用與返回指令在子程序執(zhí)行結(jié)束后一定返回,原斷點地址,因此一定有棧操作,轉(zhuǎn)移指令轉(zhuǎn)走后不一定回到原斷點,因此不必堆棧保存斷點地址。2、條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是在執(zhí)行程序過程中需要判斷是否滿足某

37、種特定條件而決定轉(zhuǎn)移與否的指令。當(dāng)條件滿足時轉(zhuǎn)移(相當(dāng)于一條相對轉(zhuǎn)移指令),條件不滿足時則順序執(zhí)行下面的指令。當(dāng)條件滿足時,先把PC加到指向下一條指令的第一個字節(jié)地址,再把有符號的相對偏移量加到PC上,計算出轉(zhuǎn)向地址。條件轉(zhuǎn)移指令共有8條,分為零條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和減非零條件轉(zhuǎn)移指令三類。 (1)零條件轉(zhuǎn)移指令這組指令執(zhí)行時均需要判斷累加器中內(nèi)容是否為零作為條件轉(zhuǎn)移條件,共有條:JZrel ;若;若A=0,則,則PCPC+2+rel;若;若,則,則PCPC+2JNZ rel ;若;若A0,則,則PCPC+2+rel;若;若=,則,則PCPC+2零條件轉(zhuǎn)移指令在執(zhí)行時應(yīng)注意如下兩個問題:

38、零條件轉(zhuǎn)移指令在執(zhí)行時應(yīng)注意如下兩個問題:1)第1條指令的功能是累加器中的內(nèi)容為零,A=0,就執(zhí)行轉(zhuǎn)移,否則就不轉(zhuǎn)移;第2條指令正好跟第1條指令功能相反,若累加器中的內(nèi)容不為零,A0,就執(zhí)行轉(zhuǎn)移,否則就繼續(xù)執(zhí)行原程序。2) 這2條指令都是雙字節(jié)相對轉(zhuǎn)移指令,rel為相對地址偏移量。Rel在程序中常用標號代替,翻譯成機器碼時才換算成8位相對地址,換算方法和轉(zhuǎn)移地址范圍和無條件轉(zhuǎn)移指令中的段條件轉(zhuǎn)移指令相同。(2)比較轉(zhuǎn)移指令CJNEA,direct,rel;若;若A=(direct),則),則PCPC+3; ;若;若A(direct),則),則PCPC+3+rel,形成,形成Cy標志。標志。CJ

39、NEA,#data,rel;若;若A=data,則,則PCPC+3; ;若;若Adata,則,則PCPC+3+rel,形成,形成Cy標志。標志。CJNERn,#data,rel;若;若Rn=data,則,則PCPC+3;若;若Rndata,則,則PCPC+3+rel,形成,形成Cy標志。標志。CJNERi,#data,rel;若;若(Ri)=data,則,則PCPC+3; ;若;若(Ri)data,則,則PCPC+3+rel,形成,形成Cy標志。標志。(3)減1非零條件轉(zhuǎn)移指令減1非零條件轉(zhuǎn)移指令有2條:DJNZRn,rel;若;若Rn-10,則,則PCPC+2+rel; 若若Rn-1=0,則

40、,則PCPC+2DJNZdirect,rel;若(;若(direct)-10,則,則PCPC+3+rel; 若(若(direct)-1=0,則,則PCPC+33、子程序調(diào)用和返回指令 在程序設(shè)計中,有時因操作要求,需要反復(fù)執(zhí)行某段程序,使這段程序能被公用,為了減少編寫和調(diào)試程序的工作量,以及減少程序在內(nèi)存儲器中所占有的存儲空間,常常把具有一定功能的公用程序段編制成子程序,供主程序在需要時調(diào)用。當(dāng)主程序轉(zhuǎn)至子程序時用調(diào)用指令,而在子程序的最后安排一條返回指令,使執(zhí)行完子程序后再返回到主程序。為保證正確返回,每次調(diào)用子程序時自動將下條指令地址保存到堆棧,返回時按先進后出原則再把地址彈出到PC中。

41、調(diào)用和返回指令是成對使用的,調(diào)用指令必須具有將程序計數(shù)器PC中斷點地址保護到堆棧以及將子程序入口地址自動送入程序計數(shù)器PC的功能;返回指令則必須具有能將堆棧中的斷點地址自動恢復(fù)到程序計數(shù)器PC的功能。 主程序和子程序是相對的,同一個子程序即可以作為另一個程序的子程序,也可以有自己的子程序,這種程序稱為子程序的嵌套。圖2-1(a)為一個兩級嵌套的子程序調(diào)用示意圖,圖2-1(b)為兩級子程序調(diào)用后堆棧中斷點地址的存放情況。(a)二級子程序嵌套示意圖(b)轉(zhuǎn)入子程序2時的堆棧示意圖2-1 二級子程序嵌套以及斷點地址存放示意圖(1)子程序調(diào)用指令子程序調(diào)用指令有兩個功能,一個是將斷點地址壓入堆棧保護,

42、斷點地址下一條指令地址的地址取決于調(diào)用指令的字節(jié)數(shù),可以是(PC)+2或(PC)+3,這里的(PC)是調(diào)用指令第1字節(jié)所在的地址;第二個功能是將所調(diào)用子程序的入口地址送到程序計數(shù)器PC中。子程序調(diào)用指令有2條:ACALL addr11;(;(PC)(PC)+2 (SP)(SP)+1,(,(SP)(PC7PC0) (SP)(SP)+1,(,(SP)(PC15PC8) (PC10PC0)A10A0 (PC15PC11)不變)不變LCALL addr16;(;(PC)(PC)+3 (SP)(SP)+1,(,(SP)(PC7PC0) (SP)(SP)+1,(,(SP)(PC15PC8) (PC)add

43、r150(2)返回指令RET;PC15PC8(SP),SPSP-1 ;PC7PC0(SP),SPSP-1RETI;PC15PC8(SP),SPSP-1 ;PC7PC0(SP),SPSP-1(3)空操作指令 NOP ;PCPC+1 這條空操作指令是一條單字節(jié)單周期控制指令。程序執(zhí)行該指令僅使程序計數(shù)器PC加1,而不進行其他任何操作,共消耗12個時鐘周期時間,因此,這條指令常用于延時程序中。2.3.5 位操作類指令位操作類指令位操作指令又成為布爾變量操作指令,共有17條。包括位傳送、位變量修改、位運算和位控制轉(zhuǎn)移指令四類,其中,位傳送、位置位和位運算指令的操作數(shù)是以字節(jié)中某位為單位進行操作的,而不

44、是以字節(jié)為單位進行操作;位控制轉(zhuǎn)移指令是以檢測字節(jié)中的某一位的狀態(tài)為條件進行轉(zhuǎn)移的,而不是以整個字節(jié)為條件進行轉(zhuǎn)移。位操作指令的操作對象是片內(nèi)RAM的位尋址區(qū)(即20H2FH)和SFR中的11個可以位尋址的寄存器。 1、位傳送指令MOV C, bit;Cy(bit) MOV bit,C;bitCy2、位變量修改指令CLR C;Cy0CLR bit;bit0CPL C;CyCPL bit ;bit SETB C;Cy1SETB bit;bit1Cybit3、位運算指令這組指令共分為與、或兩種邏輯運算,共有4條:ANLC,bit;CyCy(bit)ANLC,/bit;CyCy( )ORLC,bit

45、;CyCy(bit)ORLC,/bit;CyCy( )bitbit4、位控制轉(zhuǎn)移指令位控制轉(zhuǎn)移指令共有5條,分為Cy內(nèi)容為條件的轉(zhuǎn)移指令和位地址中內(nèi)容為條件的轉(zhuǎn)移指令兩種。(1)Cy中內(nèi)容為條件的轉(zhuǎn)移指令JC rel;若;若Cy=1,則,則PCPC+2+rel;若;若Cy=0,則,則PCPC+2JNC rel;若;若Cy=0,則,則PCPC+2+rel ;若;若Cy=1,則,則PCPC+2(2)位地址中內(nèi)容為條件的轉(zhuǎn)移指令JBbit,rel;若(;若(bit)=1,則,則PCPC+3+rel;若(;若(bit)=0,則,則PCPC+3JNB bit,rel ;若(;若(bit)=0,則,則PC

46、PC+3+rel ;若(;若(bit)=1,則,則PCPC+3JBC bit,rel ;若(;若(bit)=1,則,則PCPC+3+rel,且,且bit0 ;若(;若(bit)=0,則,則PCPC+32.3.6 偽指令偽指令把匯編語言源程序通過匯編程序翻譯成機器語言程序(稱為目標程序),計算機才能執(zhí)行,這個翻譯過程稱為匯編。匯編程序?qū)τ脜R編語言寫的源程序進行匯編時,還要提供一些匯編用的控制指令,例如要指定程序或數(shù)據(jù)存放的起始地址;要給一些連續(xù)存放的數(shù)據(jù)確定單元等等。但是,這些指令在匯編時并不產(chǎn)生目標代碼,不影響程序的執(zhí)行,所以稱為偽指令。常用的有下列幾種偽指令: 1、ORG定位偽指令ORG偽指

47、令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始。它指明此語句后面的程序或數(shù)據(jù)塊的起始地址。其一般格式為:ORGnn (絕對地址或標號)(絕對地址或標號)2、DB定義字節(jié)偽指令一般格式:標號:標號:DB字節(jié)常數(shù)或字符或表達式字節(jié)常數(shù)或字符或表達式其中:標號區(qū)段可有可無,字節(jié)常數(shù)或字符是指一個字節(jié)數(shù)據(jù),或用逗號分開的字節(jié)串,或用引號括起來的ASCII碼字符串。此偽指令的功能是把字節(jié)常數(shù)或字節(jié)串存入內(nèi)存連續(xù)單元中。 3、DW定義偽指令一般格式:標號碼:標號碼:DW字或字串字或字串DW偽指令的功能與DB相似,其區(qū)別在于DB是定義一個字節(jié)能,而DW是定義一個字(規(guī)定為兩個字節(jié),即16位二進制數(shù)),故DW主要用來定

48、義地址。存放時一個字需兩個單元。4、EQU賦值偽指令一般格式:標號:標號:EQU操作數(shù)操作數(shù)EQU偽指令的功能是將操作數(shù)賦值于標號,使兩邊的兩個量等值。 5、DS定義存儲空間偽指令一般格式:DS表達式表達式在匯編時,從指定地址開始保留DS之后“表達式”的值所規(guī)定的存儲單元。6、BIT定義位地址符號偽指令一般格式:字符名稱字符名稱 BIT位地址位地址這里的“字符名稱”與標號不同(其后沒有“:”),但是必須的,其功能是將BIT之后的“位地址”賦值給“字符名稱”。7、END匯編結(jié)束偽指令一般格式:標號:標號:END地址或標號地址或標號其中標號以及操作數(shù)字段的地址或標號不是必要的。2.4 匯編語言程序

49、設(shè)計基礎(chǔ)匯編語言程序設(shè)計基礎(chǔ)2.4.1 匯編語言程序的基本結(jié)構(gòu)匯編語言程序的基本結(jié)構(gòu)2.4.2 匯編語言程序的格式匯編語言程序的格式2.4.3 順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計2.4.4 分支程序設(shè)計分支程序設(shè)計2.4.5 循環(huán)程序設(shè)計循環(huán)程序設(shè)計2.4.6 查表程序設(shè)計查表程序設(shè)計2.4.7 子程序設(shè)計子程序設(shè)計2.4.1 匯編語言程序的基本結(jié)構(gòu)匯編語言程序的基本結(jié)構(gòu)匯編語言程序的基本結(jié)構(gòu)形式有順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)等。1、順序結(jié)構(gòu)順序程序是最簡單的程序結(jié)構(gòu),也稱為直線程序。這種程序中既無分支、循環(huán),也不調(diào)用子程序,程序按順序逐一執(zhí)行指令。2、分支結(jié)構(gòu)分支程序是通過條件轉(zhuǎn)移

50、指令實現(xiàn)的,即根據(jù)條件對程序餓執(zhí)行進行判斷,若滿足條件,則進行程序轉(zhuǎn)移;若不滿足條件,就順序執(zhí)行程序。3、循環(huán)結(jié)構(gòu)循環(huán)程序是最常見的程序組織方式,在程序運行時,有時需要連續(xù)重復(fù)執(zhí)行某段程序,這時可以使用循環(huán)程序。這種設(shè)計方法可大大簡化程序。 循環(huán)程序的結(jié)構(gòu)一般包括如下幾個部分:(1)置循環(huán)初值)置循環(huán)初值(2)循環(huán)體)循環(huán)體(3)修改控制變量)修改控制變量(4)循環(huán)控制部分)循環(huán)控制部分2.4.2 匯編語言程序的格式匯編語言程序的格式匯編語言分為3個部分,即標號、操作碼、操作數(shù)。每個部分之間要用分隔符隔開,分隔符可以采用空格、冒號、分號,具體格式如下:標號:操作碼標號:操作碼 操作數(shù)操作數(shù);注

51、釋;注釋必須嚴格語句格式編寫程序,對于任意匯編語句來說,只有操作碼是必不可少的。 (1)標號)標號標號位于語句的最前面,由18個字母和數(shù)字組成,它代表該語句的地址。標號必須由字母打頭,以冒號結(jié)尾,不能使用指令助記符、偽指令或寄存器名。標號不是語句的必要組成部分,在需要時才使用。1)正確的標號使用方法,如B3、DA、AD、DELY、LOOP、START等;2)錯誤的標號使用方法,如4A、A+B、END、ADD、EQU等。 (2)操作碼)操作碼操作碼是指令的助記符,表示語句的性質(zhì),不可以省略,它是語句的核心部分。(3)操作數(shù))操作數(shù)操作數(shù)與操作碼之間用空格分開。操作數(shù)一般有目的操作數(shù)和源操作數(shù),操

52、作數(shù)之間用逗號分開。操作數(shù)可以是立即數(shù),也可以是地址,但必須滿足尋址方式的規(guī)定。 (4)注釋)注釋注釋是用戶為方便閱讀程序而附加的說明,一個好的程序員應(yīng)養(yǎng)成良好的添加注釋的習(xí)慣。注釋與操作數(shù)之間用分號隔開。 2.4.3 順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序是一種最簡單、最基本的程序,又稱為簡單程序,是按照邏輯操作順序,從某一條指令開始依次順序執(zhí)行。順序結(jié)構(gòu)程序中沒有分支、循環(huán)或子程序,可以完成一定的功能,它是構(gòu)成復(fù)雜程序的基礎(chǔ)。 【例2-10】無符號多字節(jié)加法設(shè)被加數(shù)存放在片內(nèi)RAM的10H(低位字節(jié))、11H(高位字節(jié)),加數(shù)存放在12H(低位字節(jié))、13H(高位字節(jié)),運算結(jié)果存放

53、在10H(低位字節(jié))、11H(高位字節(jié))中。參考程序如下:參考程序如下:START:PUSHACC;將累加器中的內(nèi)容壓入堆棧保護 MOVR0,#10H;將10H地址送入R0 MOVR1,#12H;將12H地址值送入R1 MOVA, R0;被加數(shù)低字節(jié)內(nèi)容送入A中 ADDA, R1;低字節(jié)數(shù)相加MOVR0,A;低字節(jié)數(shù)相加操作結(jié)果存入10H單元中INCR0;指向被加數(shù)高位字節(jié)INCR1;指向加數(shù)高位字節(jié)MOVA, R0;被加數(shù)高位字節(jié)送入累加器中ADDC A, R1;高位字節(jié)數(shù)帶進位相加MOV R0,A;高位字節(jié)數(shù)相加操作結(jié)果存入11H單元中CLRA;累加器中進位標志Cy清零ADDC A, #0

54、0H;MOV20H,A;進位數(shù)暫存入20H單元中POPACC;恢復(fù)累加器A原來內(nèi)容【例【例2-11】將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)】將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù) 設(shè):內(nèi)部RAM40H,41H單元中分別存放著8位二進制數(shù)。要求取出兩個單元中的低半字節(jié)、合并成一個字節(jié)后,存42H單元。參考程序如下:參考程序如下: ORG 0000HSTART: MOVR1,#40H MOV A,R1 ANLA,#0FH;取第一個半字節(jié) SWAP A INCR1 XCHA,R1;取第二字節(jié) ANLA,#0FH;取第二個半字節(jié) ORLA,R1;拼字 INCR1 MOV R1,A;存放結(jié)果 RET END 分支結(jié)

55、構(gòu)程序是根據(jù)某種條件判斷結(jié)果,決定程序的流向。分支程序的特點是程序執(zhí)行流程中包含條件判斷,符合條件要求和不符合條件要求的有不同的處理路徑。 分支結(jié)構(gòu)程序一般分為簡單分支程序和散轉(zhuǎn)程序兩類。 2.4.4 分支程序設(shè)計分支程序設(shè)計1、簡單分支程序簡單分支程序有3種形式,如圖2-2所示。圖2-2 簡單分支程序流程圖 【例【例2-12】兩個無符號數(shù)比較大小】兩個無符號數(shù)比較大小設(shè)兩個連續(xù)外部RAM單元ST1和ST2中存放不帶符號的二進制數(shù),找出其中的大數(shù)存入ST3單元中。參考程序如下:參考程序如下:ORG8000HST1EQU8040H START1:CLRC; 進位位清零 MOVDPTR,#ST1;

56、 設(shè)數(shù)據(jù)指針 MOVX A, DPTR; 取第一數(shù) MOV R2, A; 暫存R2 INC DPTRMOVX A,DTPR; 取第二個數(shù) SUBB A,R2 ; 兩數(shù)比較 JNC BIG1 XCHA,R2; 第一數(shù)大BIG0:INCDPTR MOVX DPTR,A ;存大數(shù) SJMP $BIG1:MOVX A,DPTR ;第二數(shù)大 SJMP BIG0 END 【例【例2-13】求單字節(jié)有符號二進制數(shù)的補碼?!壳髥巫止?jié)有符號二進制數(shù)的補碼。正數(shù)補碼是其本身,負數(shù)的補碼是其反碼加1。因此,程序首先判斷被轉(zhuǎn)換數(shù)的符號,負數(shù)進行轉(zhuǎn)換,正數(shù)即為補碼。設(shè)二進制數(shù)放在累加器A中,其補碼放回到A中。 參考程序

57、:參考程序: ORG 0000H CMPT:MOVA,30H;單字節(jié)二進制數(shù)送入30H單元中JNBACC.7,NCH;(A)0,不需轉(zhuǎn)換 MOVC,ACC.7;保存符號MOV10H,CCPLA ADDA,#1 MOVACC.7,C;恢復(fù)符號 NCH: RET END2、散轉(zhuǎn)程序 散轉(zhuǎn)程序?qū)儆诜种С绦虻囊环N并行多分支程序,它根據(jù)某種輸入或運算結(jié)果,分別轉(zhuǎn)向各個處理程序。散轉(zhuǎn)程序常使用散轉(zhuǎn)指令JMP A+DPTR實現(xiàn)程序的跳轉(zhuǎn)操作,其中,DPTR常存放散轉(zhuǎn)地址表的首地址,累加器存放轉(zhuǎn)移地址序號。該指令將累加器A中的8位無符號內(nèi)容與16位數(shù)據(jù)指針的內(nèi)容相加后裝入程序計數(shù)器PC中,實現(xiàn)程序的轉(zhuǎn)移。累加

58、器中的內(nèi)容不同,散轉(zhuǎn)的入口地址也不同。散轉(zhuǎn)程序的基本結(jié)構(gòu)如圖2-3所示。 圖2-3 散轉(zhuǎn)程序的基本結(jié)構(gòu)流程 2.4.5 循環(huán)程序設(shè)計循環(huán)程序設(shè)計循環(huán)程序的特點是程序中含有可以重復(fù)執(zhí)行的程序段,該程序段稱為循環(huán)體,當(dāng)滿足某種條件時,能重復(fù)執(zhí)行某一段程序。采用循環(huán)程序時,可以減少指令和節(jié)省存儲單元,可能使程序結(jié)構(gòu)緊湊和增強可讀性。 循環(huán)程序一般由五部分組成:循環(huán)初始化:循環(huán)初始化:循環(huán)處理:循環(huán)處理:循環(huán)修改:循環(huán)修改:循環(huán)控制:循環(huán)控制:循環(huán)結(jié)束:循環(huán)結(jié)束:通常2、3、4部分又稱為循環(huán)體。 循環(huán)程序的結(jié)構(gòu)一般有兩種形式:(1)先處理后判斷:先進入處理部分,再控制循環(huán)。即至少執(zhí)行一次循環(huán)體。如圖2

59、-4(a)所示。(2)先判斷后處理:先控制循環(huán),后進入處理部分。即先根據(jù)判斷結(jié)果,控制循環(huán)的執(zhí)行與否,有時可以不進入循環(huán)體就退出循環(huán)程序。如圖2-4(b)所示。 (a) 先判斷后處理(b)先處理后判斷圖2-4 循環(huán)程序結(jié)構(gòu)類型 【例【例2-15】 已知內(nèi)部已知內(nèi)部RAM的的BLOCK單元開始有一無符號數(shù)據(jù)塊,塊長在單元開始有一無符號數(shù)據(jù)塊,塊長在LEN單元,試編寫出數(shù)據(jù)塊中各數(shù)據(jù)累加和并存入單元,試編寫出數(shù)據(jù)塊中各數(shù)據(jù)累加和并存入SUM單元的程序。單元的程序。解:為了對兩種循環(huán)結(jié)構(gòu)有個比較全面了解,并對比分析,給出兩種程序設(shè)計方案。(1)先判斷后處理(如圖)先判斷后處理(如圖2-5(a)所示)

60、所示)參考程序如下:參考程序如下:ORG0200HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;累加器A清零MOVR2,LEN;塊長送入R2MOVR1,#BLOCK;數(shù)據(jù)塊初始地址送入R1INCR2;R2塊長+1SJMPCHECKLOOP: ADDA,R1;AA+(R1)INCR1;修改數(shù)據(jù)塊指針R1CHECK:DJNZR2,LOOP;若未完,則轉(zhuǎn)向LOOPMOVSUM,A;將累加和存入SUM單元SJMP$END(2)先處理后判斷(如圖)先處理后判斷(如圖2-5(b)所示)所示)參考程序如下參考程序如下:ORG0200HLENDATA20HSUMDATA21HBLO

溫馨提示

  • 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

提交評論