第4章匯編語言程序設(shè)計_第1頁
第4章匯編語言程序設(shè)計_第2頁
第4章匯編語言程序設(shè)計_第3頁
第4章匯編語言程序設(shè)計_第4頁
第4章匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學1第4章(匯編語言程序設(shè)計2.匯編語言

英文助記符表示的指令稱為符號語言或匯編語言將匯編語言程序轉(zhuǎn)換成為二進制代碼表示的機器語言程序稱為匯編程序經(jīng)匯編程序“匯編(翻譯)”得到的機器語言程序稱為目標程序,原來的匯編語言程序稱為源程序。匯編語言特點:面向機器的語言,程序設(shè)計員須對MCS-51的硬件有相當深入的了解。助記符指令和機器指令一一對應(yīng),用匯編語言編寫的程序效率高,占用存儲空間小,運行速度快,用匯編語言能編寫出最優(yōu)化的程序。

第1頁/共61頁能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問存儲器及I/O接口電路。匯編語言和機器語言都脫離不開具體機器的硬件,均是面向“機器”的語言,缺乏通用性。3.高級語言不受具體機器的限制,使用了許多數(shù)學公式和數(shù)學計算上的習慣用語,非常擅長于科學計算。常用的如BASIC、FORTRAN以及C語言等。高級語言優(yōu)點:通用性強,直觀、易懂、易學,可讀性好。使用C語言(C51)、PL/M語言來進行MCS-51的應(yīng)用程序設(shè)計。

對于程序的空間和時間要求很高的場合,匯編語言仍是必不可缺的。

第2頁/共61頁C語言和匯編語言混合編程

在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯編語言不可使用匯編語言編程,是單片機程序設(shè)計的基本功之一4.1.2匯編語言語句的種類和格式兩種基本類型:指令語句和偽指令語句(1)指令語句已在第3章介紹每一條指令語句在匯編時都產(chǎn)生一個指令代碼——機器代碼(2)偽指令語句

是為匯編服務(wù)的。在匯編時沒有機器代碼與之對應(yīng)。

第3頁/共61頁MCS-51的匯編語言的四分段格式如下:標號字段:操作碼字段操作數(shù)字段;注釋字段規(guī)則:(1)標號字段和操作字碼段之間要有冒號“:”相隔;(2)操作碼字段和操作數(shù)字段間的分界符是空格;(3)雙操作數(shù)之間用逗號相隔;(4)操作數(shù)字段和注釋字段之間的分界符用分號“;”相隔。操作碼字段為必選項,其余各段為任選項。例4-1

下面是一段匯編語言程序的四分段書寫格式

第4頁/共61頁

標號字段操作碼字段操作數(shù)字段注釋字段

START:MOVA,#00H;0→AMOVR1,#10;10→R1 MOVR2,#00000011B;3→R2 LOOP:ADDA,R2;(A)+(R2)→A DJNZR1,LOOP;R1內(nèi)容減1不 為零,則循環(huán)

NOP HERE:SJMPHERE基本語法規(guī)則:1.標號字段是語句所在地址的標志符號

第5頁/共61頁(1)標號后邊必須跟以冒號“:”

(2)由1~8個ASCII字符組成(3)同一標號在一個程序中只能定義一次(4)不能使用匯編語言已經(jīng)定義的符號作為標號2.操作碼字段

是匯編語言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來生成機器代碼的。3.操作數(shù)字段

通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號隔開。(1)十六進制、二進制和十進制形式的操作數(shù)表示

第6頁/共61頁采用十六進制形式來表示,某些特殊場合才采用二進制或十進制的表示形式。十六進制,后綴“H”

。二進制,后綴“B”

。十進制,后綴“D”,也可省略。若十六進制的操作數(shù)以字符A~F中的某個開頭時,則需在它前面加一個“0”,以便在匯編時把它和字符A~F區(qū)別開來。(2)工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代號來表示,也可用其地址來表示。例如,累加器可用A(或Acc)表示。也可用0E0H來表示,0E0H為累加器A的地址。第7頁/共61頁(3)美元符號$的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:

JNBF0,$與如下指令是等價的:

HERE:JNBF0,HERE

再如:

HERE:SJMPHERE可寫為:

SJMP$第8頁/共61頁4.注釋字段必須以分號“;”開頭,換行書寫,但必須注意也要以分號“;”開頭。匯編時,注釋字段不會產(chǎn)生機器代碼。4.1.3偽指令在MCS-51匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過使用偽指令來實現(xiàn)的。也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目標程序(機器代碼)后,偽指令已無存在的必要,所以“偽”體現(xiàn)在匯編時,偽指令沒有相應(yīng)的機器代碼產(chǎn)生。第9頁/共61頁常用的偽指令:

1.ORG(ORiGin)匯編起始地址命令在匯編語言源程序的開始,通常都用一條ORG偽指令來實現(xiàn)規(guī)定程序的起始地址。如不用ORG規(guī)定,則匯編得到的目標程序?qū)?000H開始。例如:

