




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第2章章 MCS-51單片機(jī)指令系統(tǒng)及匯編語單片機(jī)指令系統(tǒng)及匯編語言程序設(shè)計(jì)基礎(chǔ)言程序設(shè)計(jì)基礎(chǔ)2.1 MCS-51單片機(jī)指令格式單片機(jī)指令格式2.2 MCS-51單片機(jī)尋址方式單片機(jī)尋址方式2.3 MCS-51單片機(jī)指令單片機(jī)指令2.4 匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ)2.1 MCS-51單片機(jī)指令格式單片機(jī)指令格式2.1.1 指令格式指令格式2.1.2 指令的字節(jié)數(shù)指令的字節(jié)數(shù)2.1.3 指令分類指令分類2.1.1 指令格式指令格式指令格式是指指令碼的結(jié)構(gòu)形式,通常,指令可以分為操作碼和操作數(shù)兩部分,其中,操作碼部分比較簡單,而操作數(shù)部分就比較復(fù)雜了,一般來說,根據(jù)計(jì)算機(jī)類型的不同
2、而具有較大的差異。MCS-51系統(tǒng)單片機(jī)的指令系統(tǒng)采用了地址壓縮技術(shù),將操作數(shù)字段的四個(gè)地址壓縮到一個(gè)地址中,故稱為單地址指令,其具體的指令格式為: 操作碼操作碼 操作數(shù)或操作數(shù)地址操作數(shù)或操作數(shù)地址2.1.2 指令的字節(jié)數(shù)指令的字節(jié)數(shù)在指令的二進(jìn)制形式中,指令不同,指令的操作碼和操作數(shù)也不相同,MCS-51機(jī)器語言指令根據(jù)其指令編碼長短的不同有單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令三種格式。1、單字節(jié)指令(49條)2、雙字節(jié)指令(45條)3、三字節(jié)指令(17條)1、單字節(jié)指令(49條)單字節(jié)指令碼只有一個(gè)字節(jié),由八位二進(jìn)制數(shù)組成,這類指令共有49條,其操作碼中包含了操作數(shù)的信息。單字節(jié)指令碼可以
3、分為兩種形式,一類是無操作數(shù)單字節(jié)指令,另一類是含有操作數(shù)寄存器編號(hào)的單字節(jié)指令。(1)無操作數(shù)單字節(jié)指令這類指令的指令碼的8位全表示操作碼,沒有專門指示操作數(shù)的字段,操作數(shù)是隱含在操作碼中的。例如,空操作指令NOP,其機(jī)器碼為: 0 0 0 0 0 0 0 0(2)含有操作數(shù)寄存器編號(hào)的單字節(jié)指令這類指令的指令碼的8位編碼中既包含操作碼字段,也包含專門用來指示操作數(shù)所在寄存器編號(hào)的字段。例如:8位數(shù)傳送指令:MOV A,Rn;ARn這條指令的功能是把寄存器Rn(n=0,1,2,3,4,5,6,7)中的內(nèi)容送到累加器A中去。其機(jī)器碼為: 1 1 1 0 1 Rn操作碼 寄存器編號(hào) 2、雙字節(jié)指
4、令(45條) 雙字節(jié)指令含有兩個(gè)字節(jié),可以分別存放在兩個(gè)存儲(chǔ)單元中,操作碼字節(jié)在前,操作數(shù)字節(jié)在后,其中,操作數(shù)字節(jié)可以是立即數(shù)(指令碼中的數(shù)),也可以是操作數(shù)所在的片內(nèi)RAM地址。例如:MOV A,#DATA;Adata這條指令的功能是將立即數(shù)DATA送到累加器A中去。假設(shè)立即數(shù)DATA=85H,則其機(jī)器碼為:0 1 1 1 0 1 0 01 0 0 0 0 1 0 1 第一字節(jié) 操作碼第二字節(jié) 操作數(shù)(立即數(shù)85H) 3、三字節(jié)指令(17條)這類指令的指令碼的第一個(gè)字節(jié)為操作碼,第二和第三個(gè)字節(jié)為操作數(shù)或操作數(shù)地址。例如:MOV direct,#data這條指令是將立即數(shù)data送到地址為
5、direct的單元中去。假設(shè)direct=78H,data=80H,則MOV 78H,#80H指令的機(jī)器碼為: 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ù)) 用二進(jìn)制編碼表示的機(jī)器語言指令由于不便閱讀理解和記憶,因此在微機(jī)控制系統(tǒng)中采用匯編語言(用助記符和專門的語言規(guī)則表示指令的功能和特征)指令來編寫程序。一條匯編語言指令中最多包含四個(gè)區(qū)段,如下所示: 標(biāo)號(hào):標(biāo)號(hào): 操作碼助記符操作碼助記符 目的操作數(shù)目的操作數(shù),源操作數(shù),源操作數(shù) ;注釋;注釋例如,把立即數(shù)F0H送累
6、加器的指令為: START : MOV A,#0F0H ; 立即數(shù)F0HAMCS-51指令系統(tǒng)有42種助記符代表了33種操作功能,這是因?yàn)橛械墓δ芸梢杂袔追N助記符(例如數(shù)據(jù)傳送的助記符有MOV,MOVC,MOVX)。指令功能助記符與操作數(shù)各種可能的尋址方式相結(jié)合,共構(gòu)成111條指令。2.1.3 指令分類指令分類1、根據(jù)指令在程序存儲(chǔ)器中所占的字節(jié)數(shù),指令系統(tǒng)分為:(1)單字節(jié)指令(49條)(2)雙字節(jié)指令(45條)(3)三字節(jié)指令(17條)2、根據(jù)指令執(zhí)行的時(shí)間,指令系統(tǒng)分為:(1)1個(gè)機(jī)器周期(12個(gè)時(shí)鐘振蕩器周期)指令(64條)(2)2個(gè)機(jī)器周期指令(45條)(24個(gè)時(shí)鐘振蕩器周期)(3)
7、乘、除兩條指令為4個(gè)機(jī)器周期指令(48個(gè)時(shí)鐘振蕩周期) 3、根據(jù)指令的功能,指令系統(tǒng)分為:(1)數(shù)據(jù)傳送類(29條)(2)算術(shù)運(yùn)算類(24條)(3)邏輯操作類(24條)(4)控制轉(zhuǎn)移類(17條)(5)位操作類(17條)符符 號(hào)號(hào)說說 明明Rn表示當(dāng)前工作寄存器區(qū)中的工作寄存器,n取07,表示R0R7direct8位內(nèi)部數(shù)據(jù)存儲(chǔ)單元地址。它可以是一個(gè)內(nèi)部數(shù)據(jù)RAM單元(0127)或特殊功能寄存器地址或地址符號(hào)Ri通過寄存器R1或R0間接尋址的8位內(nèi)部數(shù)據(jù)RAM單元(0255),i=0,1#data指令中的8位立即數(shù)#data16指令中的16位立即數(shù)addR1616位目標(biāo)地址。用于LCALL和LJ
8、MP指令,可指向64K字節(jié)程序存儲(chǔ)器地址空間的任何地方addR1111位目標(biāo)地址。用于ACALL和AJMP指令,轉(zhuǎn)至當(dāng)前PC所在的同一個(gè)2K字節(jié)程序存儲(chǔ)器地址空間內(nèi)rel補(bǔ)碼形式的8位偏移量。用于相對轉(zhuǎn)移和所有條件轉(zhuǎn)移指令中。偏移量相對于當(dāng)前PC計(jì)算,在-128+127范圍內(nèi)取值DPTR數(shù)據(jù)指針,用作16位的地址寄存器A累加器表2-1 MCS-51指令系統(tǒng)符號(hào)說明 bitB特殊功能寄存器,專用于乘(MUL)和除(DIV)指令中C進(jìn)位標(biāo)志或進(jìn)位位bit內(nèi)部數(shù)據(jù)RAM或部分特殊功能寄存器里的可尋址位的位地址表示對該位操作數(shù)取反(X)X中的內(nèi)容(X)表示以X單元的內(nèi)容為地址的存儲(chǔ)器單元內(nèi)容,即(X)
9、作地址,該地址單元的內(nèi)容用(X)表示間址寄存器的前綴標(biāo)志肩頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所取代符號(hào)符號(hào)說說 明明續(xù)表2.2 MCS-51單片機(jī)尋址方式單片機(jī)尋址方式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é)指令,第一個(gè)字節(jié)為操作碼,第二個(gè)字節(jié)為立即操作數(shù),立即操作數(shù)的前面冠以#符號(hào)作前綴,就表示
10、該數(shù)為立即尋址。例如: 助 記 符 注釋 MOV A,#70H ;A 70H注意:注意:在MCS-51匯編語言指令中,#data表示8位立即數(shù),#data16表示16位立即數(shù),立即數(shù)前面必須有符號(hào)“#”,上述兩例寫成一般格式為:MOV A, #dataMOV DPTR,#data16在指令中含有操作數(shù)的直接地址,該地址指出了參與操作的數(shù)據(jù)所在的字節(jié)地址或位地址。直接尋址方式中操作數(shù)存儲(chǔ)的空間有三種:(1)片內(nèi)數(shù)據(jù)存儲(chǔ)器的低128個(gè)字節(jié)單元(00H7FH)例如: MOV A,70H ;A(70H)(2)位地址空間例如: MOV C,00H ;進(jìn)位位直接位00H內(nèi)容(3)特殊功能寄存器(特殊功能寄
11、存器只能用直接尋址方式進(jìn)行訪問)例如:MOV IE,#85H ;中斷允許寄存器IE立即數(shù)85H2.2.2 直接尋址直接尋址2.2.3 寄存器尋址寄存器尋址寄存器尋址是對通用寄存器中的內(nèi)容作為操作數(shù)進(jìn)行的尋址方式,通用寄存器包括A、B、DPTR以及R0R7。寄存器尋址按所選定的工作寄存器R0R7進(jìn)行操作,指令機(jī)器碼的低3位的八種組合000,001,110,111分別指明所用的工作寄存器R0,R1,R6,R7。如:MOV A,Rn(n=07),這8條指令對應(yīng)的機(jī)器碼分別為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ù)所在的存儲(chǔ)器單元地址,寄存器起地址指針的作用,寄存器間接尋址用符號(hào)“”表示。寄存器間接尋址只能使用寄存器R0或R1作為地址指針,來尋址內(nèi)部RAM(00HFFH)中的數(shù)據(jù)。(1)寄存器間接尋址也適用于訪問外部RAM,此時(shí)可使用R0,R1或DPTR作為地址指針。例如:MOV A,R0 ;A (R0)(2)如果訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),只需要將MOV改為MOVX就可以了。例如
13、:MOVX DPTR,A;(DPTR)(A)2.2.5 變址尋址變址尋址這種尋址方式用于訪問程序存儲(chǔ)器中的數(shù)據(jù)表格,它把基址寄存器(DPTR或PC)和變址寄存器A的內(nèi)容作為無符號(hào)數(shù)相加形成16位的地址,訪問程序存儲(chǔ)器中的數(shù)據(jù)表格。例如:MOVC A,ADPTR ;A (DPTR)()MOVC A,APC ;A (PC)() 應(yīng)說明兩點(diǎn):應(yīng)說明兩點(diǎn):(1)變址尋址指令的變址尋址區(qū)是程序存儲(chǔ)器ROM,而不是數(shù)據(jù)存儲(chǔ)器RAM,因此變址尋址只有讀操作,而沒有寫操作。(2)變址尋址是單字節(jié)兩周期指令,CPU執(zhí)行這條指令前應(yīng)預(yù)先在DPTR和累加器A中為該指令的執(zhí)行準(zhǔn)備條件。 2.2.6 相對尋址相對尋址以
14、當(dāng)前PC的內(nèi)容作為基地址,加上指令中給定的偏移量(rel)所得結(jié)果作為轉(zhuǎn)移地址,即對形成新的PC值進(jìn)行的尋址方式,它只適用于雙字節(jié)轉(zhuǎn)移指令。偏移量是帶符號(hào)數(shù),在-128+127范圍內(nèi),用補(bǔ)碼表示。例如:JC rel ;C=1跳轉(zhuǎn) 相對尋址用于修改PC值,主要用于實(shí)現(xiàn)程序的相對轉(zhuǎn)移,相對轉(zhuǎn)移指令執(zhí)行時(shí),是以當(dāng)前PC值加上指令中所規(guī)定的偏移量(rel)而形成實(shí)際的目標(biāo)轉(zhuǎn)移地址,這里所說的當(dāng)前PC值是指完成相對轉(zhuǎn)移指令取指令后的PC值。一般地,稱相對轉(zhuǎn)移指令操作碼所在的首地址為源地址,稱轉(zhuǎn)移后的地址為目標(biāo)地址。則有:目標(biāo)地址目標(biāo)地址 = 源地址源地址 + 相對轉(zhuǎn)移指令的字節(jié)數(shù)相對轉(zhuǎn)移指令的字節(jié)數(shù) +
15、 rel例如:SJMP 08H ;(PC)(PC)+2+08H2.2.7 位尋址位尋址是對片內(nèi)RAM的尋址區(qū)(20H2FH)和特殊功能寄存器的93個(gè)位進(jìn)行位操作時(shí)尋址方式。在進(jìn)行位操作時(shí),需要借助進(jìn)位C作為操作累加器,操作數(shù)直接給出該位的地址,然后根據(jù)操作碼的性質(zhì)對其進(jìn)行位操作。位尋址的位地址和直接尋址的字節(jié)地址形式完全一樣,主要由操作碼來區(qū)分。例如:MOV 20H, C;將位地址為20H的數(shù)據(jù)送給進(jìn)位標(biāo)志C中MOV A,70H ;A(70H)表2-2 操作數(shù)尋址方式及其尋址空間尋址方式尋址方式利用的變量利用的變量尋址空間尋址空間立即尋址程序存儲(chǔ)器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ù)存儲(chǔ)單元的低4位(R0,R1)R0;R1;DPTR外部RAM或I/O口(R0,R1,DPTR)變址尋址DPTR+A;PC+A程序存儲(chǔ)器ROM(A+PC,A+DPTR)相對尋址PC+rel程序存儲(chǔ)器ROM位尋址內(nèi)部RAM中的20H2FH的128位特殊功能寄存器中可尋址的位地址空間2.3 MCS-51單片機(jī)指令單片機(jī)指令2.3.1 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指
17、令 2.3.2 算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令2.3.3 邏輯運(yùn)算及移位指令邏輯運(yùn)算及移位指令2.3.4 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令2.3.5 位操作類指令位操作類指令2.3.6 偽指令偽指令2.3.1 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令是把源操作數(shù)傳送到指令所指定的目標(biāo)地址,指令執(zhí)行后,源操作數(shù)不變,目的操作數(shù)被源操作數(shù)所代替。數(shù)據(jù)傳送是最基本、最重要、使用最頻繁的一種指令,其性能對整個(gè)程序的執(zhí)行效率起很大的作用。數(shù)據(jù)傳送指令共有29條,主要是用于單片機(jī)片內(nèi)RAM和特殊功能寄存器SFR之間數(shù)據(jù)的傳遞,也可以用于單片機(jī)片內(nèi)和片外存儲(chǔ)單元之間傳送數(shù)據(jù)。 數(shù)據(jù)傳送指令一般不影響標(biāo)志位,只有堆
18、棧操作可以直接修改程序狀態(tài)字PSW,另外,對目的操作數(shù)為A的指令將影響奇偶標(biāo)志P位。 數(shù)據(jù)傳送類指令用到的助記符有:MOV,MOVX,MOVC,XCH,XCHD,SWAP,PUSH,POP。源操作數(shù)可以采用寄存器尋址、寄存器間接尋址、直接尋址、立即尋址和變址尋址5種尋址方式,目的操作數(shù)可以采用寄存器尋址、寄存器間接尋址和直接尋址3種尋址方式。 1、內(nèi)部數(shù)據(jù)傳送指令這類指令的源操作數(shù)和目的操作數(shù)地址都在單片機(jī)內(nèi)部,可以是片內(nèi)RAM的地址,也可以是特殊功能寄存器SFR的地址,其指令格式為:MOV ,指令功能是將源字節(jié)送到目的字節(jié)單元,源字節(jié)單元中的源字節(jié)不變。按照尋址方式,內(nèi)部數(shù)據(jù)傳送指令又可以分
19、為立即型、直接型、寄存器型和寄存器間址型四類。(1)立即尋址型傳送指令這類指令的特點(diǎn)是源操作數(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)直接尋址型傳送指令直接傳送型指令的特點(diǎn)是指令碼中至少含有一個(gè)操作數(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)這類指令的功能是將上述逗號(hào)右側(cè)所規(guī)定的源操作數(shù)傳送到逗號(hào)左側(cè)的目的存儲(chǔ)單元智能光,目的存儲(chǔ)單元可以有累加器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)寄存器間址型傳送指令寄存器間址型傳送指令的特點(diǎn)是Ri中存放的不是操作數(shù)本身,而是操作數(shù)所在存儲(chǔ)單元的地址。共有3條:MOV A,Ri;A(Ri)MOV Rn,A;(Ri) AMOV direct,Ri;direct(Ri)1)第一條指令的功能是將Ri中地址所指操作數(shù)傳送到累加器A中;第二條指令的功能是將累加器A中操作數(shù)傳送到以Ri中內(nèi)容為地址的存儲(chǔ)單元;2)第三條指令的功能是將以Ri中內(nèi)容為地址的源操作數(shù)傳送到direct存儲(chǔ)單元中。 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中,這個(gè)16位立即數(shù)實(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é)傳送指令這類指令可以實(shí)現(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ù)傳送指令,其特點(diǎn)是根據(jù)堆棧指針SP中棧頂?shù)刂愤M(jìn)行數(shù)據(jù)傳送操作,共有2條:PUSHdirect;SPSP+1,(SP) (direct)POPdirect;direct(SP),SPSP-11)第一條指令為壓棧指令,用于將direct為地址的操作數(shù)傳送到堆棧中。指令在執(zhí)行時(shí)分為兩步,第一步先將堆棧指針SP中的棧頂?shù)刂芳?,使之指向堆棧的新的棧頂單元;第二步將direct中操作數(shù)壓入由SP指示的棧頂單元。2)第二條指令為彈出指令,其功能是將堆
24、棧中操作數(shù)傳送到direct單元。指令執(zhí)行時(shí)也分為兩步,第一步是將由堆棧指針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ù)運(yùn)算類指令算術(shù)
25、運(yùn)算類指令算術(shù)運(yùn)算指令共有24條,用于對兩個(gè)操作數(shù)進(jìn)行加、減、乘、除算術(shù)運(yùn)算。兩個(gè)操作數(shù)中,一個(gè)應(yīng)放于累加器A中,另一個(gè)可以放在某個(gè)寄存器或片內(nèi)RAM單元中,也可以放在指令碼的第二個(gè)和第三個(gè)字節(jié)中。指令執(zhí)行后,運(yùn)算結(jié)果可以保留再累加器A中;運(yùn)算中產(chǎn)生的進(jìn)位標(biāo)志、奇偶標(biāo)志和溢出標(biāo)志等皆可以保留在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é)加法運(yùn)算中。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中其他各標(biāo)志位狀態(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ù)運(yùn)算指令。注意:注意:在執(zhí)行加1指令時(shí),應(yīng)按照帶符號(hào)數(shù)相加運(yùn)算,但與加法指令不同的是,上述只有第1條指令能對奇偶標(biāo)志位P產(chǎn)生影響,其余指令在執(zhí)行時(shí)均不會(huì)對任何標(biāo)志位產(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指令對奇偶校驗(yàn)標(biāo)志位P有影響外,其余減1指令并不影響PSW標(biāo)志位狀態(tài), 3、十進(jìn)制調(diào)整指令十進(jìn)制調(diào)整指令是一條專用指令,用于對累加器A中的BCD碼加法結(jié)果進(jìn)行調(diào)整運(yùn)算,BCD碼進(jìn)行二進(jìn)制數(shù)相加運(yùn)算后,必須經(jīng)過此
29、條指令調(diào)整,才能得到正確的結(jié)果,指令的格式為:DA A;若;若AC=1或或A309,則,則AA+06H;若;若Cy=1或或A749,則,則AA+60H4、乘法和除法指令乘法和除法指令均為單字節(jié)4周期指令,相當(dāng)于執(zhí)行4條加法指令的時(shí)間。指令格式為:MULAB;BA(A)(B),產(chǎn)生標(biāo)志,產(chǎn)生標(biāo)志DIVAB;(;(A)/(B)=(A)余(余(B)2.3.3 邏輯運(yùn)算及移位指令邏輯運(yùn)算及移位指令邏輯操作指令共有24條,包括邏輯操作和環(huán)移兩類。(1)邏輯操作指令用于對兩個(gè)8位操作數(shù)進(jìn)行邏輯乘、邏輯加、邏輯取反和邏輯異或等操作,常用來對數(shù)據(jù)進(jìn)行邏輯處理,使之適合于傳送、存儲(chǔ)和輸出打印等操作。大多數(shù)指令需
30、要將兩個(gè)操作數(shù)中的一個(gè)預(yù)先放入累加器A中,操作結(jié)果也存放在累加器A中。這類指令中,除了以累加器A為目標(biāo)寄存器指令外,其余指令均不會(huì)對PSW中各個(gè)標(biāo)志位產(chǎn)生影響;(2)環(huán)移指令可以對累加器A中的操作數(shù)進(jìn)行環(huán)移,環(huán)移指令又分為左環(huán)移和右環(huán)移,帶進(jìn)位位Cy環(huán)移和不帶進(jìn)位位Cy 環(huán)移。 1、邏輯運(yùn)算指令(1)邏輯與運(yùn)算指令邏輯與運(yùn)算指令又稱為邏輯乘運(yùn)算指令,共有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)邏輯或運(yùn)算指令OLRA,Rn;AARnOLRA,direct ;AA(direct)OLRA,Ri;AA(Ri)OLRA,#data ;AAdataOLRdirect,A;direct(direct)AOLRdirect,#data ;direct(direct)data(3)邏輯異或運(yùn)算指令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ù)進(jìn)行移位操作的指令。(1)左環(huán)移指令RLA這條指令的功能是將累加器中的數(shù)據(jù)向左環(huán)移位,7位循環(huán)移入0位,并不影響各個(gè)標(biāo)志位狀態(tài)。 70累加器A(2)帶進(jìn)位左環(huán)移指令RLCA這條指令的功能是將累加器A中的數(shù)據(jù)和進(jìn)位標(biāo)志Cy一起向左環(huán)移1位,A7移入進(jìn)位標(biāo)志位Cy,而Cy移入A0中,不影響其他標(biāo)志位狀態(tài)。 7 0累加器ACy(3)右環(huán)移指令RR A這條指令的功能是將累加器中的數(shù)據(jù)右環(huán)移位,該指令操作不影響各個(gè)標(biāo)志位狀態(tài)。 70累加器A(4)帶進(jìn)位右環(huán)移指令RRCA這條指令的功能是累加器中的數(shù)據(jù)和進(jìn)
33、位標(biāo)志位Cy一起向右環(huán)移1位,A0移入進(jìn)位標(biāo)志位Cy,而Cy移入A7,該指令操作不影響其他標(biāo)志位狀態(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í)行后都以改變程序計(jì)數(shù)器PC中的值為目標(biāo)??刂妻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位地址,目標(biāo)地址由指令第2字節(jié)(高8位地址)和第3字節(jié)(低8位地址)組成,因此,程序轉(zhuǎn)向的目標(biāo)地址可以包含程序存儲(chǔ)器的整個(gè)64KB空間。執(zhí)行這條指令時(shí)把指令的第2和第3字節(jié)分別裝入PC的高位和低位字節(jié)中,無條件地轉(zhuǎn)向指定地址。轉(zhuǎn)移的目標(biāo)地址可以在64K程序存儲(chǔ)器地址空間的任何地方,不影響任何標(biāo)志。(3)絕對轉(zhuǎn)移指令(2KB范圍內(nèi)轉(zhuǎn)移指令)AJMPaddr11;PCPC+2,PC10PC0addr11這是2K字節(jié)范圍內(nèi)的無條件轉(zhuǎn)跳指令,把程序的執(zhí)行轉(zhuǎn)移到指定的地址。該指令在運(yùn)行時(shí)先將PC
35、+2,然后通過把指令中的A10A0(PC100)得到跳轉(zhuǎn)目的地址送入PC。目標(biāo)地址必須與AJMP后面一條指令的第一個(gè)字節(jié)在同一個(gè)2K區(qū)域的存儲(chǔ)器區(qū)內(nèi)(即高5位地址必須相同)。絕對轉(zhuǎn)移指令執(zhí)行時(shí)分為兩步:第一步是取指令操作,程序計(jì)數(shù)器PC中內(nèi)容被加1了兩次;第二步是將PC加1兩次后的高5位地址PC1511和指令碼低11位地址構(gòu)成目標(biāo)轉(zhuǎn)移地址。 (4)變址尋址轉(zhuǎn)移指令JMPA+DPTR;PCA+DPTR該指令又稱為散轉(zhuǎn)指令,其功能是把累加器中8位無符號(hào)數(shù)與數(shù)據(jù)指針DPTR中的16位數(shù)相加,將結(jié)果作為下條指令地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR中的內(nèi)容,也不影響標(biāo)志,利用這條指令能實(shí)現(xiàn)程序
36、的散轉(zhuǎn)。 使用以上調(diào)用與轉(zhuǎn)移指令應(yīng)注意的問題:使用以上調(diào)用與轉(zhuǎn)移指令應(yīng)注意的問題:1) 以上指令均為無條件,執(zhí)行該類指令時(shí)程序計(jì)數(shù)器PC一定轉(zhuǎn)向非順序單元執(zhí)行。2)調(diào)用與返回指令常成對使用,返回指令RET應(yīng)出現(xiàn)在每一個(gè)子程序的末尾。3)調(diào)用與返回指令都要有棧操作,使用該類指令前要建立堆棧,以便保護(hù)斷點(diǎn)。4)轉(zhuǎn)移指令與調(diào)用子程序指令的異同:相同之處是它們都是改變PC值,使程序轉(zhuǎn)入非順序單元執(zhí)行;不同之處是調(diào)用與返回指令在子程序執(zhí)行結(jié)束后一定返回,原斷點(diǎn)地址,因此一定有棧操作,轉(zhuǎn)移指令轉(zhuǎn)走后不一定回到原斷點(diǎn),因此不必堆棧保存斷點(diǎn)地址。2、條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是在執(zhí)行程序過程中需要判斷是否滿足某
37、種特定條件而決定轉(zhuǎn)移與否的指令。當(dāng)條件滿足時(shí)轉(zhuǎn)移(相當(dāng)于一條相對轉(zhuǎn)移指令),條件不滿足時(shí)則順序執(zhí)行下面的指令。當(dāng)條件滿足時(shí),先把PC加到指向下一條指令的第一個(gè)字節(jié)地址,再把有符號(hào)的相對偏移量加到PC上,計(jì)算出轉(zhuǎn)向地址。條件轉(zhuǎn)移指令共有8條,分為零條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和減非零條件轉(zhuǎn)移指令三類。 (1)零條件轉(zhuǎn)移指令這組指令執(zhí)行時(shí)均需要判斷累加器中內(nèi)容是否為零作為條件轉(zhuǎn)移條件,共有條:JZrel ;若;若A=0,則,則PCPC+2+rel;若;若,則,則PCPC+2JNZ rel ;若;若A0,則,則PCPC+2+rel;若;若=,則,則PCPC+2零條件轉(zhuǎn)移指令在執(zhí)行時(shí)應(yīng)注意如下兩個(gè)問題:
38、零條件轉(zhuǎn)移指令在執(zhí)行時(shí)應(yīng)注意如下兩個(gè)問題: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在程序中常用標(biāo)號(hào)代替,翻譯成機(jī)器碼時(shí)才換算成8位相對地址,換算方法和轉(zhuǎn)移地址范圍和無條件轉(zhuǎn)移指令中的段條件轉(zhuǎn)移指令相同。(2)比較轉(zhuǎn)移指令CJNEA,direct,rel;若;若A=(direct),則),則PCPC+3; ;若;若A(direct),則),則PCPC+3+rel,形成,形成Cy標(biāo)志。標(biāo)志。CJ
39、NEA,#data,rel;若;若A=data,則,則PCPC+3; ;若;若Adata,則,則PCPC+3+rel,形成,形成Cy標(biāo)志。標(biāo)志。CJNERn,#data,rel;若;若Rn=data,則,則PCPC+3;若;若Rndata,則,則PCPC+3+rel,形成,形成Cy標(biāo)志。標(biāo)志。CJNERi,#data,rel;若;若(Ri)=data,則,則PCPC+3; ;若;若(Ri)data,則,則PCPC+3+rel,形成,形成Cy標(biāo)志。標(biāo)志。(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è)計(jì)中,有時(shí)因操作要求,需要反復(fù)執(zhí)行某段程序,使這段程序能被公用,為了減少編寫和調(diào)試程序的工作量,以及減少程序在內(nèi)存儲(chǔ)器中所占有的存儲(chǔ)空間,常常把具有一定功能的公用程序段編制成子程序,供主程序在需要時(shí)調(diào)用。當(dāng)主程序轉(zhuǎn)至子程序時(shí)用調(diào)用指令,而在子程序的最后安排一條返回指令,使執(zhí)行完子程序后再返回到主程序。為保證正確返回,每次調(diào)用子程序時(shí)自動(dòng)將下條指令地址保存到堆棧,返回時(shí)按先進(jìn)后出原則再把地址彈出到PC中。
41、調(diào)用和返回指令是成對使用的,調(diào)用指令必須具有將程序計(jì)數(shù)器PC中斷點(diǎn)地址保護(hù)到堆棧以及將子程序入口地址自動(dòng)送入程序計(jì)數(shù)器PC的功能;返回指令則必須具有能將堆棧中的斷點(diǎn)地址自動(dòng)恢復(fù)到程序計(jì)數(shù)器PC的功能。 主程序和子程序是相對的,同一個(gè)子程序即可以作為另一個(gè)程序的子程序,也可以有自己的子程序,這種程序稱為子程序的嵌套。圖2-1(a)為一個(gè)兩級(jí)嵌套的子程序調(diào)用示意圖,圖2-1(b)為兩級(jí)子程序調(diào)用后堆棧中斷點(diǎn)地址的存放情況。(a)二級(jí)子程序嵌套示意圖(b)轉(zhuǎn)入子程序2時(shí)的堆棧示意圖2-1 二級(jí)子程序嵌套以及斷點(diǎn)地址存放示意圖(1)子程序調(diào)用指令子程序調(diào)用指令有兩個(gè)功能,一個(gè)是將斷點(diǎn)地址壓入堆棧保護(hù),
42、斷點(diǎn)地址下一條指令地址的地址取決于調(diào)用指令的字節(jié)數(shù),可以是(PC)+2或(PC)+3,這里的(PC)是調(diào)用指令第1字節(jié)所在的地址;第二個(gè)功能是將所調(diào)用子程序的入口地址送到程序計(jì)數(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í)行該指令僅使程序計(jì)數(shù)器PC加1,而不進(jìn)行其他任何操作,共消耗12個(gè)時(shí)鐘周期時(shí)間,因此,這條指令常用于延時(shí)程序中。2.3.5 位操作類指令位操作類指令位操作指令又成為布爾變量操作指令,共有17條。包括位傳送、位變量修改、位運(yùn)算和位控制轉(zhuǎn)移指令四類,其中,位傳送、位置位和位運(yùn)算指令的操作數(shù)是以字節(jié)中某位為單位進(jìn)行操作的,而不
44、是以字節(jié)為單位進(jìn)行操作;位控制轉(zhuǎn)移指令是以檢測字節(jié)中的某一位的狀態(tài)為條件進(jìn)行轉(zhuǎn)移的,而不是以整個(gè)字節(jié)為條件進(jìn)行轉(zhuǎn)移。位操作指令的操作對象是片內(nèi)RAM的位尋址區(qū)(即20H2FH)和SFR中的11個(gè)可以位尋址的寄存器。 1、位傳送指令MOV C, bit;Cy(bit) MOV bit,C;bitCy2、位變量修改指令CLR C;Cy0CLR bit;bit0CPL C;CyCPL bit ;bit SETB C;Cy1SETB bit;bit1Cybit3、位運(yùn)算指令這組指令共分為與、或兩種邏輯運(yùn)算,共有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 偽指令偽指令把匯編語言源程序通過匯編程序翻譯成機(jī)器語言程序(稱為目標(biāo)程序),計(jì)算機(jī)才能執(zhí)行,這個(gè)翻譯過程稱為匯編。匯編程序?qū)τ脜R編語言寫的源程序進(jìn)行匯編時(shí),還要提供一些匯編用的控制指令,例如要指定程序或數(shù)據(jù)存放的起始地址;要給一些連續(xù)存放的數(shù)據(jù)確定單元等等。但是,這些指令在匯編時(shí)并不產(chǎn)生目標(biāo)代碼,不影響程序的執(zhí)行,所以稱為偽指令。常用的有下列幾種偽指令: 1、ORG定位偽指令ORG偽指
47、令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始。它指明此語句后面的程序或數(shù)據(jù)塊的起始地址。其一般格式為:ORGnn (絕對地址或標(biāo)號(hào))(絕對地址或標(biāo)號(hào))2、DB定義字節(jié)偽指令一般格式:標(biāo)號(hào):標(biāo)號(hào):DB字節(jié)常數(shù)或字符或表達(dá)式字節(jié)常數(shù)或字符或表達(dá)式其中:標(biāo)號(hào)區(qū)段可有可無,字節(jié)常數(shù)或字符是指一個(gè)字節(jié)數(shù)據(jù),或用逗號(hào)分開的字節(jié)串,或用引號(hào)括起來的ASCII碼字符串。此偽指令的功能是把字節(jié)常數(shù)或字節(jié)串存入內(nèi)存連續(xù)單元中。 3、DW定義偽指令一般格式:標(biāo)號(hào)碼:標(biāo)號(hào)碼:DW字或字串字或字串DW偽指令的功能與DB相似,其區(qū)別在于DB是定義一個(gè)字節(jié)能,而DW是定義一個(gè)字(規(guī)定為兩個(gè)字節(jié),即16位二進(jìn)制數(shù)),故DW主要用來定
48、義地址。存放時(shí)一個(gè)字需兩個(gè)單元。4、EQU賦值偽指令一般格式:標(biāo)號(hào):標(biāo)號(hào):EQU操作數(shù)操作數(shù)EQU偽指令的功能是將操作數(shù)賦值于標(biāo)號(hào),使兩邊的兩個(gè)量等值。 5、DS定義存儲(chǔ)空間偽指令一般格式:DS表達(dá)式表達(dá)式在匯編時(shí),從指定地址開始保留DS之后“表達(dá)式”的值所規(guī)定的存儲(chǔ)單元。6、BIT定義位地址符號(hào)偽指令一般格式:字符名稱字符名稱 BIT位地址位地址這里的“字符名稱”與標(biāo)號(hào)不同(其后沒有“:”),但是必須的,其功能是將BIT之后的“位地址”賦值給“字符名稱”。7、END匯編結(jié)束偽指令一般格式:標(biāo)號(hào):標(biāo)號(hào):END地址或標(biāo)號(hào)地址或標(biāo)號(hào)其中標(biāo)號(hào)以及操作數(shù)字段的地址或標(biāo)號(hào)不是必要的。2.4 匯編語言程序
49、設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ)2.4.1 匯編語言程序的基本結(jié)構(gòu)匯編語言程序的基本結(jié)構(gòu)2.4.2 匯編語言程序的格式匯編語言程序的格式2.4.3 順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)程序設(shè)計(jì)2.4.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)2.4.5 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)2.4.6 查表程序設(shè)計(jì)查表程序設(shè)計(jì)2.4.7 子程序設(shè)計(jì)子程序設(shè)計(jì)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、指令實(shí)現(xiàn)的,即根據(jù)條件對程序餓執(zhí)行進(jìn)行判斷,若滿足條件,則進(jìn)行程序轉(zhuǎn)移;若不滿足條件,就順序執(zhí)行程序。3、循環(huán)結(jié)構(gòu)循環(huán)程序是最常見的程序組織方式,在程序運(yùn)行時(shí),有時(shí)需要連續(xù)重復(fù)執(zhí)行某段程序,這時(shí)可以使用循環(huán)程序。這種設(shè)計(jì)方法可大大簡化程序。 循環(huán)程序的結(jié)構(gòu)一般包括如下幾個(gè)部分:(1)置循環(huán)初值)置循環(huán)初值(2)循環(huán)體)循環(huán)體(3)修改控制變量)修改控制變量(4)循環(huán)控制部分)循環(huán)控制部分2.4.2 匯編語言程序的格式匯編語言程序的格式匯編語言分為3個(gè)部分,即標(biāo)號(hào)、操作碼、操作數(shù)。每個(gè)部分之間要用分隔符隔開,分隔符可以采用空格、冒號(hào)、分號(hào),具體格式如下:標(biāo)號(hào):操作碼標(biāo)號(hào):操作碼 操作數(shù)操作數(shù);注
51、釋;注釋必須嚴(yán)格語句格式編寫程序,對于任意匯編語句來說,只有操作碼是必不可少的。 (1)標(biāo)號(hào))標(biāo)號(hào)標(biāo)號(hào)位于語句的最前面,由18個(gè)字母和數(shù)字組成,它代表該語句的地址。標(biāo)號(hào)必須由字母打頭,以冒號(hào)結(jié)尾,不能使用指令助記符、偽指令或寄存器名。標(biāo)號(hào)不是語句的必要組成部分,在需要時(shí)才使用。1)正確的標(biāo)號(hào)使用方法,如B3、DA、AD、DELY、LOOP、START等;2)錯(cuò)誤的標(biāo)號(hào)使用方法,如4A、A+B、END、ADD、EQU等。 (2)操作碼)操作碼操作碼是指令的助記符,表示語句的性質(zhì),不可以省略,它是語句的核心部分。(3)操作數(shù))操作數(shù)操作數(shù)與操作碼之間用空格分開。操作數(shù)一般有目的操作數(shù)和源操作數(shù),操
52、作數(shù)之間用逗號(hào)分開。操作數(shù)可以是立即數(shù),也可以是地址,但必須滿足尋址方式的規(guī)定。 (4)注釋)注釋注釋是用戶為方便閱讀程序而附加的說明,一個(gè)好的程序員應(yīng)養(yǎng)成良好的添加注釋的習(xí)慣。注釋與操作數(shù)之間用分號(hào)隔開。 2.4.3 順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)程序是一種最簡單、最基本的程序,又稱為簡單程序,是按照邏輯操作順序,從某一條指令開始依次順序執(zhí)行。順序結(jié)構(gòu)程序中沒有分支、循環(huán)或子程序,可以完成一定的功能,它是構(gòu)成復(fù)雜程序的基礎(chǔ)。 【例2-10】無符號(hào)多字節(jié)加法設(shè)被加數(shù)存放在片內(nèi)RAM的10H(低位字節(jié))、11H(高位字節(jié)),加數(shù)存放在12H(低位字節(jié))、13H(高位字節(jié)),運(yùn)算結(jié)果存放
53、在10H(低位字節(jié))、11H(高位字節(jié))中。參考程序如下:參考程序如下:START:PUSHACC;將累加器中的內(nèi)容壓入堆棧保護(hù) 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ù)帶進(jìn)位相加MOV R0,A;高位字節(jié)數(shù)相加操作結(jié)果存入11H單元中CLRA;累加器中進(jìn)位標(biāo)志Cy清零ADDC A, #0
54、0H;MOV20H,A;進(jìn)位數(shù)暫存入20H單元中POPACC;恢復(fù)累加器A原來內(nèi)容【例【例2-11】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù) 設(shè):內(nèi)部RAM40H,41H單元中分別存放著8位二進(jìn)制數(shù)。要求取出兩個(gè)單元中的低半字節(jié)、合并成一個(gè)字節(jié)后,存42H單元。參考程序如下:參考程序如下: ORG 0000HSTART: MOVR1,#40H MOV A,R1 ANLA,#0FH;取第一個(gè)半字節(jié) SWAP A INCR1 XCHA,R1;取第二字節(jié) ANLA,#0FH;取第二個(gè)半字節(jié) ORLA,R1;拼字 INCR1 MOV R1,A;存放結(jié)果 RET END 分支結(jié)
55、構(gòu)程序是根據(jù)某種條件判斷結(jié)果,決定程序的流向。分支程序的特點(diǎn)是程序執(zhí)行流程中包含條件判斷,符合條件要求和不符合條件要求的有不同的處理路徑。 分支結(jié)構(gòu)程序一般分為簡單分支程序和散轉(zhuǎn)程序兩類。 2.4.4 分支程序設(shè)計(jì)分支程序設(shè)計(jì)1、簡單分支程序簡單分支程序有3種形式,如圖2-2所示。圖2-2 簡單分支程序流程圖 【例【例2-12】兩個(gè)無符號(hào)數(shù)比較大小】兩個(gè)無符號(hào)數(shù)比較大小設(shè)兩個(gè)連續(xù)外部RAM單元ST1和ST2中存放不帶符號(hào)的二進(jìn)制數(shù),找出其中的大數(shù)存入ST3單元中。參考程序如下:參考程序如下:ORG8000HST1EQU8040H START1:CLRC; 進(jìn)位位清零 MOVDPTR,#ST1;
56、 設(shè)數(shù)據(jù)指針 MOVX A, DPTR; 取第一數(shù) MOV R2, A; 暫存R2 INC DPTRMOVX A,DTPR; 取第二個(gè)數(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é)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼。】求單字節(jié)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼。正數(shù)補(bǔ)碼是其本身,負(fù)數(shù)的補(bǔ)碼是其反碼加1。因此,程序首先判斷被轉(zhuǎn)換數(shù)的符號(hào),負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)即為補(bǔ)碼。設(shè)二進(jìn)制數(shù)放在累加器A中,其補(bǔ)碼放回到A中。 參考程序
57、:參考程序: ORG 0000H CMPT:MOVA,30H;單字節(jié)二進(jìn)制數(shù)送入30H單元中JNBACC.7,NCH;(A)0,不需轉(zhuǎn)換 MOVC,ACC.7;保存符號(hào)MOV10H,CCPLA ADDA,#1 MOVACC.7,C;恢復(fù)符號(hào) NCH: RET END2、散轉(zhuǎn)程序 散轉(zhuǎn)程序?qū)儆诜种С绦虻囊环N并行多分支程序,它根據(jù)某種輸入或運(yùn)算結(jié)果,分別轉(zhuǎn)向各個(gè)處理程序。散轉(zhuǎn)程序常使用散轉(zhuǎn)指令JMP A+DPTR實(shí)現(xiàn)程序的跳轉(zhuǎn)操作,其中,DPTR常存放散轉(zhuǎn)地址表的首地址,累加器存放轉(zhuǎn)移地址序號(hào)。該指令將累加器A中的8位無符號(hào)內(nèi)容與16位數(shù)據(jù)指針的內(nèi)容相加后裝入程序計(jì)數(shù)器PC中,實(shí)現(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è)計(jì)循環(huán)程序設(shè)計(jì)循環(huán)程序的特點(diǎn)是程序中含有可以重復(fù)執(zhí)行的程序段,該程序段稱為循環(huán)體,當(dāng)滿足某種條件時(shí),能重復(fù)執(zhí)行某一段程序。采用循環(huán)程序時(shí),可以減少指令和節(jié)省存儲(chǔ)單元,可能使程序結(jié)構(gòu)緊湊和增強(qiáng)可讀性。 循環(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)先處理后判斷:先進(jìn)入處理部分,再控制循環(huán)。即至少執(zhí)行一次循環(huán)體。如圖2
59、-4(a)所示。(2)先判斷后處理:先控制循環(huán),后進(jìn)入處理部分。即先根據(jù)判斷結(jié)果,控制循環(huán)的執(zhí)行與否,有時(shí)可以不進(jìn)入循環(huán)體就退出循環(huán)程序。如圖2-4(b)所示。 (a) 先判斷后處理(b)先處理后判斷圖2-4 循環(huán)程序結(jié)構(gòu)類型 【例【例2-15】 已知內(nèi)部已知內(nèi)部RAM的的BLOCK單元開始有一無符號(hào)數(shù)據(jù)塊,塊長在單元開始有一無符號(hào)數(shù)據(jù)塊,塊長在LEN單元,試編寫出數(shù)據(jù)塊中各數(shù)據(jù)累加和并存入單元,試編寫出數(shù)據(jù)塊中各數(shù)據(jù)累加和并存入SUM單元的程序。單元的程序。解:為了對兩種循環(huán)結(jié)構(gòu)有個(gè)比較全面了解,并對比分析,給出兩種程序設(shè)計(jì)方案。(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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商場施工清場方案(3篇)
- 電梯環(huán)境改造方案(3篇)
- 景區(qū)門樓改建方案(3篇)
- 基礎(chǔ)護(hù)理教學(xué)教學(xué)課件
- 服裝導(dǎo)購績效方案(3篇)
- 樣品生產(chǎn)控制方案(3篇)
- 民族地區(qū)草場承包與民族團(tuán)結(jié)進(jìn)步協(xié)議
- 菜鳥驛站快遞網(wǎng)點(diǎn)轉(zhuǎn)讓與經(jīng)營規(guī)范協(xié)議
- 出租車駕駛員心理健康保障合同
- 廠房拆除與拆除區(qū)域安全防護(hù)與交通管制合同
- 商務(wù)英語寫作實(shí)踐智慧樹知到答案章節(jié)測試2023年中北大學(xué)
- 社會(huì)治安動(dòng)態(tài)視頻監(jiān)控系統(tǒng)工程建設(shè)方案
- 脫硫塔玻璃鱗片膠泥襯里施工組織設(shè)計(jì)
- XB/T 505-2011汽油車排氣凈化催化劑載體
- GB/T 3672.2-2002橡膠制品的公差第2部分:幾何公差
- GB/T 27744-2021異步起動(dòng)永磁同步電動(dòng)機(jī)技術(shù)條件及能效分級(jí)(機(jī)座號(hào)80~355)
- GB 8076-2008混凝土外加劑
- 寶盾轉(zhuǎn)門故障代碼
- 【課件】草原上的小木屋
- 醫(yī)務(wù)人員違規(guī)行為與年度考核掛鉤制度
- 空調(diào)維保質(zhì)量保障體系及措施方案
評論
0/150
提交評論