




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2匯編語言匯編語言 英文助記符表示的指令稱為英文助記符表示的指令稱為符號(hào)語言符號(hào)語言或或匯編語言匯編語言將匯編語言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語將匯編語言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語言程序稱為言程序稱為匯編程序匯編程序經(jīng)匯編程序經(jīng)匯編程序“匯編(翻譯)匯編(翻譯)”得到的機(jī)器語言程序得到的機(jī)器語言程序稱為稱為目標(biāo)程序目標(biāo)程序,原來的匯編語言程序稱為,原來的匯編語言程序稱為源程源程序序。匯編語言特點(diǎn)匯編語言特點(diǎn):(1)(1)面向機(jī)器的語言,程序設(shè)計(jì)員須對(duì)面向機(jī)器的語言,程序設(shè)計(jì)員須對(duì)MCS-51MCS-51的硬的硬件有相當(dāng)深入的了解。件有相當(dāng)深入的了解。(2)(2)助記符指令和機(jī)器指令
2、一一對(duì)應(yīng),用匯編語言助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語言編寫的編寫的程序效率高程序效率高,占用,占用存儲(chǔ)空間小存儲(chǔ)空間小,運(yùn)行,運(yùn)行速速度快度快,用匯編語言能編寫出最優(yōu)化的程序。,用匯編語言能編寫出最優(yōu)化的程序。 第1頁/共61頁能直接管理和控制硬件設(shè)備(功能部件),它能處能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問存儲(chǔ)器及理中斷,也能直接訪問存儲(chǔ)器及I/OI/O接口電路。接口電路。匯編語言和機(jī)器語言都脫離不開具體機(jī)器的硬件,匯編語言和機(jī)器語言都脫離不開具體機(jī)器的硬件,均是面向均是面向“機(jī)器機(jī)器”的語言,缺乏通用性。的語言,缺乏通用性。3 3高級(jí)語言高級(jí)語言 不受具體機(jī)
3、器的限制不受具體機(jī)器的限制, ,使用了許多數(shù)學(xué)公式和數(shù)學(xué)使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語,計(jì)算上的習(xí)慣用語,非常擅長(zhǎng)于科學(xué)計(jì)算。非常擅長(zhǎng)于科學(xué)計(jì)算。常用常用的如的如BASICBASIC、FORTRANFORTRAN以及以及C C語言等。語言等。 高級(jí)語言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),高級(jí)語言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好??勺x性好。使用使用C C語言(語言(C51C51)、)、PL/MPL/M語言來進(jìn)行語言來進(jìn)行MCS-51MCS-51的應(yīng)的應(yīng)用程序設(shè)計(jì)。用程序設(shè)計(jì)。 對(duì)于程序的對(duì)于程序的空間和時(shí)間空間和時(shí)間要求很高的場(chǎng)合,匯編語言要求很高的場(chǎng)合,匯編語言仍是必不可缺的
4、。仍是必不可缺的。 第2頁/共61頁C C語言和匯編語言混合編程語言和匯編語言混合編程 在很多需要直接控制硬件的應(yīng)用場(chǎng)合,則更是非用在很多需要直接控制硬件的應(yīng)用場(chǎng)合,則更是非用匯編語言不可匯編語言不可 使用匯編語言編程,是單片機(jī)程序設(shè)計(jì)的使用匯編語言編程,是單片機(jī)程序設(shè)計(jì)的基本功之基本功之一一4.1.2 4.1.2 匯編語言語句的種類和格式匯編語言語句的種類和格式兩種基本類型:指令語句和偽指令語句兩種基本類型:指令語句和偽指令語句(1 1)指令語句)指令語句已在第已在第3 3章介紹章介紹每一條指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼每一條指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼機(jī)器代碼機(jī)器代碼(2 2)偽
5、指令語句)偽指令語句 是為匯編服務(wù)的。在匯編時(shí)是為匯編服務(wù)的。在匯編時(shí)沒有機(jī)器代碼與之對(duì)應(yīng)。沒有機(jī)器代碼與之對(duì)應(yīng)。 第3頁/共61頁MCS-51MCS-51的匯編語言的的匯編語言的四分段格式四分段格式如下:如下: 標(biāo)號(hào)字段標(biāo)號(hào)字段 : 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 ; 注釋字段注釋字段規(guī)則:規(guī)則:(1 1)標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào))標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào)“:”相隔;相隔;(2 2)操作碼字段和操作數(shù)字段間的分界符是空格;)操作碼字段和操作數(shù)字段間的分界符是空格;(3 3)雙操作數(shù)之間用逗號(hào)相隔;)雙操作數(shù)之間用逗號(hào)相隔; (4 4)操作數(shù)字段和注釋字段之間的分界
6、符用分號(hào))操作數(shù)字段和注釋字段之間的分界符用分號(hào)“;”相相隔。隔。操作碼字段為必選項(xiàng),其余各段為任選項(xiàng)。操作碼字段為必選項(xiàng),其余各段為任選項(xiàng)。例例4-14-1 下面是一段匯編語言程序的四分段書寫格式下面是一段匯編語言程序的四分段書寫格式 第4頁/共61頁 標(biāo)號(hào)字段標(biāo)號(hào)字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段 START: MOV A,#00H ;0A M O V R 1 , # 1 0 ;10R1 MOV R2,#00000011B ;3R2 LOOP:ADD A,R2 ;(A)+(R2)A DJNZ R1,LOOP;R1內(nèi)容減1不 為零,則循環(huán) NOP HERE:
7、SJMP HERE基本語法規(guī)則:基本語法規(guī)則:1 1標(biāo)號(hào)字段標(biāo)號(hào)字段是語句所在地址的標(biāo)志符號(hào)是語句所在地址的標(biāo)志符號(hào) 第5頁/共61頁(1 1)標(biāo)號(hào)后邊必須跟以冒號(hào))標(biāo)號(hào)后邊必須跟以冒號(hào)“:” (2 2)由)由1 18 8個(gè)個(gè)ASCIIASCII字符組成字符組成(3 3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次 (4 4)不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào))不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào) 2 2操作碼字段操作碼字段 是匯編語言指令中唯一不能空缺的部分。匯編程序是匯編語言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來生成機(jī)器代碼的。就是根據(jù)這一字段來生
8、成機(jī)器代碼的。3 3操作數(shù)字段操作數(shù)字段 通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開。(1 1)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示示 第6頁/共61頁采用十六進(jìn)制形式來表示采用十六進(jìn)制形式來表示 ,某些特殊場(chǎng)合才采用,某些特殊場(chǎng)合才采用二進(jìn)制或十進(jìn)制的表示形式二進(jìn)制或十進(jìn)制的表示形式 。十六進(jìn)制,后綴十六進(jìn)制,后綴“H H” 。二進(jìn)制,后綴二進(jìn)制,后綴“B B” 。十進(jìn)制,后綴十進(jìn)制,后綴“D D”,也可省略也可省略。
9、若十六進(jìn)制的若十六進(jìn)制的操作數(shù)以字符操作數(shù)以字符A AF F中的某個(gè)開頭時(shí),中的某個(gè)開頭時(shí),則需在它則需在它前面加一個(gè)前面加一個(gè) “0 0”,以便在匯編時(shí)把它,以便在匯編時(shí)把它和字符和字符A AF F區(qū)別開來。區(qū)別開來。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代號(hào)來表示,采用工作寄存器和特殊功能寄存器的代號(hào)來表示,也可用其地址來表示。也可用其地址來表示。 例如,累加器可用例如,累加器可用A A(或(或AccAcc)表示。也可用)表示。也可用0E0H0E0H來表示,來表示,0E0H0E0H為累加器為累加器A A的地址。的地址。第
10、7頁/共61頁(3 3)美元符號(hào))美元符號(hào)$ $的使用的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:下指令: JNB F0JNB F0, $ $與如下指令是等價(jià)的:與如下指令是等價(jià)的:HEREHERE:JNB F0JNB F0,HEREHERE 再如:再如:HEREHERE:SJMP HERESJMP HERE可寫為:可寫為: SJMP $SJMP $第8頁/共61頁4 4注釋字段注釋字段 必須以分號(hào)必須以分號(hào)“;”開頭,換行書寫,但必須注意開頭,換行書寫,但必須注意也要以分號(hào)也要以分號(hào)“;”開頭。開頭。 匯編時(shí),注釋字段不會(huì)產(chǎn)生機(jī)器代碼
11、。匯編時(shí),注釋字段不會(huì)產(chǎn)生機(jī)器代碼。4.1.3 4.1.3 偽指令偽指令在在MCS-51 MCS-51 匯編語言源程序中應(yīng)有向匯編程序發(fā)出匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通的指示信息,告訴它如何完成匯編工作,這是通過使用偽指令來實(shí)現(xiàn)的。過使用偽指令來實(shí)現(xiàn)的。也稱為匯編程序控制命令。只有在匯編前的源程序也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目標(biāo)程序(機(jī)器代中才有偽指令。經(jīng)過匯編得到目標(biāo)程序(機(jī)器代碼)后,偽指令已無存在的必要,所以碼)后,偽指令已無存在的必要,所以“偽偽”體體現(xiàn)在匯編時(shí),現(xiàn)在匯編時(shí),偽指令沒有相應(yīng)的機(jī)器代碼
12、產(chǎn)生偽指令沒有相應(yīng)的機(jī)器代碼產(chǎn)生。第9頁/共61頁常用的偽指令常用的偽指令: 1.ORG1.ORG(ORiGinORiGin)匯編起始地址命令)匯編起始地址命令在匯編語言源程序的開始,通常都用一條在匯編語言源程序的開始,通常都用一條ORGORG偽指?jìng)沃噶顏韺?shí)現(xiàn)規(guī)定程序的起始地址。如不用令來實(shí)現(xiàn)規(guī)定程序的起始地址。如不用ORGORG規(guī)定,規(guī)定,則匯編得到的目標(biāo)程序?qū)膭t匯編得到的目標(biāo)程序?qū)?000H0000H開始。開始。例如: ORG 2000HORG 2000HSTARTSTART:MOV A,#00HMOV A,#00H規(guī)定標(biāo)號(hào)規(guī)定標(biāo)號(hào)STARTSTART代表地址為代表地址為2000H20
13、00H開始。開始。在一個(gè)源程序中,可多次使用在一個(gè)源程序中,可多次使用ORGORG指令,來規(guī)定不指令,來規(guī)定不同的程序段的起始地址。但是,同的程序段的起始地址。但是,地址必須由小到地址必須由小到大排列,地址不能交叉、重疊大排列,地址不能交叉、重疊。例如:。例如:ORG 2000HORG 2000H 第10頁/共61頁2. 2. END(END of assembly)END(END of assembly)匯編終止命令匯編終止命令 匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的的 匯編工作。在整個(gè)源程序中只能有一條匯編工作。在整個(gè)源程序中只能有一條ENDEN
14、D命命令,且位于程序的最后。令,且位于程序的最后。3 3DBDB(Define ByteDefine Byte)定義字節(jié)命令)定義字節(jié)命令在程序存儲(chǔ)器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。在程序存儲(chǔ)器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。 第11頁/共61頁 ORG 2000HORG 2000HDB 30HDB 30H,40H40H,2424,“C C”,“B B”匯編后:匯編后:(2000H2000H)=30H=30H(2001H2001H)=40H=40H(2002H2002H)=18H=18H(1010進(jìn)制數(shù)進(jìn)制數(shù)2424)(2003H2003H)=43H=43H(字符(字符“C C”的的ASCIIASCII碼
15、)碼)(2004H2004H)=42H=42H(字符(字符“B B”的的ASCIIASCII碼)碼)DBDB功能是從指定單元開始定義(存儲(chǔ))若干個(gè)字節(jié),功能是從指定單元開始定義(存儲(chǔ))若干個(gè)字節(jié),1010進(jìn)制數(shù)自然轉(zhuǎn)換成進(jìn)制數(shù)自然轉(zhuǎn)換成1616進(jìn)制數(shù),字母按進(jìn)制數(shù),字母按ASCIIASCII碼碼存儲(chǔ)。存儲(chǔ)。第12頁/共61頁4 4DWDW(Define WordDefine Word)定義數(shù)據(jù)字命令)定義數(shù)據(jù)字命令從指定的地址開始,在程序存儲(chǔ)器的連續(xù)單元中定從指定的地址開始,在程序存儲(chǔ)器的連續(xù)單元中定義義1616位的數(shù)據(jù)字。例如:位的數(shù)據(jù)字。例如:ORG 2000HORG 2000H DW 1
16、246H DW 1246H,7BH7BH,1010匯編后:匯編后:(2000H2000H)=12H=12H ;第;第1 1個(gè)字個(gè)字(2001H2001H)=46H =46H (2002H2002H)=00H=00H ;第;第2 2個(gè)字個(gè)字(2003H2003H)=7BH=7BH(2004H2004H)=00H=00H ;第;第3 3個(gè)字(個(gè)字(2005H2005H)=0AH=0AH(2005H2005H)=0AH =0AH 第13頁/共61頁5 5EQUEQU(EQUateEQUate)賦值命令)賦值命令 用于給標(biāo)號(hào)賦值。賦值以后,其標(biāo)號(hào)值在整個(gè)程用于給標(biāo)號(hào)賦值。賦值以后,其標(biāo)號(hào)值在整個(gè)程序有
17、效。例如:序有效。例如:TEST EQU 2000HTEST EQU 2000H 表示標(biāo)號(hào)表示標(biāo)號(hào)TEST=2000HTEST=2000H,在匯編時(shí),凡是遇到標(biāo)號(hào),在匯編時(shí),凡是遇到標(biāo)號(hào)TESTTEST時(shí),均以時(shí),均以2000H2000H來代替。來代替。 4.1.4 4.1.4 匯編語言程序設(shè)計(jì)步驟匯編語言程序設(shè)計(jì)步驟(1 1)分析問題,確定算法)分析問題,確定算法(2 2)根據(jù)算法,畫出程序框圖)根據(jù)算法,畫出程序框圖(3 3)分配內(nèi)存工作區(qū)及有關(guān)端口地址)分配內(nèi)存工作區(qū)及有關(guān)端口地址(4 4)編寫程序)編寫程序養(yǎng)成在程序的適當(dāng)位置上加上注釋的好習(xí)慣。養(yǎng)成在程序的適當(dāng)位置上加上注釋的好習(xí)慣。
18、第14頁/共61頁(5 5)上機(jī)調(diào)試)上機(jī)調(diào)試編寫完畢的程序,必須編寫完畢的程序,必須“匯編匯編”成機(jī)器代碼,才能成機(jī)器代碼,才能調(diào)試和運(yùn)行,調(diào)試與硬件有關(guān)程序還要借助于仿調(diào)試和運(yùn)行,調(diào)試與硬件有關(guān)程序還要借助于仿真開發(fā)工具并與硬件連接。真開發(fā)工具并與硬件連接。4.2 4.2 匯編語言源程序的匯編匯編語言源程序的匯編匯編語言源程序匯編語言源程序 “翻譯翻譯”成機(jī)器代碼(指令代碼)成機(jī)器代碼(指令代碼)的過程稱為的過程稱為“匯編匯編”。匯編可分為。匯編可分為手工匯編手工匯編和和機(jī)機(jī)器匯編器匯編兩類兩類: :4.2.1 4.2.1 手工匯編手工匯編人工查表翻譯指令人工查表翻譯指令。但遇到的相對(duì)轉(zhuǎn)移
19、指令的偏移。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,不但麻煩,且容易出錯(cuò)。不但麻煩,且容易出錯(cuò)。第15頁/共61頁4.2.2 4.2.2 機(jī)器匯編機(jī)器匯編用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)一個(gè)ASCIIASCII碼文件,擴(kuò)展名為碼文件,擴(kuò)展名為“.ASM.ASM”。然后在微。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語言源程序翻譯計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語言源程序翻譯成機(jī)器代碼。成機(jī)器代碼。交叉匯編交叉匯編匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)
20、(這里是單片機(jī))上運(yùn)行。(這里是單片機(jī))上運(yùn)行。 MCS-51MCS-51單片機(jī)的應(yīng)用程序的完成,應(yīng)經(jīng)過三個(gè)步驟;單片機(jī)的應(yīng)用程序的完成,應(yīng)經(jīng)過三個(gè)步驟;(1 1)在微計(jì)算機(jī)上,運(yùn)行編輯程序進(jìn)行源程序的)在微計(jì)算機(jī)上,運(yùn)行編輯程序進(jìn)行源程序的輸入輸入 和編輯;和編輯; (2 2)對(duì)源程序進(jìn)行交叉匯編得到機(jī)器代碼;)對(duì)源程序進(jìn)行交叉匯編得到機(jī)器代碼;第16頁/共61頁(3 3)通過微計(jì)算機(jī)的串行口(或并行口)把機(jī)器)通過微計(jì)算機(jī)的串行口(或并行口)把機(jī)器代碼傳送到代碼傳送到用戶樣機(jī)(或在線仿真器用戶樣機(jī)(或在線仿真器)進(jìn)行程序)進(jìn)行程序的調(diào)試和運(yùn)行。的調(diào)試和運(yùn)行。第(第(1 1)步,只需在微計(jì)算
21、機(jī)上使用通用的編輯軟)步,只需在微計(jì)算機(jī)上使用通用的編輯軟件即可完成。件即可完成。第(第(2 2)步的交叉匯編所用的匯編程序可在購買單)步的交叉匯編所用的匯編程序可在購買單片機(jī)的仿真開發(fā)工具時(shí),由廠商提供。片機(jī)的仿真開發(fā)工具時(shí),由廠商提供。第(第(3 3)步驟的實(shí)現(xiàn)要借助于單片機(jī)仿真開發(fā)工具)步驟的實(shí)現(xiàn)要借助于單片機(jī)仿真開發(fā)工具進(jìn)行。進(jìn)行。第17頁/共61頁4.3 4.3 匯編語言實(shí)用程序設(shè)計(jì)匯編語言實(shí)用程序設(shè)計(jì) 4.3.1 4.3.1 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式常采用以下幾種基本結(jié)構(gòu):常采用以下幾種基本結(jié)構(gòu): 順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上廣泛使用順序結(jié)構(gòu)、分
22、支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上廣泛使用的子程序和中斷服務(wù)子程序。的子程序和中斷服務(wù)子程序。 1 1順序結(jié)構(gòu)順序結(jié)構(gòu) 2 2分支結(jié)構(gòu)分支結(jié)構(gòu) 程序中含有轉(zhuǎn)移指令,程序中含有轉(zhuǎn)移指令, 無條件分支,有條件分支無條件分支,有條件分支。 有條件分支又分為:有條件分支又分為:?jiǎn)畏种畏种ЫY(jié)構(gòu)和結(jié)構(gòu)和多分支多分支結(jié)構(gòu)。結(jié)構(gòu)。 3 3循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu) 4 4子程序子程序 5 5中服務(wù)子程序中服務(wù)子程序第18頁/共61頁4.3.2 4.3.2 子程序的設(shè)計(jì)子程序的設(shè)計(jì)一、子程序設(shè)計(jì)原則和應(yīng)注意的問題一、子程序設(shè)計(jì)原則和應(yīng)注意的問題 一種能完成某一特定任務(wù)的程序段一種能完成某一特定任務(wù)的程序段。其資源要為。其資源要為
23、所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨(dú)立性和通用性,有獨(dú)立性和通用性,在編寫子程序時(shí)應(yīng)注意以下在編寫子程序時(shí)應(yīng)注意以下問題:?jiǎn)栴}: 1 1子程序的第一條指令的地址稱為子程序的入口子程序的第一條指令的地址稱為子程序的入口地址。該指令前地址。該指令前必須有標(biāo)號(hào)必須有標(biāo)號(hào)。 2 2主程序調(diào)用子程序主程序調(diào)用子程序 兩條子程序調(diào)用指令:兩條子程序調(diào)用指令: (1 1)絕對(duì)調(diào)用指令:)絕對(duì)調(diào)用指令:ACALL addr11ACALL addr11 第19頁/共61頁(2 2)長(zhǎng)調(diào)用指令:)長(zhǎng)調(diào)用指令:LCALL addr16LCALL addr163 3
24、注意設(shè)置堆棧指針和現(xiàn)場(chǎng)保護(hù)注意設(shè)置堆棧指針和現(xiàn)場(chǎng)保護(hù)4 4最后一條指令必須是最后一條指令必須是RETRET指令指令5 5子程序可以嵌套,即子程序可以調(diào)用子程序子程序可以嵌套,即子程序可以調(diào)用子程序6 6在子程序調(diào)用時(shí),還要注意參數(shù)傳遞的問題在子程序調(diào)用時(shí),還要注意參數(shù)傳遞的問題 二、二、 子程序的基本結(jié)構(gòu)子程序的基本結(jié)構(gòu) MAINMAIN: ;MAINMAIN為主程序或調(diào)用為主程序或調(diào)用程序標(biāo)號(hào)程序標(biāo)號(hào) LCALL SUB LCALL SUB ;調(diào)用子程序;調(diào)用子程序SUBSUB 第20頁/共61頁 SUBSUB:PUSH PSWPUSH PSW;現(xiàn)場(chǎng)保護(hù);現(xiàn)場(chǎng)保護(hù) PUSH ACCPUSH
25、ACC; 子程序處理程序段子程序處理程序段POP ACCPOP ACC ;現(xiàn)場(chǎng)恢復(fù);現(xiàn)場(chǎng)恢復(fù)POP PSWPOP PSW ; RETRET;最后一條指令必須為;最后一條指令必須為RETRET例例4-34-3 單字節(jié)有符號(hào)數(shù)的加減法子程序(自己閱讀)單字節(jié)有符號(hào)數(shù)的加減法子程序(自己閱讀) 本例中參數(shù)傳遞是通過累加器本例中參數(shù)傳遞是通過累加器A A完成的,主程完成的,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送到序?qū)⒈晦D(zhuǎn)換的數(shù)送到A A中,子程序?qū)⒅?,子程序?qū) A中的有符號(hào)中的有符號(hào)數(shù)求補(bǔ)后存于數(shù)求補(bǔ)后存于A A中,主程序再將結(jié)果放回原來的單中,主程序再將結(jié)果放回原來的單元。元。 例例4-44-4 4 4位位BCDB
26、CD碼的減法程序(自己閱讀)碼的減法程序(自己閱讀) 第21頁/共61頁主程序通過地址寄存器主程序通過地址寄存器R0R0和和R1R1將參加運(yùn)算的將參加運(yùn)算的BCDBCD碼碼的地址傳遞給子程序,子程序則通過累加器將差的地址傳遞給子程序,子程序則通過累加器將差傳遞給主程序。傳遞給主程序。4.3.3 4.3.3 查表程序設(shè)計(jì)查表程序設(shè)計(jì) 數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡(jiǎn)單、執(zhí)行速度快等優(yōu)點(diǎn)。序簡(jiǎn)單、執(zhí)行速度快等優(yōu)點(diǎn)。查表就是根據(jù)自變量查表就是根據(jù)自變量x,x,在表格中尋找在表格中尋找y,y,使使y=f(x)y=f(x)。執(zhí)行查表指令時(shí),發(fā)出
27、讀程序存儲(chǔ)器選通脈沖執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖/PSEN/PSEN。在。在MCS-51MCS-51的指令系統(tǒng)中,給用戶提供了的指令系統(tǒng)中,給用戶提供了兩條極為有用的查表指令:兩條極為有用的查表指令: MOVC AMOVC A,A+DPTRA+DPTR MOVC A MOVC A,A+PCA+PC指令指令“MOVC AMOVC A,A+DPTRA+DPTR”完成把完成把A A中的內(nèi)容作為中的內(nèi)容作為一個(gè)無符號(hào)數(shù)與一個(gè)無符號(hào)數(shù)與DPTRDPTR中的內(nèi)容相加,中的內(nèi)容相加,第22頁/共61頁 所得結(jié)果為某一程序存儲(chǔ)單元的地址,然所得結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元中的內(nèi)容
28、送到累加器后把該地址單元中的內(nèi)容送到累加器A A中。中。 指令指令“MOVC AMOVC A,A+PCA+PC”以以PCPC作為基址寄存作為基址寄存器,器,PCPC的內(nèi)容和的內(nèi)容和A A的內(nèi)容作為無符號(hào)數(shù),相加后的內(nèi)容作為無符號(hào)數(shù),相加后所得的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)所得的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)地址取出程序存儲(chǔ)器相應(yīng)單元中的內(nèi)容送到累加地址取出程序存儲(chǔ)器相應(yīng)單元中的內(nèi)容送到累加器器A A中。中。 指令執(zhí)行完指令執(zhí)行完,PC,PC的內(nèi)容不發(fā)生變化,仍指向的內(nèi)容不發(fā)生變化,仍指向查表指令的下一條指令。查表指令的下一條指令。優(yōu)點(diǎn)優(yōu)點(diǎn)在于預(yù)處理較少且在于預(yù)處理較少且不影響其它
29、特殊功能寄存器的值,所以不必保護(hù)不影響其它特殊功能寄存器的值,所以不必保護(hù)其它特殊功能寄存器的原先值。其它特殊功能寄存器的原先值。缺點(diǎn)缺點(diǎn)在于該表格在于該表格只能存放在這條指令的地址只能存放在這條指令的地址X3X2X1X0X3X2X1X0以下的以下的0000FFHFFH之中。表格之中。表格所在的程序空間受到了限制。所在的程序空間受到了限制。第23頁/共61頁例例4-54-5 子程序的功能為:根據(jù)累加器子程序的功能為:根據(jù)累加器A A中的數(shù)中的數(shù)x x(0 09 9之間)查之間)查x x的平方表的平方表y y,根據(jù),根據(jù)x x的值查出相的值查出相應(yīng)的平方應(yīng)的平方y(tǒng) y。x x和和y y均為單字節(jié)
30、數(shù)。均為單字節(jié)數(shù)。 地地 址址 子程序子程序Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+2 MOVC A,A+PCY3Y2Y1Y0+3 RETY3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H DB 19H,24H,31H,40H,51H第第1 1條指令條指令 ADD AADD A,#01H #01H 的作用是加上偏移量,的作用是加上偏移量
31、,可以根據(jù)可以根據(jù)A A的內(nèi)容查出的內(nèi)容查出X X對(duì)應(yīng)的平方。對(duì)應(yīng)的平方。第24頁/共61頁 MOVC AMOVC A,+DPTR +DPTR 這條指令的應(yīng)用范圍較為廣這條指令的應(yīng)用范圍較為廣泛,一般情況下,大多使用該指令,使用該指令泛,一般情況下,大多使用該指令,使用該指令時(shí)不必計(jì)算偏移量,使用該指令的優(yōu)點(diǎn)是表格可時(shí)不必計(jì)算偏移量,使用該指令的優(yōu)點(diǎn)是表格可以設(shè)在以設(shè)在64K64K程序存儲(chǔ)器空間內(nèi)的任何地方,而不像程序存儲(chǔ)器空間內(nèi)的任何地方,而不像 MOVC AMOVC A,A+PCA+PC那樣只設(shè)在那樣只設(shè)在PCPC下面的下面的256256個(gè)單元中,個(gè)單元中,使用較方便。使用較方便。 上面的
32、程序可改成如下形式:上面的程序可改成如下形式:第25頁/共61頁 PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTR MOV DPTR,#TAB1#TAB1 MOVC A MOVC A,A+DPTRA+DPTR POP DPL POP DPL ;恢復(fù);恢復(fù)DPLDPL POP DPH POP DPH ;恢復(fù);恢復(fù)DPHDPH RET RETTAB1: DB 00HTAB1: DB 00H,01H01H,04H04H,09H09H,10H 10H DB 19H DB 19H,24H24H,31H31H,40
33、H40H,51H51H例例4-64-6 在一個(gè)以在一個(gè)以MCS-51MCS-51為核心的溫度控制器中,為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由感器輸出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進(jìn)制數(shù)。根位二進(jìn)制數(shù)。根據(jù)測(cè)得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,據(jù)測(cè)得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中放溫度值表中放溫度值y y, 第26頁/共61頁x x為電壓值數(shù)據(jù)。設(shè)測(cè)得的電壓值為電壓值數(shù)據(jù)。設(shè)測(cè)得的電壓值x x放入放入R2R3R2R3中,中,根據(jù)電壓值根據(jù)電壓值x x,查找對(duì)應(yīng)的溫度值,查找對(duì)應(yīng)的溫度
34、值y y,仍放入,仍放入R2R3R2R3中。本例的中。本例的x x和和y y均為雙字節(jié)無符號(hào)數(shù)。程序如下:均為雙字節(jié)無符號(hào)數(shù)。程序如下: LTB2LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A,R3 MOV A,R3 CLR C CLR C RLC A RLC A MOV R3,A MOV R3,A XCH A,R2 XCH A,R2 RLC A RLC A XCH R2,A XCH R2,A ADD ADD A,DPL A,DPL ;(;(R2R3R2R3)+ +(DPTRDPTR) ; (DPTRDPTR)第27頁/共61頁 MOV DPL,AMOV DPL
35、,A MOV A,DPH MOV A,DPH ADDC A,R2 ADDC A,R2 MOV DPH,A MOV DPH,A CLR A CLR A MOVC A,A+DPTR MOVC A,A+DPTR ;查第一字節(jié);查第一字節(jié) MOV R2,A MOV R2,A ;第一字節(jié)存入;第一字節(jié)存入R2R2中中 CLR ACLR A INC DPTR INC DPTR MOVC A,A+DPTR MOVC A,A+DPTR ;查第二字節(jié);查第二字節(jié) MOV R3,A MOV R3,A ;第二字節(jié)存;第二字節(jié)存入入R3R3中中 RETRET TAB2:DW TAB2:DW ;溫度值表;溫度值表第28
36、頁/共61頁例例4-74-7 設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)1616路輸入路輸入進(jìn)行檢測(cè),進(jìn)行檢測(cè),每路有一最大允許值,為雙字節(jié)數(shù)。每路有一最大允許值,為雙字節(jié)數(shù)。運(yùn)行時(shí),需根據(jù)測(cè)量的路數(shù),找出每路的最大允運(yùn)行時(shí),需根據(jù)測(cè)量的路數(shù),找出每路的最大允許值??摧斎胫凳欠翊笥谧畲笤试S值,如大于就許值??摧斎胫凳欠翊笥谧畲笤试S值,如大于就報(bào)警。根據(jù)上述要求,編一個(gè)查表程序。報(bào)警。根據(jù)上述要求,編一個(gè)查表程序。 取路數(shù)為取路數(shù)為x(0 x15),yx(0 x15),y為最大允許值,放在表格為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,路數(shù)中。設(shè)進(jìn)入查表程序前,路數(shù)x x已放于
37、已放于R2R2中,查中,查表后最大值表后最大值y y放于放于R3R4R3R4中。本例中的中。本例中的x x為單字節(jié)數(shù),為單字節(jié)數(shù),y y為雙字節(jié)數(shù)。查表程序如下:為雙字節(jié)數(shù)。查表程序如下:TB3:TB3: MOV A,R2MOV A,R2 ADD A,R2 ADD A,R2 ;(R2)(R2)* *2(A)2(A) MOV R3,A MOV R3,A ;保存指針;保存指針 ADD A,#6 ADD A,#6 ;加偏移量;加偏移量第29頁/共61頁MOVC A,A+PC MOVC A,A+PC ;查第一字節(jié);查第一字節(jié)XCH A,R3XCH A,R3 ADD A,#3ADD A,#3 MOVC
38、A,A+PC MOVC A,A+PC ;查第二字;查第二字節(jié)節(jié) MOV R4,AMOV R4,ARETRET TAB3: TAB3: DW 1520DW 1520,37213721,4264542645,7580 7580 ;最大;最大值值 ;表;表 DW 3483DW 3483,3265732657,883883,99439943 DW 10000 DW 10000,4051140511,67586758,89318931 DW 4468 DW 4468,58715871,1328413284,2780827808第30頁/共61頁表格長(zhǎng)度不能超過表格長(zhǎng)度不能超過256256個(gè)字節(jié),且表格只
39、能存放于個(gè)字節(jié),且表格只能存放于MOVC A,A+PCMOVC A,A+PC指令以下的指令以下的256256個(gè)單元中。個(gè)單元中。4.3.4 4.3.4 關(guān)鍵字查找程序設(shè)計(jì)關(guān)鍵字查找程序設(shè)計(jì)順序檢索和對(duì)分檢索順序檢索和對(duì)分檢索一、順序檢索一、順序檢索 從第從第1 1項(xiàng)開始逐項(xiàng)順序查找,判斷所取數(shù)據(jù)是否與項(xiàng)開始逐項(xiàng)順序查找,判斷所取數(shù)據(jù)是否與關(guān)鍵字相等。關(guān)鍵字相等。例例4-84-8 從從5050個(gè)字節(jié)的無序表中查找一個(gè)關(guān)鍵字個(gè)字節(jié)的無序表中查找一個(gè)關(guān)鍵字”H H。 ORG 1000HORG 1000HMOV 30HMOV 30H,# #H H;關(guān)鍵字;關(guān)鍵字H H送送30H30H單單元元MOV R
40、1MOV R1,#50#50 ;查找次數(shù)送;查找次數(shù)送R1R1MOV AMOV A,#14#14 ;修正值送;修正值送A A 第31頁/共61頁 MOV DPTRMOV DPTR,#TAB4 #TAB4 ;表首地址送;表首地址送DPTRDPTRLOOPLOOP:PUSH ACCPUSH ACC MOVC A MOVC A, A+PC A+PC;查表結(jié)果送;查表結(jié)果送A A CJNE A CJNE A,40H40H,LOOP1LOOP1;(40H40H)不等于關(guān)鍵)不等于關(guān)鍵字則轉(zhuǎn)字則轉(zhuǎn)LOOP1LOOP1 MOV R2 MOV R2,DPHDPH;已查到關(guān)鍵字,把該已查到關(guān)鍵字,把該字字 ;的
41、地址送;的地址送R2R2,R3R3 MOV R3 MOV R3,DPL DPL ;DONEDONE:RETRETLOOP1LOOP1:POP ACCPOP ACC ;修正值彈出;修正值彈出 INC AINC A ;A+1AA+1A INC DPTR INC DPTR ;修改數(shù)據(jù)指針;修改數(shù)據(jù)指針DPTRDPTR DJNZ R1 DJNZ R1,LOOP LOOP ;R10R10,未查完,繼續(xù),未查完,繼續(xù)查找查找 第32頁/共61頁 MOV R2MOV R2,#00H#00H;R1=0R1=0,清,清“0 0” R2 R2 和和R3R3 MOV R3 MOV R3,#00H#00H;表中;表中
42、5050個(gè)數(shù)已查完個(gè)數(shù)已查完 AJMPAJMPDONEDONE;從子程序返回;從子程序返回TAB4TAB4:DB DB ,;5050個(gè)無序數(shù)據(jù)表個(gè)無序數(shù)據(jù)表二、對(duì)分檢索二、對(duì)分檢索前提:前提:檢索的數(shù)據(jù)表已經(jīng)排好序,如何進(jìn)行數(shù)據(jù)檢索的數(shù)據(jù)表已經(jīng)排好序,如何進(jìn)行數(shù)據(jù)的排序,將在本節(jié)稍后介紹。的排序,將在本節(jié)稍后介紹。方法:方法:取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進(jìn)行比較,取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進(jìn)行比較,如相等,則查找到;如果所取的數(shù)大于關(guān)鍵字,如相等,則查找到;如果所取的數(shù)大于關(guān)鍵字,則下次對(duì)分檢索的范圍是從數(shù)據(jù)區(qū)起點(diǎn)到本次取則下次對(duì)分檢索的范圍是從數(shù)據(jù)區(qū)起點(diǎn)到本次取數(shù)。如果取數(shù)小于關(guān)鍵字,則下
43、次對(duì)分檢索的范數(shù)。如果取數(shù)小于關(guān)鍵字,則下次對(duì)分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點(diǎn)到數(shù)據(jù)區(qū)終點(diǎn)。依此圍是從本次取數(shù)數(shù)據(jù)區(qū)起點(diǎn)到數(shù)據(jù)區(qū)終點(diǎn)。依此類推,逐漸縮小檢索范圍,減少次數(shù),大大提高類推,逐漸縮小檢索范圍,減少次數(shù),大大提高了查找速度。了查找速度。第33頁/共61頁4.3.5 4.3.5 數(shù)據(jù)極值查找程序設(shè)計(jì)數(shù)據(jù)極值查找程序設(shè)計(jì)在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。進(jìn)行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。例例4-94-9 片內(nèi)片內(nèi)RAMRAM中存放一批數(shù)據(jù),查找出最大值并中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)存放于首地址中。設(shè)R0R0中存首地址,中存
44、首地址,R2R2中存放字中存放字節(jié)數(shù),程序框圖如圖節(jié)數(shù),程序框圖如圖4-14-1所示。所示。程序如下:程序如下: MOV R2MOV R2,n n;n n為要比較的數(shù)據(jù)字節(jié)數(shù)為要比較的數(shù)據(jù)字節(jié)數(shù)MOV AMOV A,R0R0;存首地址指針;存首地址指針MOV R1MOV R1,A ADEC R2DEC R2; MOV AMOV A,R1 R1 第34頁/共61頁第35頁/共61頁LOOP:LOOP: MOV R3 MOV R3, A A DEC R1 DEC R1 CLR C CLR C SUBB A SUBB A,R1R1;兩個(gè)數(shù)比較;兩個(gè)數(shù)比較 JNC LOOP1JNC LOOP1;C=0
45、C=0,A A中的數(shù)大,跳中的數(shù)大,跳LOOP1LOOP1 MOV A MOV A,R1R1;C=1C=1,則大數(shù)送,則大數(shù)送A A SJMP LOOP2 SJMP LOOP2LOOP1:MOV ALOOP1:MOV A,R3 R3 LOOP2:DJNZ R2, LOOPLOOP2:DJNZ R2, LOOP;是否比較結(jié)束?;是否比較結(jié)束? MOV R0MOV R0, A A;存最大數(shù);存最大數(shù) RET RET 第36頁/共61頁4.3.6 4.3.6 數(shù)據(jù)排序程序設(shè)計(jì)數(shù)據(jù)排序程序設(shè)計(jì)升序排,降序排升序排,降序排。僅介紹無符號(hào)數(shù)據(jù)升序排。僅介紹無符號(hào)數(shù)據(jù)升序排。冒泡法:冒泡法:相鄰數(shù)互換的排序
46、方法,類似水中氣泡上相鄰數(shù)互換的排序方法,類似水中氣泡上浮浮 。排序時(shí)從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較,次。排序時(shí)從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較,次序與要求的順序不符時(shí),就將兩個(gè)數(shù)互換;順序序與要求的順序不符時(shí),就將兩個(gè)數(shù)互換;順序符合要求不互換。符合要求不互換。 假設(shè)有假設(shè)有7 7個(gè)原始數(shù)據(jù)的排列順序?yàn)椋簜€(gè)原始數(shù)據(jù)的排列順序?yàn)椋? 6、4 4、1 1、2 2、5 5、7 7、3 3。第一次冒泡的過程是:。第一次冒泡的過程是:6 6、4 4、1 1、2 2、5 5、7 7、3 3 ;原始數(shù)據(jù)的排列;原始數(shù)據(jù)的排列4 4、6 6、1 1、2 2、5 5、7 7、3 3 ;逆序,互換;逆序,互換4 4、
47、1 1、6 6、2 2、5 5、7 7、3 3 ;逆序,互換;逆序,互換 4 4、1 1、2 2、6 6、5 5、7 7、3 3 ;逆序,互換;逆序,互換4 4、1 1、2 2、5 5、6 6、7 7、3 3 ;逆序,互換;逆序,互換第37頁/共61頁4 4、1 1、2 2、5 5、6 6、7 7、3 3 ;正序,不互換;正序,不互換4 4、1 1、2 2、5 5、6 6、3 3、7 7 ;逆序,互換,第一;逆序,互換,第一次冒次冒泡結(jié)束泡結(jié)束如此進(jìn)行,各次冒泡的結(jié)果如下:如此進(jìn)行,各次冒泡的結(jié)果如下:第第1 1次冒泡結(jié)果:次冒泡結(jié)果:4 4、1 1、2 2、5 5、6 6、3 3、7 7第第
48、2 2次冒泡結(jié)果:次冒泡結(jié)果:1 1、2 2、4 4、5 5、3 3、6 6、7 7第第3 3次冒泡結(jié)果:次冒泡結(jié)果:1 1、2 2、4 4、3 3、5 5、6 6、7 7第第4 4次冒泡結(jié)果:次冒泡結(jié)果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 ;已完成;已完成排序排序第第5 5次冒泡結(jié)果:次冒泡結(jié)果:1 1、2 2、3 3、4 4、5 5、6 6、7 7第第6 6次冒泡結(jié)果:次冒泡結(jié)果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 對(duì)于對(duì)于n n個(gè)數(shù),理論上應(yīng)進(jìn)行(個(gè)數(shù),理論上應(yīng)進(jìn)行(n-1n-1)次冒泡,有時(shí)不)次冒泡,有時(shí)不到(到(n-1n-1)次就已完成排序)
49、次就已完成排序 。第38頁/共61頁如何判定排序是否已完成,看各次冒泡中是否有互如何判定排序是否已完成,看各次冒泡中是否有互換發(fā)生,如果有數(shù)據(jù)互換,則排序還沒完成。換發(fā)生,如果有數(shù)據(jù)互換,則排序還沒完成。在程序設(shè)計(jì)中,常使用設(shè)置互換標(biāo)志的方法,該標(biāo)在程序設(shè)計(jì)中,常使用設(shè)置互換標(biāo)志的方法,該標(biāo)志的狀態(tài)表示在一次冒泡中是否有互換進(jìn)行。志的狀態(tài)表示在一次冒泡中是否有互換進(jìn)行。例例4-10 4-10 一批單字節(jié)無符號(hào)數(shù),以一批單字節(jié)無符號(hào)數(shù),以R0R0為首地址指針,為首地址指針,R2R2中為字節(jié)數(shù),將這批數(shù)進(jìn)行升序排列。程序框中為字節(jié)數(shù),將這批數(shù)進(jìn)行升序排列。程序框圖如圖圖如圖4-24-2所示。所示。
50、SORTSORT:MOV AMOV A,R0 R0 ;MOV R1MOV R1,A AMOV AMOV A,R2R2;字節(jié)數(shù)送入R5R5MOV R5MOV R5,A ACLR F0CLR F0;互換標(biāo)志位F0F0清零DEC R5DEC R5;MOV AMOV A,R1R1; 第39頁/共61頁第40頁/共61頁LOOP:LOOP:MOV R3MOV R3,A A;INC R1INC R1;CLR CCLR C;MOV AMOV A,R1R1;比較大??;比較大小SUBB ASUBB A,R3R3;JNC LOOP1JNC LOOP1;SETB F0SETB F0;互換標(biāo)志位;互換標(biāo)志位F0F0置
51、置1 1MOV AMOV A,R3R3; ;XCH AXCH A,R1R1;兩個(gè)數(shù)互換;兩個(gè)數(shù)互換DEC R1DEC R1;XCH AXCH A,R1R1;INC R1 INC R1 第41頁/共61頁LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,LOOP LOOP JB F0JB F0,SORT SORT RETRET4.3.7 4.3.7 分支轉(zhuǎn)移程序設(shè)計(jì)分支轉(zhuǎn)移程序設(shè)計(jì)特點(diǎn)是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令有分為特點(diǎn)是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令有分為無條無條件轉(zhuǎn)移件轉(zhuǎn)移和和有條件轉(zhuǎn)移有條件轉(zhuǎn)移,因此分支程序也可分為無,因此分支程序也可分為無條件分支轉(zhuǎn)
52、移程序和有條件分支轉(zhuǎn)移程序。有條條件分支轉(zhuǎn)移程序和有條件分支轉(zhuǎn)移程序。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為單分支單分支轉(zhuǎn)移轉(zhuǎn)移結(jié)構(gòu)和結(jié)構(gòu)和多分支轉(zhuǎn)移多分支轉(zhuǎn)移結(jié)構(gòu)結(jié)構(gòu)。一、分支轉(zhuǎn)移結(jié)構(gòu)一、分支轉(zhuǎn)移結(jié)構(gòu) 1 1單分支轉(zhuǎn)移結(jié)構(gòu)單分支轉(zhuǎn)移結(jié)構(gòu) 第42頁/共61頁僅有兩個(gè)出口,兩者選一。僅有兩個(gè)出口,兩者選一。例例4-114-11 求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼參考程序參考程序:CMPTCMPT:JNB Acc.7,RETURNJNB Acc.7,RETURN;(;(A A)00,不需轉(zhuǎn)換,不需轉(zhuǎn)換MOV CMOV C,Acc.7Acc
53、.7 ;符號(hào)位保存;符號(hào)位保存CPL ACPL A;(;(A A)求反,加)求反,加1 1ADD AADD A,#1#1; 第43頁/共61頁MOV Acc.7MOV Acc.7,C C ;符號(hào)位存;符號(hào)位存A A的最高位的最高位RETURNRETURN:RETRET此外,單分支選擇結(jié)構(gòu)還有如圖此外,單分支選擇結(jié)構(gòu)還有如圖4-44-4、圖、圖4-54-5等所示等所示的幾種形式:的幾種形式: 第44頁/共61頁第45頁/共61頁2多分支轉(zhuǎn)移結(jié)構(gòu)多分支轉(zhuǎn)移結(jié)構(gòu) 程序的判別部分有兩個(gè)以上的出口流向。程序的判別部分有兩個(gè)以上的出口流向。常見的兩種形式。如圖常見的兩種形式。如圖4-64-6和圖和圖4-7
54、4-7。 第46頁/共61頁指令系統(tǒng)提供了非常有用的兩種多分支選擇指令指令系統(tǒng)提供了非常有用的兩種多分支選擇指令: : 間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令: JMP A+DPTR;: JMP A+DPTR;比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令: CJNE A,direct,rel: CJNE A,direct,rel; CJNE A,#data,relCJNE A,#data,rel; CJNE Rn,#data,relCJNE Rn,#data,rel; CJNE Ri,#data,relCJNE Ri,#data,rel;最簡(jiǎn)單的分支轉(zhuǎn)移程序的設(shè)計(jì),一般常采用逐次最簡(jiǎn)單的分支轉(zhuǎn)移程序的設(shè)計(jì),一般常采用逐次比較法
55、,就是把所有不同的情況一個(gè)一個(gè)的進(jìn)行比較法,就是把所有不同的情況一個(gè)一個(gè)的進(jìn)行比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。這種方比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。這種方法的主要缺點(diǎn)是程序太長(zhǎng),有法的主要缺點(diǎn)是程序太長(zhǎng),有n n種可能的情況,種可能的情況,就需有就需有n n個(gè)判斷和轉(zhuǎn)移。個(gè)判斷和轉(zhuǎn)移。 例例4-12 4-12 求符號(hào)函數(shù)的值。求符號(hào)函數(shù)的值。 第47頁/共61頁程序框圖如圖程序框圖如圖4-64-6所示。所示。 程序略。 第48頁/共61頁在實(shí)際的應(yīng)用中,經(jīng)常遇到的圖4-74-7結(jié)構(gòu)形式的分支轉(zhuǎn)移程序的設(shè)計(jì) 。第49頁/共61頁需根據(jù)某一單元的內(nèi)容是0 0,1 1,n n,來分別轉(zhuǎn)向處理
56、程序0 0,處理程序1 1,處理程序n n。一個(gè)典型的例子就是當(dāng)單片機(jī)系統(tǒng)中的鍵盤按下時(shí),就會(huì)得到一個(gè)鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。對(duì)于這種情況,可用直接轉(zhuǎn)移指令(LJMPLJMP或AJMPAJMP指令)組成一個(gè)轉(zhuǎn)移表,然后把該單元的內(nèi)容讀入累加器A A,轉(zhuǎn)移表首地址放入DPTRDPTR中,再利用間接轉(zhuǎn)移指令實(shí)現(xiàn)分支轉(zhuǎn)移。 例例4-124-12 根據(jù)寄存器R2R2的內(nèi)容,轉(zhuǎn)向各個(gè)處理程序PRGXPRGX(X=0X=0n n)。(R2R2)=0=0,轉(zhuǎn)PRG0PRG0(R2R2)=1=1,轉(zhuǎn)PRG1PRG1 (R2R2)=n, =n, 轉(zhuǎn)PRGnPRGn第50頁/共61頁4.3
57、.8 4.3.8 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 特點(diǎn)是程序中含有可以反復(fù)執(zhí)行的程序段,該程特點(diǎn)是程序中含有可以反復(fù)執(zhí)行的程序段,該程序段通常稱為循環(huán)體。例如求序段通常稱為循環(huán)體。例如求100100個(gè)數(shù)的累加和,個(gè)數(shù)的累加和,則沒有必要連續(xù)安排則沒有必要連續(xù)安排100100條加法指令,可以只用條加法指令,可以只用一條加法指令并使其循環(huán)執(zhí)行一條加法指令并使其循環(huán)執(zhí)行100100次。次。 (1 1)可大大縮短程序長(zhǎng)度()可大大縮短程序長(zhǎng)度(2 2)使程序所占的內(nèi))使程序所占的內(nèi)存單元數(shù)量少(存單元數(shù)量少(3 3)使程序結(jié)構(gòu)緊湊和可讀性變)使程序結(jié)構(gòu)緊湊和可讀性變好。好。一、循環(huán)程序的結(jié)構(gòu)一、循環(huán)程序的結(jié)
58、構(gòu)循環(huán)結(jié)構(gòu)程序主要由以下四部分組成。循環(huán)結(jié)構(gòu)程序主要由以下四部分組成。 1 1循環(huán)初始化循環(huán)初始化循環(huán)初始化程序段用于完成循環(huán)前的的準(zhǔn)備工作。循環(huán)初始化程序段用于完成循環(huán)前的的準(zhǔn)備工作。例如,循環(huán)控制計(jì)數(shù)初值的設(shè)置、地址指針的起例如,循環(huán)控制計(jì)數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預(yù)置初值等。始地址的設(shè)置、為變量預(yù)置初值等。 第51頁/共61頁 2 2循環(huán)處理循環(huán)處理循環(huán)程序結(jié)構(gòu)的核心部分,完成實(shí)際的處理工作,是需反復(fù)循環(huán)執(zhí)行的部分,故又稱循環(huán)體。這部分程序的內(nèi)容,取決于實(shí)際處理問題的本身。 3 3循環(huán)控制循環(huán)控制在重復(fù)執(zhí)行循環(huán)體的過程中, ,不斷修改循環(huán)控制變量,直到符合結(jié)束條件,
59、,就結(jié)束循環(huán)程序的執(zhí)行。循環(huán)結(jié)束控制方法分為循環(huán)計(jì)數(shù)控制法和條件控制法 4 4循環(huán)結(jié)束循環(huán)結(jié)束這部分是對(duì)循環(huán)程序執(zhí)行的結(jié)果進(jìn)行分析、處理和存放。 二、循環(huán)結(jié)構(gòu)的控制二、循環(huán)結(jié)構(gòu)的控制 第52頁/共61頁圖4-84-8是計(jì)數(shù)循環(huán)控制結(jié)構(gòu),圖4-94-9是條件控制結(jié)構(gòu)。 第53頁/共61頁1 1計(jì)數(shù)循環(huán)結(jié)構(gòu)計(jì)數(shù)循環(huán)結(jié)構(gòu)計(jì)數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計(jì)數(shù)器的值來決定循環(huán)計(jì)數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計(jì)數(shù)器的值來決定循環(huán)次數(shù),一般為減次數(shù),一般為減“1 1” 計(jì)數(shù)器,計(jì)數(shù)器減到計(jì)數(shù)器,計(jì)數(shù)器減到“0 0”時(shí),結(jié)束循環(huán)。計(jì)數(shù)器的初值是在初始化時(shí)設(shè)時(shí),結(jié)束循環(huán)。計(jì)數(shù)器的初值是在初始化時(shí)設(shè)定。定。MCS-51MCS-51的
60、指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指的指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指令:令: DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制計(jì)數(shù)器;工作寄存器作控制計(jì)數(shù)器 DJNZ direct,relDJNZ direct,rel;以直接尋址單元作控制;以直接尋址單元作控制計(jì)數(shù)計(jì)數(shù) 器。器。例如,計(jì)算例如,計(jì)算n n個(gè)數(shù)據(jù)的和。個(gè)數(shù)據(jù)的和。 程序框圖見圖程序框圖見圖4-10 4-10 。 計(jì)數(shù)控制方法只有在循環(huán)次數(shù)已知的情況計(jì)數(shù)控制方法只有在循環(huán)次數(shù)已知的情況下才適用。對(duì)循環(huán)次數(shù)未知的問題,不能用循下才適用。對(duì)循環(huán)次數(shù)未知的問題,不能用循環(huán)次數(shù)來控制。往往需要根據(jù)某種條件來判斷環(huán)次數(shù)來控制
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市政工程科技創(chuàng)新試題及答案
- 外賣調(diào)度配送管理辦法
- 行政管理經(jīng)濟(jì)法復(fù)習(xí)試題及答案解析
- 高級(jí)會(huì)計(jì)行業(yè)發(fā)展動(dòng)態(tài)試題及答案
- 廣西低價(jià)打井管理辦法
- 通風(fēng)管理歸口管理辦法
- 財(cái)稅公司客源管理辦法
- 技能提升2025年工程項(xiàng)目管理考試試題及答案
- 工程經(jīng)濟(jì)研究方向試題及答案
- 經(jīng)紀(jì)業(yè)務(wù)管理辦法方案
- 小學(xué)音體美學(xué)科教師考核辦法
- 深基坑工程培訓(xùn)課件
- 二年級(jí)24點(diǎn)練習(xí)題庫
- 數(shù)據(jù)分析和持續(xù)改進(jìn)控制程序
- 油漆工進(jìn)場(chǎng)安全教育試題
- Q-SY 10342-2019 終端計(jì)算機(jī)安全管理規(guī)范
- 南京信息職業(yè)技術(shù)學(xué)院工作人員招聘考試真題2022
- 2023年遼寧大連國際機(jī)場(chǎng)社會(huì)招聘筆試參考題庫附帶答案詳解
- 10KV-35kV架空電力線路施工與驗(yàn)收規(guī)范
- 京東入駐流程
- 護(hù)理查房高位截癱584
評(píng)論
0/150
提交評(píng)論