ORG2000HSTART: MOVA,#00H ┋規(guī)定標號START代表地址為2000H開始。在一個源程序中,可多次使用ORG指令,來規(guī)定不同的程序段的起始地址。但是,地址必須由小到大排列,地址不能交叉、重疊。例如:

ORG2000H ┇

第10頁/共61頁2.END(ENDofassembly)匯編終止命令匯編語言源程序的結(jié)束標志,用于終止源程序的匯編工作。在整個源程序中只能有一條END命令,且位于程序的最后。3.DB(DefineByte)定義字節(jié)命令在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。

第11頁/共61頁

ORG2000HDB30H,40H,24,“C”,“B”匯編后: (2000H)=30H

(2001H)=40H

(2002H)=18H(10進制數(shù)24) (2003H)=43H(字符“C”的ASCII碼) (2004H)=42H(字符“B”的ASCII碼)DB功能是從指定單元開始定義(存儲)若干個字節(jié),10進制數(shù)自然轉(zhuǎn)換成16進制數(shù),字母按ASCII碼存儲。第12頁/共61頁4.DW(DefineWord)定義數(shù)據(jù)字命令從指定的地址開始,在程序存儲器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如:

ORG2000H DW1246H,7BH,10匯編后:(2000H)=12H ;第1個字(2001H)=46H(2002H)=00H ;第2個字(2003H)=7BH(2004H)=00H ;第3個字(2005H)=0AH(2005H)=0AH第13頁/共61頁5.EQU(EQUate)賦值命令用于給標號賦值。賦值以后,其標號值在整個程序有效。例如:TESTEQU2000H

表示標號TEST=2000H,在匯編時,凡是遇到標號TEST時,均以2000H來代替。

4.1.4匯編語言程序設(shè)計步驟(1)分析問題,確定算法(2)根據(jù)算法,畫出程序框圖(3)分配內(nèi)存工作區(qū)及有關(guān)端口地址(4)編寫程序養(yǎng)成在程序的適當位置上加上注釋的好習慣。第14頁/共61頁(5)上機調(diào)試編寫完畢的程序,必須“匯編”成機器代碼,才能調(diào)試和運行,調(diào)試與硬件有關(guān)程序還要借助于仿真開發(fā)工具并與硬件連接。4.2匯編語言源程序的匯編匯編語言源程序“翻譯”成機器代碼(指令代碼)的過程稱為“匯編”。匯編可分為手工匯編和機器匯編兩類:4.2.1手工匯編人工查表翻譯指令。但遇到的相對轉(zhuǎn)移指令的偏移量的計算,要根據(jù)轉(zhuǎn)移的目標地址計算偏移量,不但麻煩,且容易出錯。第15頁/共61頁4.2.2機器匯編用編輯軟件進行源程序的編輯。編輯完成后,生成一個ASCII碼文件,擴展名為“.ASM”。然后在微計算機上運行匯編程序,把匯編語言源程序翻譯成機器代碼。交叉匯編—匯編后的機器代碼是在另一臺計算機(這里是單片機)上運行。

MCS-51單片機的應(yīng)用程序的完成,應(yīng)經(jīng)過三個步驟;(1)在微計算機上,運行編輯程序進行源程序的輸入和編輯;(2)對源程序進行交叉匯編得到機器代碼;第16頁/共61頁(3)通過微計算機的串行口(或并行口)把機器代碼傳送到用戶樣機(或在線仿真器)進行程序的調(diào)試和運行。第(1)步,只需在微計算機上使用通用的編輯軟件即可完成。第(2)步的交叉匯編所用的匯編程序可在購買單片機的仿真開發(fā)工具時,由廠商提供。第(3)步驟的實現(xiàn)要借助于單片機仿真開發(fā)工具進行。第17頁/共61頁4.3匯編語言實用程序設(shè)計

