匯編語(yǔ)言程序設(shè)計(jì)(57).ppt_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)(57).ppt_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)(57).ppt_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)(57).ppt_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)(57).ppt_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章 MCS-51匯編語(yǔ)言程序設(shè)計(jì),匯編語(yǔ)言是面向機(jī)器硬件的語(yǔ)言,要求程序設(shè)計(jì)者對(duì)MCS-51單片機(jī)具有很好的“軟、硬結(jié)合”的功底。 介紹程序設(shè)計(jì)的基本知識(shí)及如何使用匯編語(yǔ)言來(lái)進(jìn)行基本的程序設(shè)計(jì)。 4.1 匯編語(yǔ)言程序設(shè)計(jì)概述 4.1.1 機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言 用于程序設(shè)計(jì)的語(yǔ)言基本上分為3種:機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言。 1.機(jī)器語(yǔ)言 二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡(jiǎn)稱(chēng)為機(jī)器語(yǔ)言 不易懂,難記憶,易出錯(cuò)。,2匯編語(yǔ)言 英文助記符表示的指令稱(chēng)為符號(hào)語(yǔ)言或匯編語(yǔ)言 將匯編語(yǔ)言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語(yǔ)言程序稱(chēng)為匯編程序 經(jīng)匯編程序“匯編(翻譯)”得到的機(jī)器語(yǔ)言程序稱(chēng)為目標(biāo)程序,原來(lái)的匯編語(yǔ)言程序稱(chēng)為源程序。 匯編語(yǔ)言特點(diǎn): 面向機(jī)器的語(yǔ)言,程序設(shè)計(jì)員須對(duì)MCS-51的硬件有相當(dāng)深入的了解。 助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語(yǔ)言編寫(xiě)的程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,用匯編語(yǔ)言能編寫(xiě)出最優(yōu)化的程序。,能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪(fǎng)問(wèn)存儲(chǔ)器及I/O接口電路。 匯編語(yǔ)言和機(jī)器語(yǔ)言都脫離不開(kāi)具體機(jī)器的硬件,均是面向“機(jī)器”的語(yǔ)言,缺乏通用性。 3高級(jí)語(yǔ)言 不受具體機(jī)器的限制,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語(yǔ),非常擅長(zhǎng)于科學(xué)計(jì)算。常用的如BASIC、FORTRAN以及C語(yǔ)言等。 高級(jí)語(yǔ)言?xún)?yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。 使用C語(yǔ)言(C51)、PL/M語(yǔ)言來(lái)進(jìn)行MCS-51的應(yīng)用程序設(shè)計(jì)。 對(duì)于程序的空間和時(shí)間要求很高的場(chǎng)合,匯編語(yǔ)言仍是必不可缺的。,C語(yǔ)言和匯編語(yǔ)言混合編程 在很多需要直接控制硬件的應(yīng)用場(chǎng)合,則更是非用匯編語(yǔ)言不可 使用匯編語(yǔ)言編程,是單片機(jī)程序設(shè)計(jì)的基本功之一 4.1.2 匯編語(yǔ)言語(yǔ)句的種類(lèi)和格式 兩種基本類(lèi)型:指令語(yǔ)句和偽指令語(yǔ)句 (1)指令語(yǔ)句 已在第3章介紹 每一條指令語(yǔ)句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼機(jī)器代碼 (2)偽指令語(yǔ)句 是為匯編服務(wù)的。在匯編時(shí)沒(méi)有機(jī)器代碼與之對(duì)應(yīng)。,MCS-51的匯編語(yǔ)言的四分段格式如下: 標(biāo)號(hào)字段 : 操作碼字段 操作數(shù)字段 ; 注釋字段 規(guī)則: (1)標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào)“:”相隔; (2)操作碼字段和操作數(shù)字段間的分界符是空格; (3)雙操作數(shù)之間用逗號(hào)相隔; (4)操作數(shù)字段和注釋字段之間的分界符用分號(hào)“;”相隔。 操作碼字段為必選項(xiàng),其余各段為任選項(xiàng)。 例4-1 下面是一段匯編語(yǔ)言程序的四分段書(shū)寫(xiě)格式,標(biāo)號(hào)字段 操作碼字段 操作數(shù)字段 注釋字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#00000011B ;3R2 LOOP:ADD A,R2 ;(A)+(R2)A DJNZ R1,LOOP;R1內(nèi)容減1不 為零,則循環(huán) NOP HERE: SJMP HERE 基本語(yǔ)法規(guī)則: 1標(biāo)號(hào)字段 是語(yǔ)句所在地址的標(biāo)志符號(hào),(1)標(biāo)號(hào)后邊必須跟以冒號(hào)“:” (2)由18個(gè)ASCII字符組成 (3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次 (4)不能使用匯編語(yǔ)言已經(jīng)定義的符號(hào)作為標(biāo)號(hào) 2操作碼字段 是匯編語(yǔ)言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來(lái)生成機(jī)器代碼的。 3操作數(shù)字段 通常有單操作數(shù)、雙操作數(shù)和無(wú)操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開(kāi)。 (1)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示,采用十六進(jìn)制形式來(lái)表示 ,某些特殊場(chǎng)合才采用二進(jìn)制或十進(jìn)制的表示形式 。 十六進(jìn)制,后綴“H” 。 二進(jìn)制,后綴“B” 。 十進(jìn)制,后綴“D”,也可省略。 若十六進(jìn)制的操作數(shù)以字符AF中的某個(gè)開(kāi)頭時(shí),則需在它前面加一個(gè) “0”,以便在匯編時(shí)把它和字符AF區(qū)別開(kāi)來(lái)。 (2)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代號(hào)來(lái)表示,也可用其地址來(lái)表示。 例如,累加器可用A(或Acc)表示。也可用0E0H來(lái)表示,0E0H為累加器A的地址。,(3)美元符號(hào)$的使用 用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令: JNB F0, $ 與如下指令是等價(jià)的: HERE:JNB F0,HERE 再如: HERE:SJMP HERE 可寫(xiě)為: SJMP $,4注釋字段 必須以分號(hào)“;”開(kāi)頭,換行書(shū)寫(xiě),但必須注意也要以分號(hào)“;”開(kāi)頭。 匯編時(shí),注釋字段不會(huì)產(chǎn)生機(jī)器代碼。 4.1.3 偽指令 在MCS-51 匯編語(yǔ)言源程序中應(yīng)有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過(guò)使用偽指令來(lái)實(shí)現(xiàn)的。 也稱(chēng)為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過(guò)匯編得到目標(biāo)程序(機(jī)器代碼)后,偽指令已無(wú)存在的必要,所以“偽”體現(xiàn)在匯編時(shí),偽指令沒(méi)有相應(yīng)的機(jī)器代碼產(chǎn)生。,常用的偽指令: 1.ORG(ORiGin)匯編起始地址命令 在匯編語(yǔ)言源程序的開(kāi)始,通常都用一條ORG偽指令來(lái)實(shí)現(xiàn)規(guī)定程序的起始地址。如不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開(kāi)始。例如: ORG 2000H START: MOV A,#00H 規(guī)定標(biāo)號(hào)START代表地址為2000H開(kāi)始。 在一個(gè)源程序中,可多次使用ORG指令,來(lái)規(guī)定不同的程序段的起始地址。但是,地址必須由小到大排列,地址不能交叉、重疊。例如: ORG 2000H ,2. END(END of assembly)匯編終止命令 匯編語(yǔ)言源程序的結(jié)束標(biāo)志,用于終止源程序的 匯編工作。在整個(gè)源程序中只能有一條END命令,且位于程序的最后。 3DB(Define Byte)定義字節(jié)命令 在程序存儲(chǔ)器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。,ORG 2000H DB 30H,40H,24,“C”,“B” 匯編后: (2000H)=30H (2001H)=40H (2002H)=18H(10進(jìn)制數(shù)24) (2003H)=43H(字符“C”的ASCII碼) (2004H)=42H(字符“B”的ASCII碼) DB功能是從指定單元開(kāi)始定義(存儲(chǔ))若干個(gè)字節(jié),10進(jìn)制數(shù)自然轉(zhuǎn)換成16進(jìn)制數(shù),字母按ASCII碼存儲(chǔ)。,4DW(Define Word)定義數(shù)據(jù)字命令 從指定的地址開(kāi)始,在程序存儲(chǔ)器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如: ORG 2000H DW 1246H,7BH,10 匯編后: (2000H)=12H ;第1個(gè)字 (2001H)=46H (2002H)=00H ;第2個(gè)字 (2003H)=7BH (2004H)=00H ;第3個(gè)字(2005H)=0AH (2005H)=0AH,5EQU(EQUate)賦值命令 用于給標(biāo)號(hào)賦值。賦值以后,其標(biāo)號(hào)值在整個(gè)程序有效。例如: TEST EQU 2000H 表示標(biāo)號(hào)TEST=2000H,在匯編時(shí),凡是遇到標(biāo)號(hào)TEST時(shí),均以2000H來(lái)代替。 4.1.4 匯編語(yǔ)言程序設(shè)計(jì)步驟 (1)分析問(wèn)題,確定算法 (2)根據(jù)算法,畫(huà)出程序框圖 (3)分配內(nèi)存工作區(qū)及有關(guān)端口地址 (4)編寫(xiě)程序 養(yǎng)成在程序的適當(dāng)位置上加上注釋的好習(xí)慣。,(5)上機(jī)調(diào)試 編寫(xiě)完畢的程序,必須“匯編”成機(jī)器代碼,才能調(diào)試和運(yùn)行,調(diào)試與硬件有關(guān)程序還要借助于仿真開(kāi)發(fā)工具并與硬件連接。 4.2 匯編語(yǔ)言源程序的匯編 匯編語(yǔ)言源程序 “翻譯”成機(jī)器代碼(指令代碼)的過(guò)程稱(chēng)為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類(lèi): 4.2.1 手工匯編 人工查表翻譯指令。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,不但麻煩,且容易出錯(cuò)。,4.2.2 機(jī)器匯編 用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ASCII碼文件,擴(kuò)展名為“.ASM”。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語(yǔ)言源程序翻譯成機(jī)器代碼。 交叉匯編匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)(這里是單片機(jī))上運(yùn)行。 MCS-51單片機(jī)的應(yīng)用程序的完成,應(yīng)經(jīng)過(guò)三個(gè)步驟; (1)在微計(jì)算機(jī)上,運(yùn)行編輯程序進(jìn)行源程序的輸入 和編輯; (2)對(duì)源程序進(jìn)行交叉匯編得到機(jī)器代碼;,(3)通過(guò)微計(jì)算機(jī)的串行口(或并行口)把機(jī)器代碼傳送到用戶(hù)樣機(jī)(或在線(xiàn)仿真器)進(jìn)行程序的調(diào)試和運(yùn)行。 第(1)步,只需在微計(jì)算機(jī)上使用通用的編輯軟件即可完成。 第(2)步的交叉匯編所用的匯編程序可在購(gòu)買(mǎi)單片機(jī)的仿真開(kāi)發(fā)工具時(shí),由廠商提供。 第(3)步驟的實(shí)現(xiàn)要借助于單片機(jī)仿真開(kāi)發(fā)工具進(jìn)行。,4.3 匯編語(yǔ)言實(shí)用程序設(shè)計(jì) 4.3.1 匯編語(yǔ)言程序的基本結(jié)構(gòu)形式 常采用以下幾種基本結(jié)構(gòu): 順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上廣泛使用的子程序和中斷服務(wù)子程序。 1順序結(jié)構(gòu) 2分支結(jié)構(gòu) 程序中含有轉(zhuǎn)移指令, 無(wú)條件分支,有條件分支。 有條件分支又分為:?jiǎn)畏种ЫY(jié)構(gòu)和多分支結(jié)構(gòu)。 3循環(huán)結(jié)構(gòu) 4子程序 5中服務(wù)子程序,4.3.2 子程序的設(shè)計(jì) 一、子程序設(shè)計(jì)原則和應(yīng)注意的問(wèn)題 一種能完成某一特定任務(wù)的程序段。其資源要為所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨(dú)立性和通用性,在編寫(xiě)子程序時(shí)應(yīng)注意以下問(wèn)題: 1子程序的第一條指令的地址稱(chēng)為子程序的入口地址。該指令前必須有標(biāo)號(hào)。 2主程序調(diào)用子程序 兩條子程序調(diào)用指令: (1)絕對(duì)調(diào)用指令:ACALL addr11,(2)長(zhǎng)調(diào)用指令:LCALL addr16 3注意設(shè)置堆棧指針和現(xiàn)場(chǎng)保護(hù) 4最后一條指令必須是RET指令 5子程序可以嵌套,即子程序可以調(diào)用子程序 6在子程序調(diào)用時(shí),還要注意參數(shù)傳遞的問(wèn)題 二、 子程序的基本結(jié)構(gòu) MAIN: ;MAIN為主程序或調(diào)用程序標(biāo)號(hào) LCALL SUB ;調(diào)用子程序SUB ,SUB:PUSH PSW ;現(xiàn)場(chǎng)保護(hù) PUSH ACC ; 子程序處理程序段 POP ACC ;現(xiàn)場(chǎng)恢復(fù) POP PSW ; RET ;最后一條指令必須為RET 例4-3 單字節(jié)有符號(hào)數(shù)的加減法子程序(自己閱讀) 本例中參數(shù)傳遞是通過(guò)累加器A完成的,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送到A中,子程序?qū)中的有符號(hào)數(shù)求補(bǔ)后存于A中,主程序再將結(jié)果放回原來(lái)的單元。 例4-4 4位BCD碼的減法程序(自己閱讀),主程序通過(guò)地址寄存器R0和R1將參加運(yùn)算的BCD碼的地址傳遞給子程序,子程序則通過(guò)累加器將差傳遞給主程序。 4.3.3 查表程序設(shè)計(jì) 數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡(jiǎn)單、執(zhí)行速度快等優(yōu)點(diǎn)。 查表就是根據(jù)自變量x,在表格中尋找y,使y=f(x)。 執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖/PSEN。在MCS-51的指令系統(tǒng)中,給用戶(hù)提供了兩條極為有用的查表指令: MOVC A,A+DPTR MOVC A,A+PC 指令“MOVC A,A+DPTR”完成把A中的內(nèi)容作為一個(gè)無(wú)符號(hào)數(shù)與DPTR中的內(nèi)容相加,,所得結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元中的內(nèi)容送到累加器A中。 指令“MOVC A,A+PC”以PC作為基址寄存器,PC的內(nèi)容和A的內(nèi)容作為無(wú)符號(hào)數(shù),相加后所得的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)地址取出程序存儲(chǔ)器相應(yīng)單元中的內(nèi)容送到累加器A中。 指令執(zhí)行完,PC的內(nèi)容不發(fā)生變化,仍指向查表指令的下一條指令。優(yōu)點(diǎn)在于預(yù)處理較少且不影響其它特殊功能寄存器的值,所以不必保護(hù)其它特殊功能寄存器的原先值。缺點(diǎn)在于該表格只能存放在這條指令的地址X3X2X1X0以下的00FFH之中。表格所在的程序空間受到了限制。,例4-5 子程序的功能為:根據(jù)累加器A中的數(shù)x(09之間)查x的平方表y,根據(jù)x的值查出相應(yīng)的平方y(tǒng)。x和y均為單字節(jié)數(shù)。 地 址 子程序 Y3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 第1條指令 ADD A,#01H 的作用是加上偏移量,可以根據(jù)A的內(nèi)容查出X對(duì)應(yīng)的平方。,MOVC A,+DPTR 這條指令的應(yīng)用范圍較為廣泛,一般情況下,大多使用該指令,使用該指令時(shí)不必計(jì)算偏移量,使用該指令的優(yōu)點(diǎn)是表格可以設(shè)在64K程序存儲(chǔ)器空間內(nèi)的任何地方,而不像 MOVC A,A+PC那樣只設(shè)在PC下面的256個(gè)單元中,使用較方便。 上面的程序可改成如下形式:,PUSH DPH ;保存DPH PUSH DPL ;保存DPL MOV DPTR,#TAB1 MOVC A,A+DPTR POP DPL ;恢復(fù)DPL POP DPH ;恢復(fù)DPH RET TAB1: DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 例4-6 在一個(gè)以MCS-51為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線(xiàn)性關(guān)系,傳感器輸出的電壓已由A/D轉(zhuǎn)換為10位二進(jìn)制數(shù)。根據(jù)測(cè)得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中放溫度值y,,x為電壓值數(shù)據(jù)。設(shè)測(cè)得的電壓值x放入R2R3中,根據(jù)電壓值x,查找對(duì)應(yīng)的溫度值y,仍放入R2R3中。本例的x和y均為雙字節(jié)無(wú)符號(hào)數(shù)。程序如下: LTB2:MOV DPTR,#TAB2 MOV A,R3 CLR C RLC A MOV R3,A XCH A,R2 RLC A XCH R2,A ADD A,DPL ;(R2R3)+(DPTR) ; (DPTR),MOV DPL,A MOV A,DPH ADDC A,R2 MOV DPH,A CLR A MOVC A,A+DPTR ;查第一字節(jié) MOV R2,A ;第一字節(jié)存入R2中 CLR A INC DPTR MOVC A,A+DPTR ;查第二字節(jié) MOV R3,A ;第二字節(jié)存入R3中 RET TAB2:DW ;溫度值表,例4-7 設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)16路輸入進(jìn)行檢測(cè),每路有一最大允許值,為雙字節(jié)數(shù)。運(yùn)行時(shí),需根據(jù)測(cè)量的路數(shù),找出每路的最大允許值??摧斎胫凳欠翊笥谧畲笤试S值,如大于就報(bào)警。根據(jù)上述要求,編一個(gè)查表程序。 取路數(shù)為x(0x15),y為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,路數(shù)x已放于R2中,查表后最大值y放于R3R4中。本例中的x為單字節(jié)數(shù),y為雙字節(jié)數(shù)。查表程序如下: TB3: MOV A,R2 ADD A,R2 ;(R2)*2(A) MOV R3,A ;保存指針 ADD A,#6 ;加偏移量,MOVC A,A+PC ;查第一字節(jié) XCH A,R3 ADD A,#3 MOVC A,A+PC ;查第二字節(jié) MOV R4,A RET TAB3: DW 1520,3721,42645,7580 ;最大值 ;表 DW 3483,32657,883,9943 DW 10000,40511,6758,8931 DW 4468,5871,13284,27808,表格長(zhǎng)度不能超過(guò)256個(gè)字節(jié),且表格只能存放于MOVC A,A+PC指令以下的256個(gè)單元中。 4.3.4 關(guān)鍵字查找程序設(shè)計(jì) 順序檢索和對(duì)分檢索 一、順序檢索 從第1項(xiàng)開(kāi)始逐項(xiàng)順序查找,判斷所取數(shù)據(jù)是否與關(guān)鍵字相等。 例4-8 從50個(gè)字節(jié)的無(wú)序表中查找一個(gè)關(guān)鍵字”H。 ORG 1000H MOV 30H,#H;關(guān)鍵字H送30H單元 MOV R1,#50 ;查找次數(shù)送R1 MOV A,#14 ;修正值送A,MOV DPTR,#TAB4 ;表首地址送DPTR LOOP:PUSH ACC MOVC A, A+PC ;查表結(jié)果送A CJNE A,40H,LOOP1;(40H)不等于關(guān)鍵 字則轉(zhuǎn)LOOP1 MOV R2,DPH ;已查到關(guān)鍵字,把該字 ;的地址送R2,R3 MOV R3,DPL ; DONE:RET LOOP1:POP ACC ;修正值彈出 INC A ;A+1A INC DPTR ;修改數(shù)據(jù)指針DPTR DJNZ R1,LOOP ;R10,未查完,繼續(xù)查找,MOV R2,#00H ;R1=0,清“0” R2 和R3 MOV R3,#00H ;表中50個(gè)數(shù)已查完 AJMP DONE ;從子程序返回 TAB4:DB , ;50個(gè)無(wú)序數(shù)據(jù)表 二、對(duì)分檢索 前提:檢索的數(shù)據(jù)表已經(jīng)排好序,如何進(jìn)行數(shù)據(jù)的排序,將在本節(jié)稍后介紹。 方法:取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進(jìn)行比較,如相等,則查找到;如果所取的數(shù)大于關(guān)鍵字,則下次對(duì)分檢索的范圍是從數(shù)據(jù)區(qū)起點(diǎn)到本次取數(shù)。如果取數(shù)小于關(guān)鍵字,則下次對(duì)分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點(diǎn)到數(shù)據(jù)區(qū)終點(diǎn)。依此類(lèi)推,逐漸縮小檢索范圍,減少次數(shù),大大提高了查找速度。,4.3.5 數(shù)據(jù)極值查找程序設(shè)計(jì) 在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。 進(jìn)行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。 例4-9 片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存首地址,R2中存放字節(jié)數(shù),程序框圖如圖4-1所示。 程序如下: MOV R2,n ;n為要比較的數(shù)據(jù)字節(jié)數(shù) MOV A,R0 ;存首地址指針 MOV R1,A DEC R2 ; MOV A,R1,LOOP: MOV R3, A DEC R1 CLR C SUBB A,R1 ;兩個(gè)數(shù)比較 JNC LOOP1 ;C=0,A中的數(shù)大,跳LOOP1 MOV A,R1 ;C=1,則大數(shù)送A SJMP LOOP2 LOOP1:MOV A,R3 LOOP2:DJNZ R2, LOOP ;是否比較結(jié)束? MOV R0, A ;存最大數(shù) RET,4.3.6 數(shù)據(jù)排序程序設(shè)計(jì) 升序排,降序排。僅介紹無(wú)符號(hào)數(shù)據(jù)升序排。 冒泡法:相鄰數(shù)互換的排序方法,類(lèi)似水中氣泡上浮 。排序時(shí)從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較,次序與要求的順序不符時(shí),就將兩個(gè)數(shù)互換;順序符合要求不互換。 假設(shè)有7個(gè)原始數(shù)據(jù)的排列順序?yàn)椋?、4、1、2、5、7、3。第一次冒泡的過(guò)程是: 6、4、1、2、5、7、3 ;原始數(shù)據(jù)的排列 4、6、1、2、5、7、3 ;逆序,互換 4、1、6、2、5、7、3 ;逆序,互換 4、1、2、6、5、7、3 ;逆序,互換 4、1、2、5、6、7、3 ;逆序,互換,4、1、2、5、6、7、3 ;正序,不互換 4、1、2、5、6、3、7 ;逆序,互換,第一次冒 泡結(jié)束 如此進(jìn)行,各次冒泡的結(jié)果如下: 第1次冒泡結(jié)果:4、1、2、5、6、3、7 第2次冒泡結(jié)果:1、2、4、5、3、6、7 第3次冒泡結(jié)果:1、2、4、3、5、6、7 第4次冒泡結(jié)果:1、2、3、4、5、6、7 ;已完成排序 第5次冒泡結(jié)果:1、2、3、4、5、6、7 第6次冒泡結(jié)果:1、2、3、4、5、6、7 對(duì)于n個(gè)數(shù),理論上應(yīng)進(jìn)行(n-1)次冒泡,有時(shí)不到(n-1)次就已完成排序 。,如何判定排序是否已完成,看各次冒泡中是否有互換發(fā)生,如果有數(shù)據(jù)互換,則排序還沒(méi)完成。 在程序設(shè)計(jì)中,常使用設(shè)置互換標(biāo)志的方法,該標(biāo)志的狀態(tài)表示在一次冒泡中是否有互換進(jìn)行。 例4-10 一批單字節(jié)無(wú)符號(hào)數(shù),以R0為首地址指針,R2中為字節(jié)數(shù),將這批數(shù)進(jìn)行升序排列。程序框圖如圖4-2所示。 SORT: MOV A,R0 ; MOV R1, A MOV A,R2 ;字節(jié)數(shù)送入R5 MOV R5, A CLR F0 ;互換標(biāo)志位F0清零 DEC R5 ; MOV A,R1 ;,LOOP: MOV R3, A ; INC R1 ; CLR C ; MOV A,R1 ;比較大小 SUBB A,R3 ; JNC LOOP1 ; SETB F0 ;互換標(biāo)志位F0置1 MOV A,R3; ; XCH A,R1 ;兩個(gè)數(shù)互換 DEC R1 ; XCH A,R1 ; INC R1,LOOP1: MOV A,R1 DJNZ R5,LOOP JB F0,SORT RET 4.3.7 分支轉(zhuǎn)移程序設(shè)計(jì) 特點(diǎn)是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令有分為無(wú)條件轉(zhuǎn)移和有條件轉(zhuǎn)移,因此分支程序也可分為無(wú)條件分支轉(zhuǎn)移程序和有條件分支轉(zhuǎn)移程序。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類(lèi)型來(lái)分,又分為單分支轉(zhuǎn)移結(jié)構(gòu)和多分支轉(zhuǎn)移結(jié)構(gòu)。 一、分支轉(zhuǎn)移結(jié)構(gòu) 1單分支轉(zhuǎn)移結(jié)構(gòu),僅有兩個(gè)出口,兩者選一。 例4-11 求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼 參考程序: CMPT: JNB Acc.7,RETURN;(A)0,不需轉(zhuǎn)換 MOV C,Acc.7 ;符號(hào)位保存 CPL A ;(A)求反,加1 ADD A,#1 ;,MOV Acc.7,C ;符號(hào)位存A的最高位RETURN: RET 此外,單分支選擇結(jié)構(gòu)還有如圖4-4、圖4-5等所示的幾種形式:,2多分支轉(zhuǎn)移結(jié)構(gòu) 程序的判別部分有兩個(gè)以上的出口流向。 常見(jiàn)的兩種形式。如圖4-6和圖4-7。,指令系統(tǒng)提供了非常有用的兩種多分支選擇指令: 間接轉(zhuǎn)移指令: JMP A+DPTR; 比較轉(zhuǎn)移指令: CJNE A,direct,rel; CJNE A,#data,rel; CJNE Rn,#data,rel; CJNE Ri,#data,rel; 最簡(jiǎn)單的分支轉(zhuǎn)移程序的設(shè)計(jì),一般常采用逐次比較法,就是把所有不同的情況一個(gè)一個(gè)的進(jìn)行比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。這種方法的主要缺點(diǎn)是程序太長(zhǎng),有n種可能的情況,就需有n個(gè)判斷和轉(zhuǎn)移。 例4-12 求符號(hào)函數(shù)的值。,程序框圖如圖4-6所示。 程序略。,在實(shí)際的應(yīng)用中,經(jīng)常遇到的圖4-7結(jié)構(gòu)形式的分支轉(zhuǎn)移程序的設(shè)計(jì) 。,需根據(jù)某一單元的內(nèi)容是0,1,n,來(lái)分別轉(zhuǎn)向處理程序0,處理程序1,處理程序n。一個(gè)典型的例子就是當(dāng)單片機(jī)系統(tǒng)中的鍵盤(pán)按下時(shí),就會(huì)得到一個(gè)鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。對(duì)于這種情況,可用直接轉(zhuǎn)移指令(LJMP或AJMP指令)組成一個(gè)轉(zhuǎn)移表,然后把該單元的內(nèi)容讀入累加器A,轉(zhuǎn)移表首地址放入DPTR中,再利用間接轉(zhuǎn)移指令實(shí)現(xiàn)分支轉(zhuǎn)移。 例4-12 根據(jù)寄存器R2的內(nèi)容,轉(zhuǎn)向各個(gè)處理程序PRGX(X=0n)。 (R2)=0,轉(zhuǎn)PRG0 (R2)=1,轉(zhuǎn)PRG1 (R2)=n, 轉(zhuǎn)PRGn,4.3.8 循環(huán)程序設(shè)計(jì) 特點(diǎn)是程序中含有可以反復(fù)執(zhí)行的程序段,該程序段通常稱(chēng)為循環(huán)體。例如求100個(gè)數(shù)的累加和,則沒(méi)有必要連續(xù)安排100條加法指令,可以只用一條加法指令并使其循環(huán)執(zhí)行100次。 (1)可大大縮短程序長(zhǎng)度(2)使程序所占的內(nèi)存單元數(shù)量少(3)使程序結(jié)構(gòu)緊湊和可讀性變好。 一、循環(huán)程序的結(jié)構(gòu) 循環(huán)結(jié)構(gòu)程序主要由以下四部分組成。 1循環(huán)初始化 循環(huán)初始化程序段用于完成循環(huán)前的的準(zhǔn)備工作。例如,循環(huán)控制計(jì)數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預(yù)置初值等。,2循環(huán)處理 循環(huán)程序結(jié)構(gòu)的核心部分,完成實(shí)際的處理工作,是需反復(fù)循環(huán)執(zhí)行的部分,故又稱(chēng)循環(huán)體。這部分程序的內(nèi)容,取決于實(shí)際處理問(wèn)題的本身。 3循環(huán)控制 在重復(fù)執(zhí)行循環(huán)體的過(guò)程中,不斷修改循環(huán)控制變量,直到符合結(jié)束條件,就結(jié)束循環(huán)程序的執(zhí)行。循環(huán)結(jié)束控制方法分為循環(huán)計(jì)數(shù)控制法和條件控制法 4循環(huán)結(jié)束 這部分是對(duì)循環(huán)程序執(zhí)行的結(jié)果進(jìn)行分析、處理和存放。 二、循環(huán)結(jié)構(gòu)的控制,圖4-8是計(jì)數(shù)循環(huán)控制結(jié)構(gòu),圖4-9是條件控制結(jié)構(gòu)。,1計(jì)數(shù)循環(huán)結(jié)構(gòu) 計(jì)數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計(jì)數(shù)器的值來(lái)決定循環(huán)次數(shù),一般為減“1” 計(jì)數(shù)器,計(jì)數(shù)器減到“0”時(shí),結(jié)束循環(huán)。計(jì)數(shù)器的初值是在初始化時(shí)設(shè)定。 MCS-51的指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指令: DJNZ Rn,rel;工作寄存器作控制計(jì)數(shù)器 DJNZ direct,rel;以直接尋址單元作控制計(jì)數(shù) 器。 例如,計(jì)算n個(gè)數(shù)據(jù)的和。 程序框圖見(jiàn)圖4-10 。 計(jì)數(shù)控制方法只有在循環(huán)次數(shù)已知的情況下才適用。對(duì)循環(huán)次數(shù)未知的問(wèn)題,不能用循環(huán)次數(shù)來(lái)控制。往往需要根據(jù)某種條件

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論