




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 匯編語(yǔ)言程序設(shè)計(jì),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu) 4.2 匯編語(yǔ)言程序設(shè)計(jì) 4.3 合程序設(shè)計(jì)舉例,4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),4.1.1匯編語(yǔ)言語(yǔ)句格式 匯編語(yǔ)言源程序由一系列語(yǔ)句組成,一般每個(gè)語(yǔ)句占一行。語(yǔ)句的主體通常是各種指令。語(yǔ)句是由標(biāo)號(hào)、操作碼、操作數(shù)和注釋這四部分組成。其格式和舉例如下: 標(biāo)號(hào):操作碼操作數(shù) ;注釋 START:MOV A,#32 H;A32 H 其中標(biāo)號(hào)和操作碼之間用“:”作為分隔符,也可再加上若干空格。操作碼和操作數(shù)之間用空格作分隔符。注釋之前用“;”作為分隔符。,下一頁(yè),返回,4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),1.標(biāo)號(hào) 標(biāo)號(hào)給出了該語(yǔ)句的符號(hào)地址,即對(duì)應(yīng)指令機(jī)器
2、代碼存儲(chǔ)單元的地址。標(biāo)號(hào)由字母開頭,后跟字母或數(shù)字。標(biāo)號(hào)的最大允許長(zhǎng)度由匯編程序確定。操作碼助記符、寄存器名以及偽指令都不能用作標(biāo)號(hào)。在匯編語(yǔ)言中,一旦某條語(yǔ)句被賦予標(biāo)號(hào),該標(biāo)號(hào)就可作為其他語(yǔ)句的操作數(shù)使用了。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),以下是一些合法的標(biāo)號(hào):START , DL0 , SUM , A1, LOOP等。 以下的字符串不能用作標(biāo)號(hào):2A, S +M, ADD, EQU。 并不是每一條語(yǔ)句都需要加標(biāo)號(hào)。通常對(duì)于轉(zhuǎn)移指令涉及的語(yǔ)句、程序和子程序的開始語(yǔ)句等才使用標(biāo)號(hào)。使用標(biāo)號(hào)便于程序的編寫、閱讀和修改。當(dāng)采用機(jī)器匯編時(shí),可省去對(duì)實(shí)際地址值的計(jì)算。,下一頁(yè),返回
3、,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),2.操作碼 操作碼表示該語(yǔ)句要執(zhí)行的操作內(nèi)容,是每一條匯編語(yǔ)言語(yǔ)句必有的部分。操作碼用指令的助記符表示,在操作碼后面至少要有一個(gè)空格,使它與操作數(shù)分開。 3.操作數(shù) 操作數(shù)是該指令操作所需要的數(shù)據(jù)。根據(jù)操作碼的功能,操作數(shù)可能是一項(xiàng)或多于一項(xiàng)。當(dāng)多于一項(xiàng)時(shí),操作數(shù)之間用逗號(hào)分隔。個(gè)別指令不需要操作數(shù),則此項(xiàng)空缺。 操作數(shù)可以是立即數(shù)或其他的尋址方式。立即數(shù)必須以數(shù)字開頭,若十六進(jìn)制數(shù)以字母開頭,則必須在前面加“0” 。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),4.注釋 注釋是語(yǔ)句的說(shuō)明部分,它必須以分號(hào)“;”開始。當(dāng)采用機(jī)器匯編時(shí),計(jì)算機(jī)對(duì)它不作
4、處理。注釋可以同源程序的其他部分一起輸出。注釋可為一行或幾行(每行均以分號(hào)開始)。注釋不是每條語(yǔ)句所必需的。但適當(dāng)?shù)淖⑨屖沟贸绦虮阌陂喿x。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),4. 1. 2偽指令 當(dāng)匯編程序?qū)τ趨R編語(yǔ)言源程序進(jìn)行匯編時(shí),還要求提供一些有關(guān)匯編信息的指令,例如指定程序或數(shù)據(jù)存放的起始地址、給一些連續(xù)存放的數(shù)據(jù)確定單元等。但是,這類指令在匯編時(shí)并不產(chǎn)生目標(biāo)代碼,不影響程序的執(zhí)行,所以稱為偽指令。常用的偽指令有下列幾種。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),1.匯編起始偽指令ORG( Origin) ORG偽指令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始。它指明
5、此語(yǔ)句后面的程序或數(shù)據(jù)塊的起始地址。其格式為 ORG nn 其中nn可用絕對(duì)地址或標(biāo)號(hào)表示,在匯編時(shí)由nn確定此語(yǔ)句下面第一條指令(或第一個(gè)數(shù)據(jù))的地址。該段源程序(或數(shù)據(jù)塊)就連續(xù)存放在以后的地址內(nèi),直到遇到另一條ORG偽指令為止。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),例如: ORG 1000H START: MOV R0,#50 H MOV A,R4 ADD A,R0 匯編后目標(biāo)代碼在存儲(chǔ)器中存放的結(jié)果,如表4-1所列,起始地址是1000 H 。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),2.定義字節(jié)偽指令DB ( Define Byle) 其格式為 標(biāo)號(hào):DB X1
6、,X2,,Xi,Xn 其中X1Xn是單字節(jié)數(shù)或由EQU偽指令定義的字符,也可以是用引號(hào)括起來(lái)的ASCII碼。此偽指令的功能是把這組數(shù)據(jù)依次存入由該偽指令指定的地址單元中。例如: ORG; 2000H DATA1 DB 73 H,20 H,30H DR A 輸出結(jié)果,如表4 -2所列。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),3.定義字偽指令DW (Define Word) 其格式為 標(biāo)號(hào): DW Y1,Y2,,Yi,Yn 其中Y1Yn均為雙字節(jié)數(shù)。DW偽指令的功能與DB相似,其區(qū)別在于DB是定義字節(jié),而DW是定義字。此偽指令主要用來(lái)定義地址。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的
7、語(yǔ)句結(jié)構(gòu),4.賦值偽指令EQU (Equate) 其格式為 標(biāo)號(hào)EQU數(shù)據(jù)或匯編符號(hào) 其中的標(biāo)號(hào)為字符名稱,其后無(wú)冒號(hào),數(shù)據(jù)可為單、雙字節(jié)數(shù)。EQU偽指令的功能是將數(shù)據(jù)值或匯編符號(hào)賦值于標(biāo)號(hào)。注意在一個(gè)程序中對(duì)于某一標(biāo)號(hào)只能賦值一次。,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),例如: ORG 2000H STK EQU 50H ;5TK賦值為SOH AA EQU R1 ;AA賦值后當(dāng) R1使用 TAB EQU 3000H ;TAB賦值為雙字節(jié)數(shù)3000H MOV A,5TK MOV B,AA LCALL TAB,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),5.位定義偽指令BIT
8、其格式為 標(biāo)號(hào)BIT位地址 其中的標(biāo)號(hào)為字符名稱,其后無(wú)冒號(hào),BIT偽指令的功能是給符號(hào)形式的位地址賦值。例如: H1 BIT 30H ;H1定義為位地址30H H2 BIT TF0 ;H2定義為位地址TF0 A1 BIT P1.0 ;A1定義為位地址P1. 0 MOV C, H1 ANL C, H2 MOV Al,C ;Pl. 0,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),6.數(shù)據(jù)地址賦值偽指令DATA 其格式為 標(biāo)號(hào)DATA數(shù)據(jù)或表達(dá)式 其中的標(biāo)號(hào)為字符名稱,其后無(wú)冒號(hào),DATA偽指令的功能與EQU偽指令的功能相似。例如: AA EQU R1 ;AA賦值后當(dāng)作R1使用 CC DAT
9、A 30H ;CC賦值后為8位數(shù)30H MOV CC, AA ;R1的值賦給30H單元 MOV A, #CC +l ;立即數(shù)31H賦給累加器A,下一頁(yè),返回,上一頁(yè),4.1 匯編語(yǔ)言的語(yǔ)句結(jié)構(gòu),7.匯編結(jié)束偽指令END 其格式為 標(biāo)號(hào):END mm 其中,mm是程序起始地址,標(biāo)號(hào)和mm不是必需的。END偽指令是一個(gè)結(jié)束標(biāo)志,用來(lái)指示匯編語(yǔ)言源程序的結(jié)束,進(jìn)行機(jī)器匯編時(shí)到此為止,其后的語(yǔ)句將不被匯編成機(jī)器碼。因此,在一個(gè)源程序中只允許出現(xiàn)一個(gè)END語(yǔ)句,它必須放在整個(gè)程序的最后。,返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),4. 2. 1匯編語(yǔ)言程序設(shè)計(jì)的基本方法 當(dāng)給定一個(gè)題目進(jìn)行程序設(shè)計(jì)時(shí),一般
10、應(yīng)按以下幾個(gè)步驟進(jìn)行:分析題目、確定算法、設(shè)計(jì)程序結(jié)構(gòu)、編寫程序、上機(jī)調(diào)試。 匯編語(yǔ)言程序設(shè)計(jì)的一般步驟如下。,下一頁(yè),返回,4.2 匯編語(yǔ)言程序設(shè)計(jì),1.分析問(wèn)題,明確任務(wù) 分析問(wèn)題是整個(gè)程度設(shè)計(jì)工作的基點(diǎn)。分析問(wèn)題就是明確題目的任務(wù),弄清所給定的原始數(shù)據(jù)和應(yīng)得到的結(jié)果,以及對(duì)運(yùn)算精度和速度的要求等。 2.建立數(shù)學(xué)模型,確定算法 建立數(shù)學(xué)模型,確定算法就是將解決工程問(wèn)題轉(zhuǎn)換為數(shù)學(xué)求解的方法。由于實(shí)際工程問(wèn)題是較復(fù)雜的,因此算法往往不是唯一的。不同方法在占用存儲(chǔ)單元數(shù)、計(jì)算精度、編程工作量等方面是有所差別的,這就需要進(jìn)行比較和選擇。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),3.繪制程序
11、流程圖,設(shè)計(jì)程序結(jié)構(gòu) 程序流程框圖是解題步驟及其算法進(jìn)一步具體化的重要環(huán)節(jié),它是設(shè)計(jì)程序的重要依據(jù),能比較清楚、形象地表達(dá)程序運(yùn)行的過(guò)程,并且直觀、清晰地體現(xiàn)了程序的設(shè)計(jì)思路,可使人迅速抓住程序的基本線索。如果算法比較簡(jiǎn)單,這一步可以省掉,可直接按算法編寫程序。如果比較復(fù)雜,則需要進(jìn)行程序結(jié)構(gòu)的設(shè)計(jì)。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),程序結(jié)構(gòu)的設(shè)計(jì)一般采用流程圖法。流程圖是用規(guī)定的圖形符號(hào)配合文字說(shuō)明來(lái)表示算法或處理問(wèn)題的步驟。它具有直觀、易懂的特點(diǎn),是程序結(jié)構(gòu)設(shè)計(jì)的有力工具。 傳統(tǒng)流程圖的符號(hào)及說(shuō)明,如表4 -3所列。 流程圖的繪制有一個(gè)由粗到細(xì)的過(guò)程,需要反復(fù)修改,求得完善
12、。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),4.編寫源程序 用匯編語(yǔ)言把流程圖所表明的步驟描述出來(lái),實(shí)現(xiàn)流程圖中每一框內(nèi)的要求,從而編制出一個(gè)有序的指令流,即匯編語(yǔ)言源程序。在編程之前,要規(guī)劃好寄存器和存儲(chǔ)器的使用。對(duì)于程序區(qū)、數(shù)據(jù)緩沖區(qū)、標(biāo)志單元等作好統(tǒng)一安排。所編寫的源程序要力求簡(jiǎn)單明了,層次清晰,運(yùn)行時(shí)間短,占用存儲(chǔ)單元少。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),5.匯編、調(diào)試 將匯編語(yǔ)言源程序匯編成目標(biāo)程序并調(diào)試,排除程序中的錯(cuò)誤。只有通過(guò)上機(jī)調(diào)試并得出正確結(jié)果的程序,才能認(rèn)為是正確的程序。 不論程序的結(jié)構(gòu)是簡(jiǎn)單還是復(fù)雜,一般都可分為4種基本形式:順序結(jié)構(gòu)、分支結(jié)構(gòu)、
13、循環(huán)結(jié)構(gòu)和子程序調(diào)用結(jié)構(gòu)。后面將對(duì)這些基本結(jié)構(gòu)分別闡述并舉例說(shuō)明。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),4. 2. 2順序程序設(shè)計(jì) 順序程序又稱簡(jiǎn)單程序,是指一種順序執(zhí)行的程序。在這種程序中,沒(méi)有分支、循環(huán)或子程序。順序結(jié)構(gòu)程序雖然比較簡(jiǎn)單,但也能完成一定的功能,是構(gòu)成復(fù)雜程序的基礎(chǔ)。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),4. 2. 3分支程序設(shè)計(jì) 分支結(jié)構(gòu)程序通常是利用執(zhí)行條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)的。即根據(jù)條件對(duì)程序的執(zhí)行情況進(jìn)行判斷,滿足條件則轉(zhuǎn)移,否則順序執(zhí)行。用于判斷分支轉(zhuǎn)移的指令有:JZ、 JNZ、JC、JNC、JB、JNB、 JBC、CJNE、 JMP等。另外,在
14、該類分支程序的設(shè)計(jì)中,要設(shè)置好判斷測(cè)試對(duì)象、程序轉(zhuǎn)移方向及轉(zhuǎn)移的標(biāo)志地址。在MCS-51指令系統(tǒng)中,把這些指令結(jié)合在一起使用,就可以完成多種條件判斷,如正負(fù)判斷、溢出判斷、大小判斷等。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),1.利用條件轉(zhuǎn)移指令實(shí)現(xiàn)程序分支 例4. 4比較兩個(gè)無(wú)符號(hào)數(shù)的大小 設(shè)從外部存儲(chǔ)單元ST1起存放兩個(gè)無(wú)符號(hào)8位二進(jìn)制數(shù),要求比較其大小,將大數(shù)存入ST1 +2單元中。 比較兩個(gè)無(wú)符號(hào)數(shù)大小的程序流程圖,如圖4-1所示。 程序如下。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),ORG 2000H START MOV DPTR, #5T1 ;設(shè)數(shù)據(jù)指針 MOVX
15、A, DPTR ;取第一個(gè)數(shù) MOV R2, A ;暫存于R2 INC DPTR MOVX A, DPTR ;取第二個(gè)數(shù) CLR C ;清進(jìn)位位 SUBB A,R2 ;兩數(shù)比較 JNC BIG2 XCH A,R2 ;第一數(shù)大,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),BIG1 INC DPTR MOVX DPTR,A ;存大數(shù) SJMP BIG2 MOVX A , DPTR ;第二數(shù)大,且恢復(fù)第二數(shù) SJMP BIG1 ST1 EQU 040H END,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),上面程序中,用減法指令SUBB來(lái)比較兩數(shù)的大小。由于這是一條帶借位的減法指令,所以在執(zhí)行
16、該指令前,先要把進(jìn)位位清零。用減法指令通過(guò)借位(CY)的值來(lái)判斷兩數(shù)的大小,是比較兩個(gè)無(wú)符號(hào)數(shù)大小的常用方法。用減法指令比較大小,會(huì)破壞累加器A的內(nèi)容,故在作減法前先要將A的內(nèi)容保存起來(lái)。執(zhí)行JNC指令后,形成了程序分支。執(zhí)行SJMP指令,則是實(shí)現(xiàn)分支程序的匯合。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),若是比較兩個(gè)帶符號(hào)數(shù)的大小,應(yīng)將兩數(shù)相減結(jié)果的正負(fù)和溢出標(biāo)志結(jié)合起來(lái)判斷。即 若X-Y為正,OV=0,則:XY OV=1,則:XY,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),例4. 5編制計(jì)算符號(hào)函數(shù)Y = SGN ( X)的程序。 設(shè)自變量X已存入標(biāo)號(hào)為DATA的單元,-128
17、X +127。符號(hào)函數(shù)Y存于FSGN單元中。 由于X是有符號(hào)數(shù),其正負(fù)由符號(hào)位來(lái)決定。判別符號(hào)位是0還是1,可利用JB或JNB指令。而判斷X是否等于0,則可利用累加器內(nèi)容的零標(biāo)志(軟標(biāo)志)。把這兩者結(jié)合起來(lái),就能完成本題的任務(wù)。 計(jì)算符號(hào)函數(shù)的程序流程圖,如圖4 -2所示。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),程序如下。 ORG 8000H START MOV DPTR, #DATA MOVX A, DPTR CLR C SUBB A, # 00H ;產(chǎn)生判別標(biāo)志 JZ SUL ;X=0,轉(zhuǎn)SUL JB ACC.7, NEG ;判X的符號(hào)位 MOV A,#01 H ;若X0,則A+
18、1,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),SUL MOV DPTR, #FSGN MOVX DPTR, A RET NEG MOV A, #0FFH ;若X 0,則A -1 SJMP SUL DATA DB X FSGN DB 0 END 此例的分支結(jié)構(gòu)與例4 -4有所不同。例4 -4程序只有一次判斷,是單分支結(jié)構(gòu);而此例有兩次判斷,為多分支結(jié)構(gòu)。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),2.利用比較轉(zhuǎn)移指令實(shí)現(xiàn)程序分支 3.利用JMP A + DPTR轉(zhuǎn)移指令實(shí)現(xiàn)多分支程序 MCS-51指令系統(tǒng)中有一條JMP A + DPTR轉(zhuǎn)移指令,利用它可以方便地編制多分支(也稱散轉(zhuǎn))
19、程序。下面介紹兩種方法。 (1)用轉(zhuǎn)移指令表實(shí)現(xiàn)散轉(zhuǎn) 在有些程序中,需要根據(jù)某一單元的值0、1、n相應(yīng)地轉(zhuǎn)向處理程序0、處理程序1、 、處理程序n。這時(shí)可以用轉(zhuǎn)移指令A(yù)JMP或LJMP組成一個(gè)轉(zhuǎn)移表。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),(2)用轉(zhuǎn)移地址表實(shí)現(xiàn)散轉(zhuǎn) 當(dāng)轉(zhuǎn)移范圍比較大時(shí),可使用轉(zhuǎn)移地址表方法。即每個(gè)處理程序的入口地址直接置于地址表內(nèi),用查表指令找到對(duì)應(yīng)的轉(zhuǎn)向地址,把它裝入DPTR中。將累加器清零后,用指令JMP A + DPTR直接轉(zhuǎn)向各個(gè)處理程序的入口。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),4. 2. 4循環(huán)程序設(shè)計(jì) 在應(yīng)用程序中,有時(shí)需要重復(fù)執(zhí)行某一段
20、程序。這時(shí)可以采用循環(huán)程序。循環(huán)程序是指當(dāng)某種條件滿足時(shí),能夠重復(fù)執(zhí)行某一段程序的程序結(jié)構(gòu)。采用循環(huán)程序,可以減少指令,節(jié)省存儲(chǔ)單元。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),循環(huán)程序一般由以下5部分組成。 (1)初始化部分:這是循環(huán)程序的準(zhǔn)備部分,如給循環(huán)次數(shù)計(jì)數(shù)器、地址指針和某些地址變量賦初值。 (2)處理部分:為反復(fù)執(zhí)行的程序段,這是循環(huán)程序的實(shí)體。 (3)修改部分:每執(zhí)行一次處理部分后,對(duì)地址指針作一次修改,使指針指向下一數(shù)據(jù)所在位置,為進(jìn)入下一輪處理作準(zhǔn)備。 (4)控制部分:根據(jù)循環(huán)次數(shù)計(jì)數(shù)器的值(即循環(huán)變量值)或其他循環(huán)條件,確定循環(huán)是否繼續(xù)進(jìn)行。若循環(huán)次數(shù)未達(dá)規(guī)定值或循環(huán)
21、條件滿足,繼續(xù)循環(huán);否則退出循環(huán)。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),(5)結(jié)束部分:分析、處理及存放程序執(zhí)行結(jié)果。 循環(huán)程序的結(jié)構(gòu)一般有兩種形式:先進(jìn)入處理部分,再控制循環(huán),如圖4 -3 ( a)所示。這種結(jié)構(gòu)至少執(zhí)行一次循環(huán)體。先控制循環(huán),后進(jìn)入處理部分,如圖4 -3 ( b)所示。這種結(jié)構(gòu)根據(jù)判斷結(jié)果,控制循環(huán)的執(zhí)行與否,有時(shí)可能不進(jìn)入循環(huán)體就退出了循環(huán)。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),循環(huán)程序不論是先處理后判斷,還是先判斷后處理,其關(guān)鍵是控制循環(huán)的次數(shù)。循環(huán)次數(shù)的控制方法根據(jù)實(shí)際情況而定:循環(huán)次數(shù)已知的,可以用計(jì)數(shù)器來(lái)控制;循環(huán)次數(shù)未知的,可以用某種條件
22、控制。 1.設(shè)置計(jì)數(shù)器實(shí)現(xiàn)已知循環(huán)次數(shù)的循環(huán)程序 2.利用條件轉(zhuǎn)移指令控制循環(huán)次數(shù)未知的循環(huán)程序,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),4. 2. 5子程序調(diào)用設(shè)計(jì) 在實(shí)際程序編制中,往往會(huì)多次進(jìn)行一些相同的計(jì)算或操作,如乘除運(yùn)算、數(shù)碼轉(zhuǎn)換、延時(shí)等。如果每次都重新編制一段程序,不僅麻煩,而且浪費(fèi)存儲(chǔ)空間。因此,對(duì)于一些常用的程序段,將它們從程序中獨(dú)立出來(lái),以便由其他程序隨時(shí)調(diào)用。這種獨(dú)立的有一定功能的程序稱為子程序。調(diào)用子程序的源程序稱為主程序。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),當(dāng)主程序在運(yùn)行中需要用子程序時(shí),只要執(zhí)行調(diào)用子程序的指令,使程序轉(zhuǎn)到子程序。子程序執(zhí)行完畢
23、,依靠最后一條指令返回指令自動(dòng)返回主程序,繼續(xù)其后的操作。在MCS-51指令系統(tǒng)中,提供了兩條調(diào)用子程序指令A(yù)CALL、LCALL以及一條返回主程序的指令RET。 一個(gè)子程序在其運(yùn)行過(guò)程中,還可以調(diào)用其他的子程序,這稱為子程序嵌套。MCS-51對(duì)子程序嵌套的層數(shù)沒(méi)有限制,但要為堆棧容量所允許。在編制子程序時(shí),要注意以下幾點(diǎn):,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),(1)子程序的首地址必須要用標(biāo)號(hào),此標(biāo)號(hào)也就是該子程序的名稱。子程序的最后一定要設(shè)置一條返回指令。 (2)盡可能編成浮動(dòng)地址程序,使用相對(duì)轉(zhuǎn)移而不用絕對(duì)轉(zhuǎn)移指令,以便于存放在存儲(chǔ)區(qū)的任意位置。 (3)為了便于使用,每個(gè)子程序
24、要有使用說(shuō)明。其內(nèi)容包括:子程序功能的簡(jiǎn)要說(shuō)明;入口條件,就是指運(yùn)行該子程序所需要的一些參數(shù)及其存放處;出口條件,這是指該子程序運(yùn)行完畢后給出的結(jié)果及其存放處;所占用的寄存器和存儲(chǔ)單元。,下一頁(yè),返回,上一頁(yè),4.2 匯編語(yǔ)言程序設(shè)計(jì),用戶在調(diào)用子程序時(shí),要注意以下兩個(gè)問(wèn)題: (1)子程序的入口條件和出口條件。主程序要根據(jù)子程序的入口條件提供所需的數(shù)據(jù),放到指定的寄存器或存儲(chǔ)單元;根據(jù)出口條件取得該子程序的運(yùn)行結(jié)果。 (2)現(xiàn)場(chǎng)保護(hù)。主程序在調(diào)用子程序時(shí),雖已對(duì)斷點(diǎn)作了保護(hù),但對(duì)子程序中所用到的寄存器的內(nèi)容未作保護(hù)。因此,對(duì)于在主程序和子程序中都要用到的那些寄存器,在轉(zhuǎn)子之前的主程序中或在子程
25、序的起始部分,應(yīng)將其內(nèi)容壓入堆棧,在子程序返回時(shí)再恢復(fù)。,返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,例4. 13 內(nèi)部數(shù)據(jù)寄存器從40 H開始連續(xù)存放有20個(gè)單字節(jié)數(shù),編程求它們的和(雙字節(jié)),并存入R4、R3中。 用R2作為計(jì)數(shù)器,用R0作為數(shù)據(jù)指針,采用寄存器間接尋址方式讀取各數(shù)。流程圖如圖4 -7示。程序如下。 START MOV R3,#0 ;設(shè)置初值 MOV R4,#0 MOV R2,#20 ;計(jì)數(shù)初值 MOV RO,40 H ;初始地址,下一頁(yè),返回,4.3 合程序設(shè)計(jì)舉例,LOOP MOV A,R3 ADD A, R0 ;計(jì)算和 MOV R3,A CLR A ;處理進(jìn)位 ADDC A
26、,R4 MOV R4,A INC R0 ;修改控制變量 DJNZ R2, LOOP ;判斷程序是否結(jié)束 END,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,以上程序使用R2作計(jì)數(shù)器,使用DJNZ指令來(lái)判斷程序是否結(jié)束。這種方法適用于循環(huán)次數(shù)已知的循環(huán)程序,這類循環(huán)程序稱為計(jì)數(shù)控制的循環(huán)程序。 例4. 14在單片機(jī)系統(tǒng)的信號(hào)中,常含有各種噪聲和干擾,影響了信號(hào)的真實(shí)性。因此,應(yīng)采取適當(dāng)?shù)姆椒ㄏ肼暫透蓴_,數(shù)字濾波就是一種有效的方法。下面以算術(shù)平均值法為例講述數(shù)字濾波的問(wèn)題。,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,片外RAM中從DATA處開始存放16個(gè)字節(jié)數(shù)據(jù)信號(hào),編程實(shí)現(xiàn)用算術(shù)平均值
27、法進(jìn)行濾波。結(jié)果存放在累加器A中。 FAVG MOV R7, #16 ;設(shè)置計(jì)數(shù)器初值 MOV DPTR, #DATA ;指向數(shù)據(jù)區(qū) MOV R5, #0 ;R6、R5用于存放累加結(jié)果 MOV R6,#0,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,LOOP1 MOVX A,DPTR ;取數(shù) ADD A,R5 ;加部分和低位 MOV R5,A MOV A,R6 ;取高位 ADDC A,#0 ;處理進(jìn)位 MOV R6,A INC DPTR DJ NZ R7,LOOP1 ;共加16個(gè)數(shù) MOV R7,#4 ;右移4次計(jì)數(shù),下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,LOOP2 CLR C ;清
28、進(jìn)位 MOV A,R6 ;先移高4位 RRC A MOV R6,A MOV A,R5 ;后移低4位 RRC A MOV R5,A DJNZ R7 , LOOP2 ;共移4次 RET 為確保精度,本程序采用雙字節(jié)數(shù)加法,采取右移4次的方法達(dá)到求平均數(shù)的目的。,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,例4. 15 P1口的低4位作為輸入線接4個(gè)微動(dòng)開關(guān)(開關(guān)合上接低電平),高4位作為輸出線接4個(gè)發(fā)光二極管,用其高電平點(diǎn)亮。即Pl. 3P1. 0的開關(guān)依次對(duì)應(yīng)Pl. 7P1. 4的發(fā)光二極管,哪個(gè)開關(guān)合上則其對(duì)應(yīng)的燈點(diǎn)亮發(fā)光二極管。電路請(qǐng)讀者自己畫出。程序如下。,下一頁(yè),返回,上一頁(yè),4.3
29、合程序設(shè)計(jì)舉例,ORG 0000H MAIN MOV Pl , #OFH ;置P1口低4位為輸入,滅4個(gè)燈 MOV A, P1 ;輸入開關(guān)狀態(tài) CPL A SWAP A ;移入高4位 MOV Pl , A ;點(diǎn)亮對(duì)應(yīng)的發(fā)光二極管 ACALL DELAY LJMP MAIN END,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,例4. 16編寫程序能夠模擬圖4 -8中電路的邏輯功能。 解:按圖進(jìn)行接線,圖中K0和K1用于設(shè)置被模擬電路中變量D和E,P1. 2作為電路的輸出端F,并用一個(gè)LED發(fā)光二極管來(lái)顯示輸出結(jié)果,可以改變K0、K1的狀態(tài),重新進(jìn)行上述模擬。程序如下。 ORG 0200H D
30、BIT 00H E BIT 01 H G BIT 02H,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,LOOP1 ORL Pl,#03 H ;準(zhǔn)備輸入P1. 0和P1. 1狀態(tài) MOV C,P1. 0 ;輸入K0狀態(tài) MOV D,C ;送入D MOV C,P1. 1 ;輸入K1狀態(tài) MOV E,C ;送入E ANL C,D ; MOV G,C ;送入G MOV C,E,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,ORL C,D ; ANL C, /G ; MOV P1.2,C ;輸出結(jié)果 SJMP LOOP1 ;準(zhǔn)備下次模擬 END 問(wèn)題擴(kuò)展:請(qǐng)分析本例題模擬的電路和程序,畫出邏輯關(guān)系真值表,看看它實(shí)現(xiàn)了什么樣的邏輯功能?,下一頁(yè),返回,上一頁(yè),4.3 合程序設(shè)計(jì)舉例,例4. 17編寫延時(shí)較長(zhǎng)時(shí)間的延時(shí)子程序,可以采用多重循環(huán)子程序來(lái)實(shí)現(xiàn)。 源程序 機(jī)器周期數(shù) DELAY MOV R7,#0FFH 1 LOOP1 MOV R6,#0FFH 1 LOO
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 住建部家裝修合同范例
- 供暖規(guī)劃編制合同范例
- 代銷售紅酒合同范例
- 攔污柵施工方案
- 出租場(chǎng)地合同范例
- 壓縮機(jī)用兆瓦級(jí)高速永磁電機(jī)損耗與熱特性研究
- 買賣小型合同范例
- 內(nèi)墻承包合同范例
- 《實(shí)施高質(zhì)量初級(jí)保健-重建衛(wèi)生保健基礎(chǔ)》(節(jié)選)英漢翻譯實(shí)踐報(bào)告
- 2025湖南省低空經(jīng)濟(jì)發(fā)展集團(tuán)有限公司招聘11人筆試參考題庫(kù)附帶答案詳解
- 七年級(jí)下冊(cè)道德與法治(2025年春)教材變化詳細(xì)解讀
- 2025山東能源集團(tuán)中級(jí)人才庫(kù)選拔高頻重點(diǎn)提升(共500題)附帶答案詳解
- 20S515 鋼筋混凝土及磚砌排水檢查井
- 關(guān)于建設(shè)吉林長(zhǎng)白山人參產(chǎn)業(yè)園的報(bào)告
- 6人小品《沒(méi)有學(xué)習(xí)的人不傷心》臺(tái)詞完整版
- 腰椎ODI評(píng)分完整版
- 美國(guó)簽證在職證明中英文模板.doc
- 患者約束技術(shù)評(píng)分標(biāo)準(zhǔn)
- MC7000其它檢驗(yàn)方法RCCM中文版法國(guó)民用核電標(biāo)準(zhǔn)
- 數(shù)學(xué)物理方法_6_拉普拉斯變換
評(píng)論
0/150
提交評(píng)論