4.3.1匯編語言程序的基本結(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)移指令,無條件分支,有條件分支。有條件分支又分為:單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。

3.循環(huán)結(jié)構(gòu)

4.子程序

5.中服務(wù)子程序第18頁/共61頁4.3.2子程序的設(shè)計一、子程序設(shè)計原則和應(yīng)注意的問題

一種能完成某一特定任務(wù)的程序段。其資源要為所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨立性和通用性,在編寫子程序時應(yīng)注意以下問題:

1.子程序的第一條指令的地址稱為子程序的入口地址。該指令前必須有標號。

2.主程序調(diào)用子程序兩條子程序調(diào)用指令:

(1)絕對調(diào)用指令:ACALLaddr11

第19頁/共61頁(2)長調(diào)用指令:LCALLaddr163.注意設(shè)置堆棧指針和現(xiàn)場保護4.最后一條指令必須是RET指令5.子程序可以嵌套,即子程序可以調(diào)用子程序6.在子程序調(diào)用時,還要注意參數(shù)傳遞的問題二、子程序的基本結(jié)構(gòu)

MAIN:┇ ;MAIN為主程序或調(diào)用程序標號┇

LCALLSUB;調(diào)用子程序SUB ┇┇

第20頁/共61頁

SUB:PUSHPSW ;現(xiàn)場保護

PUSHACC ;

子程序處理程序段

POPACC ;現(xiàn)場恢復(fù)

POPPSW ;

RET ;最后一條指令必須為RET例4-3

單字節(jié)有符號數(shù)的加減法子程序(自己閱讀)本例中參數(shù)傳遞是通過累加器A完成的,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送到A中,子程序?qū)中的有符號數(shù)求補后存于A中,主程序再將結(jié)果放回原來的單元。例4-44位BCD碼的減法程序(自己閱讀)

第21頁/共61頁主程序通過地址寄存器R0和R1將參加運算的BCD碼的地址傳遞給子程序,子程序則通過累加器將差傳遞給主程序。4.3.3查表程序設(shè)計

數(shù)據(jù)補償、修正、計算、轉(zhuǎn)換等各種功能,具有程序簡單、執(zhí)行速度快等優(yōu)點。查表就是根據(jù)自變量x,在表格中尋找y,使y=f(x)。執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖/PSEN。在MCS-51的指令系統(tǒng)中,給用戶提供了兩條極為有用的查表指令: ⑴MOVCA,@A+DPTR ⑵MOVCA,@A+PC指令“MOVCA,@A+DPTR”完成把A中的內(nèi)容作為一個無符號數(shù)與DPTR中的內(nèi)容相加,第22頁/共61頁

所得結(jié)果為某一程序存儲單元的地址,然后把該地址單元中的內(nèi)容送到累加器A中。指令“MOVCA,@A+PC”以PC作為基址寄存器,PC的內(nèi)容和A的內(nèi)容作為無符號數(shù),相加后所得的數(shù)作為某一程序存儲器單元的地址,根據(jù)地址取出程序存儲器相應(yīng)單元中的內(nèi)容送到累加器A中。指令執(zhí)行完,PC的內(nèi)容不發(fā)生變化,仍指向查表指令的下一條指令。優(yōu)點在于預(yù)處理較少且不影響其它特殊功能寄存器的值,所以不必保護其它特殊功能寄存器的原先值。缺點在于該表格只能存放在這條指令的地址X3X2X1X0以下的00~FFH之中。表格所在的程序空間受到了限制。第23頁/共61頁例4-5

子程序的功能為:根據(jù)累加器A中的數(shù)x(0~9之間)查x的平方表y,根據(jù)x的值查出相應(yīng)的平方y(tǒng)。x和y均為單字節(jié)數(shù)。地址子程序

Y3Y2Y1Y0ADDA,#01HY3Y2Y1Y0+2MOVCA,@A+PC Y3Y2Y1Y0+3RETY3Y2Y1Y0+4DB00H,01H,04H,09H,10H DB19H,24H,31H,40H,51H第1條指令A(yù)DDA,#01H的作用是加上偏移量,可以根據(jù)A的內(nèi)容查出X對應(yīng)的平方。第24頁/共61頁

MOVCA,@+DPTR這條指令的應(yīng)用范圍較為廣泛,一般情況下,大多使用該指令,使用該指令時不必計算偏移量,使用該指令的優(yōu)點是表格可以設(shè)在64K程序存儲器空間內(nèi)的任何地方,而不像MOVCA,@A+PC那樣只設(shè)在PC下面的256個單元中,使用較方便。

上面的程序可改成如下形式:第25頁/共61頁

PUSHDPH ;保存DPH PUSHDPL ;保存DPL MOVDPTR,#TAB1 MOVCA,@A+DPTR POPDPL ;恢復(fù)DPL POPDPH ;恢復(fù)DPH RETTAB1:DB00H,01H,04H,09H,10H DB19H,24H,31H,40H,51H例4-6

在一個以MCS-51為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由A/D轉(zhuǎn)換為10位二進制數(shù)。根據(jù)測得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個表,表中放溫度值y,

第26頁/共61頁x為電壓值數(shù)據(jù)。設(shè)測得的電壓值x放入R2R3中,根據(jù)電壓值x,查找對應(yīng)的溫度值y,仍放入R2R3中。本例的x和y均為雙字節(jié)無符號數(shù)。程序如下:

LTB2:MOVDPTR,#TAB2MOVA,R3CLRCRLCAMOVR3,AXCHA,R2RLCAXCHR2,AADD A,DPL;(R2R3)+(DPTR) ;→(DPTR)第27頁/共61頁

MOVDPL,A MOVA,DPH ADDCA,R2 MOVDPH,A CLRA MOVCA,@A+DPTR;查第一字節(jié)

MOVR2,A;第一字節(jié)存入R2中

CLRA INCDPTR MOVCA,@A+DPTR;查第二字節(jié)

MOVR3,A;第二字節(jié)存入R3中

RETTAB2:DW……

;溫度值表第28頁/共61頁例4-7

設(shè)有一個巡回檢測報警裝置,需對16路輸入進行檢測,每路有一最大允許值,為雙字節(jié)數(shù)。運行時,需根據(jù)測量的路數(shù),找出每路的最大允許值??摧斎胫凳欠翊笥谧畲笤试S值,如大于就報警。根據(jù)上述要求,編一個查表程序。取路數(shù)為x(0x15),y為最大允許值,放在表格中。設(shè)進入查表程序前,路數(shù)x已放于R2中,查表后最大值y放于R3R4中。本例中的x為單字節(jié)數(shù),y為雙字節(jié)數(shù)。查表程序如下:

TB3: MOVA,R2 ADDA,R2 ;(R2)*2→(A) MOVR3,A ;保存指針

ADDA,#6 ;加偏移量第29頁/共61頁

MOVCA,@A+PC ;查第一字節(jié)

XCHA,R3 ADDA,#3 MOVCA,@A+PC ;查第二字節(jié)

MOVR4,A RET TAB3: DW1520,3721,42645,7580;最大值 ;表

DW3483,32657,883,9943DW10000,40511,6758,8931DW4468,5871,13284,27808第30頁/共61頁表格長度不能超過256個字節(jié),且表格只能存放于MOVCA,@A+PC指令以下的256個單元中。4.3.4關(guān)鍵字查找程序設(shè)計順序檢索和對分檢索一、順序檢索

從第1項開始逐項順序查找,判斷所取數(shù)據(jù)是否與關(guān)鍵字相等。例4-8

從50個字節(jié)的無序表中查找一個關(guān)鍵字××”H。

ORG1000H MOV30H,#××H;關(guān)鍵字××H送30H單元

MOVR1,#50 ;查找次數(shù)送R1 MOVA,#14 ;修正值送A

第31頁/共61頁

MOVDPTR,#TAB4;表首地址送DPTRLOOP:PUSHACC MOVCA,@A+PC ;查表結(jié)果送A CJNEA,40H,LOOP1;(40H)不等于關(guān)鍵 字則轉(zhuǎn)LOOP1 MOVR2,DPH ;已查到關(guān)鍵字,把該字;的地址送R2,R3 MOVR3,DPL;DONE:RETLOOP1:POPACC ;修正值彈出

INCA ;A+1→A INCDPTR ;修改數(shù)據(jù)指針DPTR DJNZR1,LOOP;R1≠0,未查完,繼續(xù)查找

第32頁/共61頁

MOVR2,#00H ;R1=0,清“0”R2和`R3 MOVR3,#00H ;表中50個數(shù)已查完

AJMP DONE ;從子程序返回TAB4:DB…,…,…

;50個無序數(shù)據(jù)表二、對分檢索前提:檢索的數(shù)據(jù)表已經(jīng)排好序,如何進行數(shù)據(jù)的排序,將在本節(jié)稍后介紹。方法:取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進行比較,如相等,則查找到;如果所取的數(shù)大于關(guān)鍵字,則下次對分檢索的范圍是從數(shù)據(jù)區(qū)起點到本次取數(shù)。如果取數(shù)小于關(guān)鍵字,則下次對分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點到數(shù)據(jù)區(qū)終點。依此類推,逐漸縮小檢索范圍,減少次數(shù),大大提高了查找速度。第33頁/共61頁4.3.5數(shù)據(jù)極值查找程序設(shè)計在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。進行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。例4-9

片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存首地址,R2中存放字節(jié)數(shù),程序框圖如圖4-1所示。程序如下:

MOVR2,n ;n為要比較的數(shù)據(jù)字節(jié)數(shù)

MOVA,R0 ;存首地址指針

MOVR1,A DECR2 ;

MOVA,@R1第34頁/共61頁第35頁/共61頁LOOP: MOVR3,A DECR1 CLRC SUBBA,@R1 ;兩個數(shù)比較

JNCLOOP1 ;C=0,A中的數(shù)大,跳LOOP1 MOVA,@R1 ;C=1,則大數(shù)送A SJMPLOOP2LOOP1:MOVA,R3LOOP2:DJNZR2,LOOP ;是否比較結(jié)束?

MOV@R0,A ;存最大數(shù)

RET第36頁/共61頁4.3.6數(shù)據(jù)排序程序設(shè)計升序排,降序排。僅介紹無符號數(shù)據(jù)升序排。冒泡法:相鄰數(shù)互換的排序方法,類似水中氣泡上浮。排序時從前向后進行相鄰兩個數(shù)的比較,次序與要求的順序不符時,就將兩個數(shù)互換;順序符合要求不互換。假設(shè)有7個原始數(shù)據(jù)的排列順序為:6、4、1、2、5、7、3。第一次冒泡的過程是: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;逆序,互換第37頁/共61頁

4、1、2、5、6、7、3;正序,不互換

4、1、2、5、6、3、7

;逆序,互換,第一次冒 泡結(jié)束如此進行,各次冒泡的結(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對于n個數(shù),理論上應(yīng)進行(n-1)次冒泡,有時不到(n-1)次就已完成排序。第38頁/共61頁如何判定排序是否已完成,看各次冒泡中是否有互換發(fā)生,如果有數(shù)據(jù)互換,則排序還沒完成。在程序設(shè)計中,常使用設(shè)置互換標志的方法,該標志的狀態(tài)表示在一次冒泡中是否有互換進行。例4-10一批單字節(jié)無符號數(shù),以R0為首地址指針,R2中為字節(jié)數(shù),將這批數(shù)進行升序排列。程序框圖如圖4-2所示。SORT: MOVA,R0 ;

MOVR1, A MOVA,R2 ;字節(jié)數(shù)送入R5 MOVR5, A CLRF0 ;互換標志位F0清零

DECR5 ;

MOVA,@R1 ;

第39頁/共61頁第40頁/共61頁LOOP: MOVR3, A ;

INCR1 ;

CLRC ;

MOVA,@R1 ;比較大小

SUBBA,R3 ;

JNCLOOP1 ;

SETBF0 ;互換標志位F0置1 MOVA,R3; ;

XCHA,@R1 ;兩個數(shù)互換

DECR1 ;

XCHA,@R1 ;

INCR1第41頁/共61頁LOOP1: MOVA,@R1 DJNZR5,LOOP JBF0,SORT RET4.3.7分支轉(zhuǎn)移程序設(shè)計特點是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令有分為無條件轉(zhuǎn)移和有條件轉(zhuǎn)移,因此分支程序也可分為無條件分支轉(zhuǎn)移程序和有條件分支轉(zhuǎn)移程序。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為單分支轉(zhuǎn)移結(jié)構(gòu)和多分支轉(zhuǎn)移結(jié)構(gòu)。一、分支轉(zhuǎn)移結(jié)構(gòu)

1.單分支轉(zhuǎn)移結(jié)構(gòu)

第42頁/共61頁僅有兩個出口,兩者選一。例4-11

求單字節(jié)有符號數(shù)的二進制補碼參考程序:CMPT: JNBAcc.7,RETURN;(A)>0,不需轉(zhuǎn)換

MOVC,Acc.7 ;符號位保存

CPLA ;(A)求反,加1 ADDA,#1 ;

第43頁/共61頁

MOVAcc.7,C ;符號位存A的最高位RETURN: RET此外,單分支選擇結(jié)構(gòu)還有如圖4-4、圖4-5等所示的幾種形式:

第44頁/共61頁第45頁/共61頁2.多分支轉(zhuǎn)移結(jié)構(gòu)

程序的判別部分有兩個以上的出口流向。常見的兩種形式。如圖4-6和圖4-7。

第46頁/共61頁指令系統(tǒng)提供了非常有用的兩種多分支選擇指令:

間接轉(zhuǎn)移指令:JMP@A+DPTR;比較轉(zhuǎn)移指令:CJNEA,direct,rel;

CJNEA,#data,rel;

CJNERn,#data,rel;

CJNE@Ri,#data,rel;最簡單的分支轉(zhuǎn)移程序的設(shè)計,一般常采用逐次比較法,就是把所有不同的情況一個一個的進行比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。這種方法的主要缺點是程序太長,有n種可能的情況,就需有n個判斷和轉(zhuǎn)移。例4-12求符號函數(shù)的值。

第47頁/共61頁程序框圖如圖4-6所示。

程序略。

第48頁/共61頁在實際的應(yīng)用中,經(jīng)常遇到的圖4-7結(jié)構(gòu)形式的分支轉(zhuǎn)移程序的設(shè)計。第49頁/共61頁需根據(jù)某一單元的內(nèi)容是0,1,……,n,來分別轉(zhuǎn)向處理程序0,處理程序1,……處理程序n。一個典型的例子就是當單片機系統(tǒng)中的鍵盤按下時,就會得到一個鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。對于這種情況,可用直接轉(zhuǎn)移指令(LJMP或AJMP指令)組成一個轉(zhuǎn)移表,然后把該單元的內(nèi)容讀入累加器A,轉(zhuǎn)移表首地址放入DPTR中,再利用間接轉(zhuǎn)移指令實現(xiàn)分支轉(zhuǎn)移。

例4-12

根據(jù)寄存器R2的內(nèi)容,轉(zhuǎn)向各個處理程序PRGX(X=0~n)。 (R2)=0,轉(zhuǎn)PRG0

(R2)=1,轉(zhuǎn)PRG1 ┇

(R2)=n,轉(zhuǎn)PRGn第50頁/共61頁4.3.8循環(huán)程序設(shè)計

特點是程序中含有可以反復(fù)執(zhí)行的程序段,該程序段通常稱為循環(huán)體。例如求100個數(shù)的累加和,則沒有必要連續(xù)安排100條加法指令,可以只用一條加法指令并使其循環(huán)執(zhí)行100次。(1)可大大縮短程序長度(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)前的的準備工作。例如,循環(huán)控制計數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預(yù)置初值等。

第51頁/共61頁2.循環(huán)處理循環(huán)程序結(jié)構(gòu)的核心部分,完成實際的處理工作,是需反復(fù)循環(huán)執(zhí)行的部分,故又稱循環(huán)體。這部分程序的內(nèi)容,取決于實際處理問題的本身。

3.循環(huán)控制在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結(jié)束條件,就結(jié)束循環(huán)程序的執(zhí)行。循環(huán)結(jié)束控制方法分為循環(huán)計數(shù)控制法和條件控制法

4.循環(huán)結(jié)束這部分是對循環(huán)程序執(zhí)行的結(jié)果進行分析、處理和存放。

二、循環(huán)結(jié)構(gòu)的控制

第52頁/共61頁圖4-8是計數(shù)循環(huán)控制結(jié)構(gòu),圖4-9是條件控制結(jié)構(gòu)。

第53頁/共61頁1.計數(shù)循環(huán)結(jié)構(gòu)計數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為減“1”

計數(shù)器,計數(shù)器減到“0”時,結(jié)束循環(huán)。計數(shù)器的初值是在初始化時設(shè)定。MCS-51的指令系統(tǒng)提供了功能極強的循環(huán)控制指令:

DJNZRn,rel;工作寄存器作控制計數(shù)器

DJNZdirect,rel;以直接尋址單元作控制計數(shù)器

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論