![第四章 MCS-51匯編程序設(shè)計_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/1/4ea7c086-c7b4-4e00-861c-a42f45719db9/4ea7c086-c7b4-4e00-861c-a42f45719db91.gif)
![第四章 MCS-51匯編程序設(shè)計_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/1/4ea7c086-c7b4-4e00-861c-a42f45719db9/4ea7c086-c7b4-4e00-861c-a42f45719db92.gif)
![第四章 MCS-51匯編程序設(shè)計_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/1/4ea7c086-c7b4-4e00-861c-a42f45719db9/4ea7c086-c7b4-4e00-861c-a42f45719db93.gif)
![第四章 MCS-51匯編程序設(shè)計_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/1/4ea7c086-c7b4-4e00-861c-a42f45719db9/4ea7c086-c7b4-4e00-861c-a42f45719db94.gif)
![第四章 MCS-51匯編程序設(shè)計_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/1/4ea7c086-c7b4-4e00-861c-a42f45719db9/4ea7c086-c7b4-4e00-861c-a42f45719db95.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第4 4章章 MCS-51 MCS-51匯編語言程序設(shè)計匯編語言程序設(shè)計 匯編語言是面向機器硬件的語言匯編語言是面向機器硬件的語言,要求程序設(shè)計者對,要求程序設(shè)計者對 MCS-51MCS-51單片機具有很好的單片機具有很好的“軟、硬結(jié)合軟、硬結(jié)合”的功底。的功底。 介紹介紹程序設(shè)計的基本知識程序設(shè)計的基本知識及如何及如何使用匯編語言來進行使用匯編語言來進行 基本的程序設(shè)計?;镜某绦蛟O(shè)計。 4.1 4.1 匯編語言程序設(shè)計概述匯編語言程序設(shè)計概述 4.1.1 4.1.1 機器語言、匯編語言和高級語言機器語言、匯編語言和高級語言 用于程序設(shè)計的用于程序設(shè)計的語言基本上分為語言基本上分為3 3種
2、:機器語言、匯編種:機器語言、匯編 語言和高級語言語言和高級語言。 1.1.機器語言機器語言 二進制代碼表示的指令、數(shù)字和符號簡稱為機器語二進制代碼表示的指令、數(shù)字和符號簡稱為機器語 言不易懂,難記憶,易出錯。言不易懂,難記憶,易出錯。 2 2匯編語言匯編語言 英文助記符表示的指令稱為英文助記符表示的指令稱為符號語言符號語言或或匯編語言匯編語言 將匯編語言程序轉(zhuǎn)換成為二進制代碼表示的機器語將匯編語言程序轉(zhuǎn)換成為二進制代碼表示的機器語 言程序稱為言程序稱為匯編程序匯編程序 經(jīng)匯編程序經(jīng)匯編程序“匯編(翻譯)匯編(翻譯)”得到的機器語言程序稱為得到的機器語言程序稱為 目標程序目標程序,原來的匯編語
3、言程序稱為,原來的匯編語言程序稱為源程序源程序。 匯編語言特點匯編語言特點: 面向機器的語言,程序設(shè)計員須對面向機器的語言,程序設(shè)計員須對MCS-51MCS-51的硬件的硬件 有相當深入的了解。有相當深入的了解。 助記符指令和機器指令一一對應(yīng),用匯編語言編助記符指令和機器指令一一對應(yīng),用匯編語言編 寫的寫的程序效率高程序效率高,占用,占用存儲空間小存儲空間小,運行,運行速度快速度快, 用匯編語言能編寫出最優(yōu)化的程序。用匯編語言能編寫出最優(yōu)化的程序。 能直接管理和控制硬件設(shè)備(功能部件),它能能直接管理和控制硬件設(shè)備(功能部件),它能 處理中斷,也能直接訪問存儲器及處理中斷,也能直接訪問存儲器及
4、I/OI/O接口電路。接口電路。 匯編語言和機器語言都脫離不開具體機器的硬件,均匯編語言和機器語言都脫離不開具體機器的硬件,均 是面向是面向“機器機器”的語言,缺乏通用性。的語言,缺乏通用性。 3 3高級語言高級語言 不受具體機器的限制不受具體機器的限制, ,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計算使用了許多數(shù)學(xué)公式和數(shù)學(xué)計算 上的習(xí)慣用語,上的習(xí)慣用語,非常擅長于科學(xué)計算。非常擅長于科學(xué)計算。常用的如常用的如 BASICBASIC、FORTRANFORTRAN以及以及C C語言等。語言等。 高級語言高級語言優(yōu)點優(yōu)點:通用性強,直觀、易懂、易學(xué),可讀:通用性強,直觀、易懂、易學(xué),可讀 性好。性好。 使用使
5、用C C語言(語言(C51C51)、)、PL/MPL/M語言來進行語言來進行MCS-51MCS-51的應(yīng)用程的應(yīng)用程 序設(shè)計。序設(shè)計。 對于程序的空間和時間要求很高的場合,匯編語言仍對于程序的空間和時間要求很高的場合,匯編語言仍 是必不可缺的。是必不可缺的。 C C語言和匯編語言混合編程語言和匯編語言混合編程 在很多需要在很多需要直接控制硬件直接控制硬件的應(yīng)用場合,則更是非用匯的應(yīng)用場合,則更是非用匯 編語言不可編語言不可 使用匯編語言編程,是單片機程序設(shè)計的使用匯編語言編程,是單片機程序設(shè)計的基本功之一基本功之一 4.1.2 4.1.2 匯編語言語句的種類和格式匯編語言語句的種類和格式 兩種
6、基本類型:指令語句和偽指令語句兩種基本類型:指令語句和偽指令語句 (1 1)指令語句)指令語句 已在第已在第3 3章介紹章介紹 每一條指令語句在匯編時都產(chǎn)生一個指令代碼每一條指令語句在匯編時都產(chǎn)生一個指令代碼機機 器代碼器代碼 (2 2)偽指令語句)偽指令語句 是為匯編服務(wù)的。在匯編時是為匯編服務(wù)的。在匯編時沒有機器代碼與之對應(yīng)。沒有機器代碼與之對應(yīng)。 MCS-51MCS-51的匯編語言的的匯編語言的四分段格式四分段格式如下:如下: 標號字段標號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段 規(guī)則:規(guī)則: (1 1)標號字段和操作字碼段之間要有冒號)標號字段和操作字碼段之間
7、要有冒號“:”相隔;相隔; (2 2)操作碼字段和操作數(shù)字段間的分界符是空格;)操作碼字段和操作數(shù)字段間的分界符是空格; (3 3)雙操作數(shù)之間用逗號相隔;)雙操作數(shù)之間用逗號相隔; (4 4)操作數(shù)字段和注釋字段之間的分界符用分號)操作數(shù)字段和注釋字段之間的分界符用分號“;” 相隔。相隔。 操作碼字段為必選項,其余各段為任選項。操作碼字段為必選項,其余各段為任選項。 例例4-14-1 下面是一段匯編語言程序的四分段書寫格式下面是一段匯編語言程序的四分段書寫格式 標號字段標號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段 START: MOV A,#00H ;0A MOV
8、R1,#10 ;10R1 MOV R2,#00000011B ;3R2 LOOP:ADD A,R2 ;(;(A)+(R2)A DJNZ R1,LOOP;R1內(nèi)容減內(nèi)容減1不為零,則循環(huán)不為零,則循環(huán) NOP HERE: SJMP HERE 基本語法規(guī)則:基本語法規(guī)則: 1 1標號字段標號字段 是語句所在地址的標志符號是語句所在地址的標志符號 (1 1)標號后邊必須跟以冒號)標號后邊必須跟以冒號“:” (2 2)由)由1-81-8個個ASCIIASCII字符組成字符組成 (3 3)同一標號在一個程序中只能定義一次)同一標號在一個程序中只能定義一次 (4 4)不能使用匯編語言已經(jīng)定義的符號作為標號
9、)不能使用匯編語言已經(jīng)定義的符號作為標號 2 2操作碼字段操作碼字段 是匯編語言指令中是匯編語言指令中唯一不能空缺唯一不能空缺的部分。匯編程序就的部分。匯編程序就 是是根據(jù)這一字段來生成機器代碼根據(jù)這一字段來生成機器代碼的。的。 3 3操作數(shù)字段操作數(shù)字段 通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如 果是雙操作數(shù),則操作數(shù)之間,要以逗號隔開。果是雙操作數(shù),則操作數(shù)之間,要以逗號隔開。 (1 1)十六進制、二進制和十進制形式的操作數(shù)表示)十六進制、二進制和十進制形式的操作數(shù)表示 采用十六進制形式來表示采用十六進制形式來表示 ,某些特殊場合才采用,
10、某些特殊場合才采用 二進制或十進制的表示形式二進制或十進制的表示形式 。 十六進制,后綴十六進制,后綴“H H” 。 二進制,后綴二進制,后綴“B B” 。 十進制,后綴十進制,后綴“D D”,也可省略也可省略。 若十六進制的若十六進制的操作數(shù)以字符操作數(shù)以字符A A- -F F中的某個開頭時,則需中的某個開頭時,則需 在它在它前面加一個前面加一個 “0 0”,以便在匯編時把它和字符,以便在匯編時把它和字符 A AF F區(qū)別開來。區(qū)別開來。 (2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代號來表示,也采用工作寄存器和特殊功能寄存器
11、的代號來表示,也 可用其地址來表示??捎闷涞刂穪肀硎?。 例如,例如,累加器可用累加器可用A A(或(或AccAcc)表示。也可用)表示。也可用0E0H0E0H來表來表 示,示,0E0H0E0H為累加器為累加器A A的地址。的地址。 (3 3)美元符號)美元符號$ $的使用的使用 用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下 指令:指令: JNB F0JNB F0, $ $ 與如下指令是等價的:與如下指令是等價的: HERE HERE:JNB F0JNB F0,HEREHERE 再如:再如: HEREHERE:SJMP HERESJMP HERE
12、可寫為:可寫為: SJMP $SJMP $ 4 4注釋字段注釋字段 必須以分號必須以分號“;”開頭,但必須注意開頭,但必須注意, ,換行書寫時也要以換行書寫時也要以 分號分號“;”開頭。開頭。 匯編時,注釋字段不會產(chǎn)生機器代碼。匯編時,注釋字段不會產(chǎn)生機器代碼。 4.1.3 4.1.3 偽指令偽指令 在在MCS-51 MCS-51 匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指 示信息,告訴它如何完成匯編工作,這是通過使用示信息,告訴它如何完成匯編工作,這是通過使用 偽指令來實現(xiàn)的。也稱為匯編程序控制命令。只有偽指令來實現(xiàn)的。也稱為匯編程序控制命令。只有 在匯編前
13、的源程序中才有偽指令。經(jīng)過匯編得到目在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目 標程序(機器代碼)后,偽指令已無存在的必要,標程序(機器代碼)后,偽指令已無存在的必要, 所以所以“偽偽”體現(xiàn)在匯編時,體現(xiàn)在匯編時,偽指令沒有相應(yīng)的機器代偽指令沒有相應(yīng)的機器代 碼產(chǎn)生碼產(chǎn)生。 常用的偽指令常用的偽指令: 1.ORG1.ORG(ORiGinORiGin)匯編起始地址命令)匯編起始地址命令 在匯編語言源程序的開始,通常都用一條在匯編語言源程序的開始,通常都用一條ORGORG偽指令來偽指令來 實現(xiàn)規(guī)定程序的起始地址。如不用實現(xiàn)規(guī)定程序的起始地址。如不用ORGORG規(guī)定,則匯編規(guī)定,則匯編 得到的目標
14、程序?qū)牡玫降哪繕顺绦驅(qū)?000H0000H開始。例如:開始。例如: ORG 2000HORG 2000H STARTSTART:MOV A,#00HMOV A,#00H 規(guī)定標號規(guī)定標號STARTSTART代表地址為代表地址為2000H2000H開始。開始。 在一個源程序中,在一個源程序中,可可多次多次使用使用ORGORG指令指令,來規(guī)定不,來規(guī)定不 同的程序段的起始地址。但是,同的程序段的起始地址。但是,地址必須由小到地址必須由小到 大排列,地址不能交叉、重疊大排列,地址不能交叉、重疊。例如:。例如: ORG 2000HORG 2000H ORG 2500HORG 2500H ORG 3
15、000HORG 3000H 2. END(END of assembly)2. END(END of assembly)匯編終止命令匯編終止命令 匯編語言源程序的結(jié)束標志,用于終止源程序的匯匯編語言源程序的結(jié)束標志,用于終止源程序的匯 編工作。在整個源程序中只能有一條編工作。在整個源程序中只能有一條ENDEND命令,且命令,且 位于程序的最后。位于程序的最后。 3 3DBDB(Define ByteDefine Byte)定義字節(jié)命令)定義字節(jié)命令 在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。 ORG 2000HORG 2000H DB 30HDB 30H,40
16、H40H,2424,“C C”,“B B” 匯編后:匯編后: (2000H2000H)=30H=30H (2001H2001H)=40H=40H (2002H2002H)=18H=18H(1010進制數(shù)進制數(shù)2424) (2003H2003H)=43H=43H(字符(字符“C C”的的ASCIIASCII碼)碼) (2004H2004H)=42H=42H(字符(字符“B B”的的ASCIIASCII碼)碼) DBDB功能是從指定單元開始定義(存儲)若干個字節(jié),功能是從指定單元開始定義(存儲)若干個字節(jié),1010 進制數(shù)自然轉(zhuǎn)換成進制數(shù)自然轉(zhuǎn)換成1616進制數(shù),字母按進制數(shù),字母按ASCIIAS
17、CII碼存儲。碼存儲。 4 4DWDW(Define WordDefine Word)定義數(shù)據(jù)字命令)定義數(shù)據(jù)字命令 從指定的地址開始,在程序存儲器的連續(xù)單元中定義從指定的地址開始,在程序存儲器的連續(xù)單元中定義 1616位的數(shù)據(jù)字。例如:位的數(shù)據(jù)字。例如: ORG 2000HORG 2000H DW 1246H DW 1246H,7BH7BH,1010 匯編后:匯編后: (2000H2000H)=12H=12H;第;第1 1個字個字 (2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2個字個字 (2003H2003H)=7BH=7BH (2004H
18、2004H)=00H=00H;第;第3 3個字(個字(2005H2005H)=0AH=0AH (2005H2005H)=0AH =0AH 5 5EQUEQU(EQUateEQUate)賦值命令)賦值命令 用于給標號賦值。賦值以后,其標號值在整個程序有用于給標號賦值。賦值以后,其標號值在整個程序有 效。先定義后使用效。先定義后使用例如:例如: TEST EQU 2000HTEST EQU 2000H 表示標號表示標號TEST=2000HTEST=2000H,在匯編時,凡是遇到標號,在匯編時,凡是遇到標號TESTTEST 時,均以時,均以2000H2000H來代替。來代替。 6 6DATADATA
19、和和XDATAXDATA數(shù)據(jù)地址賦值命令數(shù)據(jù)地址賦值命令 可以先使用后定義可以先使用后定義 4.1.4 4.1.4 匯編語言程序設(shè)計步驟匯編語言程序設(shè)計步驟 (1 1)分析問題,確定算法)分析問題,確定算法 (2 2)根據(jù)算法,畫出程序框圖)根據(jù)算法,畫出程序框圖 (3 3)分配內(nèi)存工作區(qū)及有關(guān)端口地址)分配內(nèi)存工作區(qū)及有關(guān)端口地址 (4 4)編寫程序)編寫程序, ,養(yǎng)成在程序的養(yǎng)成在程序的適當位置上加上注釋適當位置上加上注釋的的 好習(xí)慣。好習(xí)慣。 (5 5)上機調(diào)試)上機調(diào)試 編寫完畢的程序,必須編寫完畢的程序,必須“匯編匯編”成機器代碼,才能調(diào)試成機器代碼,才能調(diào)試 和運行,調(diào)試與硬件有關(guān)
20、程序還要借助于仿真開發(fā)和運行,調(diào)試與硬件有關(guān)程序還要借助于仿真開發(fā) 工具并與硬件連接。工具并與硬件連接。 4.2 4.2 匯編語言源程序的匯編匯編語言源程序的匯編 匯編語言源程序匯編語言源程序 “翻譯翻譯”成機器代碼(指令代碼)的過成機器代碼(指令代碼)的過 程稱為程稱為“匯編匯編”。匯編可分為。匯編可分為手工匯編手工匯編和和機器匯編機器匯編兩兩 類類: : 4.2.1 4.2.1 手工匯編手工匯編 人工查表翻譯指令人工查表翻譯指令。但遇到的相對轉(zhuǎn)移指令的偏移量。但遇到的相對轉(zhuǎn)移指令的偏移量 的計算,要根據(jù)轉(zhuǎn)移的目標地址計算偏移量,不但的計算,要根據(jù)轉(zhuǎn)移的目標地址計算偏移量,不但 麻煩,且容易
21、出錯。麻煩,且容易出錯。 4.2.2 4.2.2 機器匯編機器匯編 用編輯軟件進行源程序的編輯。編輯完成后,生成一用編輯軟件進行源程序的編輯。編輯完成后,生成一 個個ASCIIASCII碼文件,擴展名為碼文件,擴展名為“.ASM.ASM”。然后在微計算。然后在微計算 機上運行匯編程序,把匯編語言源程序翻譯成機器機上運行匯編程序,把匯編語言源程序翻譯成機器 代碼。代碼。由于由于匯編后的機器代碼是在另一臺計算機匯編后的機器代碼是在另一臺計算機 (這里是單片機)上運行,所以也稱為(這里是單片機)上運行,所以也稱為交叉匯編交叉匯編。 MCS-51MCS-51單片機的應(yīng)用程序的完成,應(yīng)經(jīng)過三個步驟;單片
22、機的應(yīng)用程序的完成,應(yīng)經(jīng)過三個步驟; (1 1)在微計算機上,運行編輯程序進行源程序的輸入)在微計算機上,運行編輯程序進行源程序的輸入 和編輯;和編輯; (2 2)對源程序進行交叉匯編得到機器代碼;)對源程序進行交叉匯編得到機器代碼; (3 3)通過微計算機的串行口(或并行口)把機器代碼)通過微計算機的串行口(或并行口)把機器代碼 傳送到傳送到用戶樣機(或在線仿真器用戶樣機(或在線仿真器)進行程序的調(diào)試)進行程序的調(diào)試 和運行。和運行。 第(第(1 1)步,只需在微計算機上使用通用的編輯軟件即)步,只需在微計算機上使用通用的編輯軟件即 可完成??赏瓿?。 第(第(2 2)步的交叉匯編所用的匯編程
23、序可在購買單片機)步的交叉匯編所用的匯編程序可在購買單片機 的仿真開發(fā)工具時,由廠商提供。的仿真開發(fā)工具時,由廠商提供。 第(第(3 3)步驟的實現(xiàn)要借助于單片機仿真開發(fā)工具進行。)步驟的實現(xiàn)要借助于單片機仿真開發(fā)工具進行。 反匯編反匯編分析現(xiàn)成產(chǎn)品的程序,要將二進制的機器分析現(xiàn)成產(chǎn)品的程序,要將二進制的機器 代碼語言程序翻譯成匯編語言源程序。代碼語言程序翻譯成匯編語言源程序。 例例4-24-2 下面是一段源程序的匯編結(jié)果,讀者可通過查下面是一段源程序的匯編結(jié)果,讀者可通過查 第第3 3章的表章的表3-33-3至表至表3-7 3-7 ,進行手工匯編,來驗證下,進行手工匯編,來驗證下 面的匯編結(jié)
24、果是否正確。面的匯編結(jié)果是否正確。 4.3 4.3 匯編語言實用程序設(shè)計匯編語言實用程序設(shè)計 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)、分支結(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é)構(gòu)和結(jié)構(gòu)和多分支多分支結(jié)構(gòu)。結(jié)構(gòu)。 3 3循環(huán)
25、結(jié)構(gòu)循環(huán)結(jié)構(gòu) 程序中含有可以反復(fù)執(zhí)行程序中含有可以反復(fù)執(zhí)行 的程序段,該程序段通常的程序段,該程序段通常 稱為循環(huán)體。稱為循環(huán)體。 優(yōu)點:優(yōu)點:縮短程序長度,節(jié)縮短程序長度,節(jié) 省內(nèi)存單元數(shù),使程序結(jié)省內(nèi)存單元數(shù),使程序結(jié) 構(gòu)緊湊且可讀性變好。構(gòu)緊湊且可讀性變好。 4 4子程序子程序 將需要多次應(yīng)用的,完將需要多次應(yīng)用的,完 成相同的某種基本操作成相同的某種基本操作 的程序段從程序中獨立的程序段從程序中獨立 出來,單獨編成一個程出來,單獨編成一個程 序段,需要時通過指令序段,需要時通過指令 進行調(diào)用。這樣的程序進行調(diào)用。這樣的程序 段稱為子程序,段稱為子程序,子程序子程序 的最后必須以子程序返
26、的最后必須以子程序返 回指令回指令RETRET指令結(jié)束。指令結(jié)束。 5. 5. 中斷服務(wù)程序中斷服務(wù)程序 中斷服務(wù)子程序是為響應(yīng)請求某個中斷源的中斷請中斷服務(wù)子程序是為響應(yīng)請求某個中斷源的中斷請 求服務(wù)的獨立程序段,與子程序類似求服務(wù)的獨立程序段,與子程序類似. . 中斷服務(wù)子程序與普通子程序的區(qū)別在于:中斷服務(wù)子程序與普通子程序的區(qū)別在于: 必須以中斷子程序返回指令必須以中斷子程序返回指令RETIRETI指令結(jié)束。指令結(jié)束。 CPUCPU執(zhí)行中斷服務(wù)程序的時機是隨機的。執(zhí)行中斷服務(wù)程序的時機是隨機的。 4.3.2 4.3.2 子程序的設(shè)計子程序的設(shè)計 一、子程序設(shè)計原則和應(yīng)注意的問題一、子程
27、序設(shè)計原則和應(yīng)注意的問題 一種能完成某一特定任務(wù)的程序段一種能完成某一特定任務(wù)的程序段。其資源要為所。其資源要為所 有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨 立性和通用性,立性和通用性,在編寫子程序時應(yīng)注意以下問題:在編寫子程序時應(yīng)注意以下問題: 1 1子程序的第一條指令的地址稱為子程序的入口地子程序的第一條指令的地址稱為子程序的入口地 址。該指令前址。該指令前必須有標號必須有標號。 2 2主程序調(diào)用子程序主程序調(diào)用子程序 兩條子程序調(diào)用指令:兩條子程序調(diào)用指令: (1 1)絕對調(diào)用指令:)絕對調(diào)用指令:ACALL addr11ACALL add
28、r11 (2 2)長調(diào)用指令:)長調(diào)用指令:LCALL addr16LCALL addr16 3 3注意設(shè)置堆棧指針和現(xiàn)場保護注意設(shè)置堆棧指針和現(xiàn)場保護 4 4最后一條指令必須是最后一條指令必須是RETRET指令指令 5 5子程序可以嵌套,即子程序可以調(diào)用子程序子程序可以嵌套,即子程序可以調(diào)用子程序 6 6在子程序調(diào)用時,還要注意參數(shù)傳遞的問題在子程序調(diào)用時,還要注意參數(shù)傳遞的問題 二、二、 子程序的基本結(jié)構(gòu)子程序的基本結(jié)構(gòu) MAINMAIN: ;MAINMAIN為主程序或調(diào)用程序標號為主程序或調(diào)用程序標號 LCALL SUB LCALL SUB ;調(diào)用子程序;調(diào)用子程序SUBSUB SUBS
29、UB:PUSH PSWPUSH PSW;現(xiàn)場保護;現(xiàn)場保護 PUSH ACCPUSH ACC; 子程序處理程序段子程序處理程序段 POP ACCPOP ACC;現(xiàn)場恢復(fù);現(xiàn)場恢復(fù) POP PSWPOP PSW; RETRET;最后一條指令必須為;最后一條指令必須為RETRET 例例4-34-3 單字節(jié)有符號數(shù)的加減法子程序(自己閱讀)單字節(jié)有符號數(shù)的加減法子程序(自己閱讀) MAIN: MAIN:;主程序入口;主程序入口 LCALL SUB1LCALL SUB1; ;調(diào)用減法子程序調(diào)用減法子程序 LCALL ADD1LCALL ADD1; ;調(diào)用加法子程序調(diào)用加法子程序 SUB1:SUB1:
30、MOV A,R3MOV A,R3; ; CPL ACC.7CPL ACC.7; ;符號位取反符號位取反 MOV R3MOV R3,A A ADD1ADD1:MOV A,R3MOV A,R3 ACALL CMPT ACALL CMPT ; ;調(diào)用單字節(jié)求補子程序調(diào)用單字節(jié)求補子程序CMPT,CMPT,加加/ /減數(shù)求補減數(shù)求補 MOV R3MOV R3,A A MOV A,R2MOV A,R2 ACALL CMPTACALL CMPT; ;調(diào)用調(diào)用CMPTCMPT ADD A,R3ADD A,R3 JB OV,OVERJB OV,OVER ACALL CMPT1ACALL CMPT1 ; ;調(diào)用
31、單字節(jié)補轉(zhuǎn)原子程序調(diào)用單字節(jié)補轉(zhuǎn)原子程序CMPT1CMPT1 MOV R7MOV R7,A A OVER:OVER: RETRET CMPT:CMPT: RETRET CMPT1CMPT1: RETRET 本例中本例中參數(shù)傳遞是通過累加器參數(shù)傳遞是通過累加器A A完成的完成的,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送,主程序?qū)⒈晦D(zhuǎn)換的數(shù)送 到到A A中,子程序?qū)⒅?,子程序?qū) A中的有符號數(shù)求補后存于中的有符號數(shù)求補后存于A A中,主程序再中,主程序再 將結(jié)果放回原來的單元。將結(jié)果放回原來的單元。 例例4-44-4 4 4位位BCDBCD碼的減法程序(自己閱讀)碼的減法程序(自己閱讀) 主程序通過主程序通過地址寄
32、存器地址寄存器R0R0和和R1R1將參加運算的將參加運算的BCDBCD碼的地碼的地 址傳遞給子程序址傳遞給子程序,子程序則通過累加器將差傳遞給子程序則通過累加器將差傳遞給 主程序。主程序。 4.3.3 4.3.3 查表程序設(shè)計查表程序設(shè)計 數(shù)據(jù)補償、修正、計算、轉(zhuǎn)換等各種功能,具有程序數(shù)據(jù)補償、修正、計算、轉(zhuǎn)換等各種功能,具有程序 簡單、執(zhí)行速度快等優(yōu)點。簡單、執(zhí)行速度快等優(yōu)點。 查表就是根據(jù)自變量查表就是根據(jù)自變量x,x,在表格中尋找在表格中尋找y,y,使使y=f(x)y=f(x)。 執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖/PSEN/PSEN。 指令
33、系統(tǒng),給用戶提供了指令系統(tǒng),給用戶提供了兩條極為有用的查表指令:兩條極為有用的查表指令: MOVC A MOVC A,A+DPTRA+DPTR MOVC A MOVC A,A+PCA+PC 指令指令“MOVC AMOVC A,A+DPTRA+DPTR”完成把完成把A A中的內(nèi)容作為一個無中的內(nèi)容作為一個無 符號數(shù)與符號數(shù)與DPTRDPTR中的內(nèi)容相加,所得結(jié)果為某一程序中的內(nèi)容相加,所得結(jié)果為某一程序 存儲單元的地址,然后把該地址單元中的內(nèi)容送到存儲單元的地址,然后把該地址單元中的內(nèi)容送到 累加器累加器A A中。中。 指令指令“MOVC AMOVC A,A+PCA+PC”以以PCPC作為基址寄
34、存器,作為基址寄存器,PCPC的內(nèi)容的內(nèi)容 和和A A的內(nèi)容作為無符號數(shù),相加后所得的數(shù)作為某一的內(nèi)容作為無符號數(shù),相加后所得的數(shù)作為某一 程序存儲器單元的地址,根據(jù)地址取出程序存儲器程序存儲器單元的地址,根據(jù)地址取出程序存儲器 相應(yīng)單元中的內(nèi)容送到累加器相應(yīng)單元中的內(nèi)容送到累加器A A中。中。 指令執(zhí)行完指令執(zhí)行完,PC,PC的內(nèi)容不發(fā)生變化,仍指向查表指令的內(nèi)容不發(fā)生變化,仍指向查表指令 的下一條指令。的下一條指令。 優(yōu)點優(yōu)點: :預(yù)處理較少且不影響其它特殊功能寄存器的值,預(yù)處理較少且不影響其它特殊功能寄存器的值, 所以不必保護其它特殊功能寄存器的原先值所以不必保護其它特殊功能寄存器的原先
35、值 缺點缺點: :在于該表格只能存放在這條指令的地址在于該表格只能存放在這條指令的地址 X3X2X1X0X3X2X1X0以下的以下的0000FFHFFH之中。之中。表格所在的程序空表格所在的程序空 間受到了限制。間受到了限制。表格長度不能超過表格長度不能超過256256個字節(jié),且個字節(jié),且 表格只能存放于表格只能存放于MOVC A,A+PCMOVC A,A+PC指令以下的指令以下的256256個單個單 元中。元中。 例例4-54-5 子程序的功能為:根據(jù)累加器子程序的功能為:根據(jù)累加器A A中的數(shù)中的數(shù)x x(0 0 9 9之間)查之間)查x x的平方表的平方表y y,根據(jù),根據(jù)x x的值查出
36、相應(yīng)的平方的值查出相應(yīng)的平方 y y。x x和和y y均為單字節(jié)數(shù)。均為單字節(jié)數(shù)。 地地 址址 子程序子程序 Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+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 A
37、 ADD A,#01H #01H 的作用是加上偏移量,可的作用是加上偏移量,可 以根據(jù)以根據(jù)A A的內(nèi)容查出的內(nèi)容查出X X對應(yīng)的平方。對應(yīng)的平方。 MOVC AMOVC A,A+DPTRA+DPTR 這條指令的應(yīng)用范圍較為廣泛,一這條指令的應(yīng)用范圍較為廣泛,一 般情況下,般情況下,大多使用該指令大多使用該指令,使用該指令時不必計,使用該指令時不必計 算偏移量,使用該指令的算偏移量,使用該指令的優(yōu)點優(yōu)點是表格可以設(shè)在是表格可以設(shè)在64K64K程程 序存儲器空間內(nèi)的任何地方,而不像序存儲器空間內(nèi)的任何地方,而不像 MOVC A MOVC A, A+PCA+PC那樣只設(shè)在那樣只設(shè)在PCPC下面的下
38、面的256256個單元中,使用較方個單元中,使用較方 便。便。 上面的程序可改成如下形式:上面的程序可改成如下形式: PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTRMOV 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 RET T A B 1 : D B 0 0 HT A B 1 : D B 0 0 H , 0 1 H0 1 H , 0 4
39、H0 4 H , 0 9 H0 9 H , 1 0 H 1 0 H DB 19H DB 19H,24H24H,31H31H,40H40H,51H51H 例例4-64-6 在一個以在一個以MCS-51MCS-51為核心的為核心的溫度控制器溫度控制器中,溫度中,溫度 傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸 出的電壓已由出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進制數(shù)。根據(jù)測得的位二進制數(shù)。根據(jù)測得的 不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個表,表中放溫度不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個表,表中放溫度 值值y y,x x為電壓值數(shù)據(jù)。設(shè)測得的電壓值為電壓值
40、數(shù)據(jù)。設(shè)測得的電壓值x x放入放入R2R3R2R3中,中, 根據(jù)電壓值根據(jù)電壓值x x,查找對應(yīng)的溫度值,查找對應(yīng)的溫度值y y,仍放入,仍放入R2R3R2R3中。中。 本例的本例的x x和和y y均為雙字節(jié)無符號數(shù)。程序如下:均為雙字節(jié)無符號數(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,AXCH R2,A ADD A,DPL ADD A,DPL ;(;(R
41、2R3R2R3)+ +(DPTRDPTR)(DPTRDPTR) MOV DPL,A MOV DPL,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 A CLR A INC DPTR INC DPTR MOVC A,A+DPTR MOVC A,A+DPTR ;查第二字節(jié);查第二字節(jié) MOV R3,A MOV R3,A ;第二字節(jié)存入
42、;第二字節(jié)存入R3R3中中 RETRET TAB2: TAB2: DWDW ;溫度值表;溫度值表 例例4-74-7 設(shè)有一個設(shè)有一個巡回檢測報警裝置巡回檢測報警裝置,需對,需對1616路輸入路輸入 進行檢測,進行檢測,每路有一最大允許值,為雙字節(jié)數(shù)。每路有一最大允許值,為雙字節(jié)數(shù)。 運行時,需根據(jù)測量的路數(shù),找出每路的最大允運行時,需根據(jù)測量的路數(shù),找出每路的最大允 許值。看輸入值是否大于最大允許值,如大于就許值。看輸入值是否大于最大允許值,如大于就 報警。根據(jù)上述要求,編一個查表程序。報警。根據(jù)上述要求,編一個查表程序。 取路數(shù)為取路數(shù)為x(0 x15),yx(0 x15),y為最大允許值,
43、放在表格中。設(shè)為最大允許值,放在表格中。設(shè) 進入查表程序前,路數(shù)進入查表程序前,路數(shù)x x已放于已放于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 ;加偏移量;加偏移量 MOVC A,A+PC MOVC A,A+PC ;查第一字節(jié);查第
44、一字節(jié) XCH A,R3XCH A,R3;1;1 ADD A,#3ADD A,#3;2;2 MOVC A,A+PC MOVC A,A+PC ;1 1 查第二字節(jié)查第二字節(jié) MOV R4,AMOV R4,A;1;1 RETRET;1;1 TAB3: TAB3: DWDW 1520 1520,37213721,4264542645,7580 7580 ;最大值表;最大值表 DWDW 3483 3483,3265732657,883883,99439943 DW DW 10000 10000,4051140511,67586758,89318931 DWDW 4468 4468,58715871,1
45、328413284,2780827808 4.3.4 4.3.4 關(guān)鍵字查找程序設(shè)計關(guān)鍵字查找程序設(shè)計 順序檢索和對分檢索順序檢索和對分檢索 一、順序檢索一、順序檢索 從第從第1 1項開始逐項順序查找,判斷所取數(shù)據(jù)是否與關(guān)鍵項開始逐項順序查找,判斷所取數(shù)據(jù)是否與關(guān)鍵 字相等。字相等。 例例4-84-8 從從5050個字節(jié)的無序表中查找一個關(guān)鍵字個字節(jié)的無序表中查找一個關(guān)鍵字H H。 ORG 1000HORG 1000H MOV 40HMOV 40H,# #H H;關(guān)鍵字;關(guān)鍵字H H送送30H30H單元單元 MOV R1MOV R1,#50#50 ;查找次數(shù)送;查找次數(shù)送R1R1 MOV AM
46、OV A,#20#20 ;修正值送;修正值送A A MOV DPTRMOV DPTR,#TAB4 #TAB4 ;表首地址送;表首地址送DPTR DPTR LOOPLOOP:PUSH ACCPUSH ACC; MOVC AMOVC A, A+PC A+PC;查表結(jié)果送;查表結(jié)果送A A CJNE ACJNE A,40H40H,LOOP1LOOP1;(40H40H)不等于關(guān)鍵字則轉(zhuǎn))不等于關(guān)鍵字則轉(zhuǎn)LOOP1 3LOOP1 3 MOV R2MOV R2,DPHDPH;已查到關(guān)鍵字,把該字已查到關(guān)鍵字,把該字 ;的地址送;的地址送R2R2,R3 2R3 2 MOV R3MOV R3,DPL DPL
47、;2 2 DONEDONE:RETRET;1;1 LOOP1LOOP1:POP POP ACCACC;修正值彈出;修正值彈出 2 2 INC AINC A;A+1A 1A+1A 1 INC DPTRINC DPTR ;修改數(shù)據(jù)指針;修改數(shù)據(jù)指針DPTR 1DPTR 1 DJNZ R1DJNZ R1,LOOP LOOP ;R10R10,未查完,繼續(xù)查找,未查完,繼續(xù)查找 2 2 MOV MOV R2R2,#00H#00H;R1=0R1=0,清,清“0 0” R2 R2 和和R3 2R3 2 MOV MOV R3R3,#00H#00H;表中;表中5050個數(shù)已查完個數(shù)已查完 2 2 AJMPAJM
48、PDONEDONE;從子程序返回;從子程序返回 2 2 TAB4TAB4:DB DB ,;5050個無序數(shù)據(jù)表個無序數(shù)據(jù)表 二、對分檢索二、對分檢索 前提:前提:檢索的數(shù)據(jù)表已經(jīng)排好序,如何進行數(shù)據(jù)的排檢索的數(shù)據(jù)表已經(jīng)排好序,如何進行數(shù)據(jù)的排 序,將在本節(jié)稍后介紹。序,將在本節(jié)稍后介紹。 方法:方法:取數(shù)據(jù)取數(shù)據(jù)表中間位置表中間位置的數(shù)與關(guān)鍵字進行比較,的數(shù)與關(guān)鍵字進行比較,如如 相等相等,則查找到;,則查找到;如果所取的數(shù)大于關(guān)鍵字如果所取的數(shù)大于關(guān)鍵字,則下,則下 次對分檢索的范圍是從數(shù)據(jù)區(qū)起點到本次取數(shù)。次對分檢索的范圍是從數(shù)據(jù)區(qū)起點到本次取數(shù)。如如 果取數(shù)小于關(guān)鍵字果取數(shù)小于關(guān)鍵字,則
49、下次對分檢索的范圍是從本,則下次對分檢索的范圍是從本 次取數(shù)數(shù)據(jù)區(qū)起點到數(shù)據(jù)區(qū)終點。依此類推,逐漸次取數(shù)數(shù)據(jù)區(qū)起點到數(shù)據(jù)區(qū)終點。依此類推,逐漸 縮小檢索范圍,減少次數(shù),大大提高了查找速度。縮小檢索范圍,減少次數(shù),大大提高了查找速度。 4.3.5 4.3.5 數(shù)據(jù)極值查找程序設(shè)計數(shù)據(jù)極值查找程序設(shè)計 在指定的數(shù)據(jù)區(qū)中在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。找出最大值(或最小值)。 進行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或進行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或 最小值)并存于某一單元中。最小值)并存于某一單元中。 例例4-94-9 片內(nèi)片內(nèi)RAMRAM中存放一批數(shù)據(jù),查找出最大值并存
50、中存放一批數(shù)據(jù),查找出最大值并存 放于首地址中。設(shè)放于首地址中。設(shè)R0R0中存首地址,中存首地址,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 A DEC R2DEC R2; MOV AMOV A,R1 R1 LOOP:LOOP:MOV R3MOV R3, A A INC R1INC R1 CLR CCLR C SU
51、BB ASUBB A,R1R1;兩個數(shù)比較;兩個數(shù)比較 JNC LOOP1JNC LOOP1;C=0C=0,A A中的數(shù)大,跳中的數(shù)大,跳LOOP1LOOP1 MOV AMOV A,R1R1;C=1C=1,則大數(shù)送,則大數(shù)送A A SJMP LOOP2SJMP LOOP2 LOOP1:LOOP1:MOV AMOV A,R3 R3 LOOP2:LOOP2:DJNZ R2, LOOPDJNZ R2, LOOP;是否比較結(jié)束?;是否比較結(jié)束? MOV R0MOV R0, A A;存最大數(shù);存最大數(shù) RET RET 4.3.6 4.3.6 數(shù)據(jù)排序程序設(shè)計數(shù)據(jù)排序程序設(shè)計 升序排,降序排升序排,降序排
52、。僅介紹無符號數(shù)據(jù)升序排。僅介紹無符號數(shù)據(jù)升序排。 冒泡法:冒泡法:相鄰數(shù)互換的排序方法,類似水中氣泡上相鄰數(shù)互換的排序方法,類似水中氣泡上 浮浮 。排序時從前向后進行相鄰兩個數(shù)的比較,次。排序時從前向后進行相鄰兩個數(shù)的比較,次 序與要求的順序不符時,就將兩個數(shù)互換;順序符序與要求的順序不符時,就將兩個數(shù)互換;順序符 合要求不互換。合要求不互換。 假設(shè)有假設(shè)有7 7個原始數(shù)據(jù)的排列順序為:個原始數(shù)據(jù)的排列順序為:6 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ù)的
53、排列 4 4、6 6、1 1、2 2、5 5、7 7、3 3 ;逆序,互換;逆序,互換 4 4、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 ;逆序,互換;逆序,互換 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é)束 如此進行,各次冒泡的結(jié)果如下如此進行,各次冒泡的結(jié)果如下:
54、第第1 1次冒泡結(jié)果:次冒泡結(jié)果:4 4、1 1、2 2、5 5、6 6、3 3、7 7 第第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 對于對于n n個數(shù),理論上應(yīng)進行(
55、個數(shù),理論上應(yīng)進行(n-1n-1)次冒泡,有時不到)次冒泡,有時不到 (n-1n-1)次就已完成排序)次就已完成排序 。 如何判定排序是否已完成,看各次冒泡中是否有互換如何判定排序是否已完成,看各次冒泡中是否有互換 發(fā)生,如果有數(shù)據(jù)互換,則排序還沒完成。發(fā)生,如果有數(shù)據(jù)互換,則排序還沒完成。 在程序設(shè)計中,常使用設(shè)置互換標志的方法,該標志在程序設(shè)計中,常使用設(shè)置互換標志的方法,該標志 的狀態(tài)表示在一次冒泡中是否有互換進行。的狀態(tài)表示在一次冒泡中是否有互換進行。 例例4-104-10 一批單字節(jié)無符號數(shù),以一批單字節(jié)無符號數(shù),以R0R0為首地址指針,為首地址指針, R2R2中為字節(jié)數(shù),將這批數(shù)進
56、行升序排列。程序框圖中為字節(jié)數(shù),將這批數(shù)進行升序排列。程序框圖 如圖如圖4-24-2所示。所示。 SORTSORT:MOV AMOV A,R0 R0 ;首地址指針;首地址指針 MOV R1MOV R1,A A;暫存于;暫存于R1R1 MOV AMOV A,R2R2;字節(jié)數(shù)送入;字節(jié)數(shù)送入R5R5 MOV R5MOV R5,A A CLR F0CLR F0;互換標志位;互換標志位F0F0清零清零 DEC R5DEC R5;字節(jié)數(shù)減;字節(jié)數(shù)減1 1 MOV AMOV A,R1R1;首地址中的數(shù)據(jù);首地址中的數(shù)據(jù) LOOP:LOOP:MOV R3MOV R3,A A;R3R3中頭一個數(shù)中頭一個數(shù) I
57、NC R1INC R1; CLR CCLR C; MOV AMOV A,R1R1;比較大小;比較大小 SUBB ASUBB A,R3R3 ; JNC LOOP1JNC LOOP1 ; SETB F0SETB F0;互換標志位;互換標志位F0F0置置1 1 MOV AMOV A,R3R3; XCH AXCH A,R1R1;兩個數(shù)互換;兩個數(shù)互換 DEC R1DEC R1; XCH AXCH A,R1R1; INC R1INC R1 LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,LOOP LOOP JB F0JB F0,SORT SORT RETRET 4.
58、3.7 4.3.7 分支轉(zhuǎn)移程序設(shè)計分支轉(zhuǎn)移程序設(shè)計 特點是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令又分為特點是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令又分為無條件無條件 轉(zhuǎn)移轉(zhuǎn)移和和有條件轉(zhuǎn)移有條件轉(zhuǎn)移,因此分支程序也可分為無條件,因此分支程序也可分為無條件 分支轉(zhuǎn)移程序和有條件分支轉(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) 僅有兩個出口,兩者選一。僅有兩個出口,兩者選一。 例例4-114-11 求
59、單字節(jié)有符號數(shù)的二進制補碼求單字節(jié)有符號數(shù)的二進制補碼 參考程序參考程序: CMPTCMPT:JNB Acc.7,RETURNJNB Acc.7,RETURN;(;(A A)00,不需轉(zhuǎn)換,不需轉(zhuǎn)換 MOV CMOV C,Acc.7Acc.7 ;符號位保存;符號位保存 CPL ACPL A ;(;(A A)求反,加)求反,加1 1 ADD AADD A,#1#1 ; MOV Acc.7MOV Acc.7,C C;符號位存;符號位存A A的最高位的最高位 RETURNRETURN:RETRET 此外,單分支選擇結(jié)構(gòu)還有如圖此外,單分支選擇結(jié)構(gòu)還有如圖4-44-4、圖、圖4-54-5等所示的等所示
60、的 幾種形式:幾種形式: 2多分支轉(zhuǎn)移結(jié)構(gòu)多分支轉(zhuǎn)移結(jié)構(gòu) 程序的判別部分有兩個以上的出口流向。程序的判別部分有兩個以上的出口流向。 常見的兩種形式。如圖常見的兩種形式。如圖4-64-6和圖和圖4-74-7。 指令系統(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,rel CJNE A,#data,rel; CJNE Rn,#data,rel CJNE R
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度園林景觀用樹木租賃合同模板
- 高速公路防護工程勞務(wù)合同(3篇)
- 2025年個人住宅裝修工程協(xié)議書
- 2025年礦權(quán)開采許可協(xié)議策劃范本
- 2025年企業(yè)整體并購協(xié)議書
- 2025年資產(chǎn)重置策劃諒解協(xié)議細則
- 2025年分手策劃協(xié)議書范本
- 2025年高速精密電主軸項目規(guī)劃申請報告模范
- 2025年策劃授權(quán)協(xié)議范本正式版
- 2025年個人租賃私家車合同樣式
- 醫(yī)療器械市場規(guī)劃
- 安徽省合肥市廬陽區(qū)評價2023-2024學(xué)年六年級下學(xué)期小升初數(shù)學(xué)模擬試卷+
- 2024年3月山東省直監(jiān)獄類面試題及參考答案全套
- 新產(chǎn)品研發(fā)工作總結(jié)匯報
- pi粉末成型工藝
- Optix-OSN3500智能化光傳輸設(shè)備業(yè)務(wù)配置手冊范本
- swagelok管接頭安裝培訓(xùn)教程
- 公墓管理考核方案
- 把子肉店創(chuàng)業(yè)計劃書
- 綜合樓裝修改造項目 投標方案(技術(shù)方案)
- 冀教版五年級上冊英語全冊單元測試卷(含期中期末試卷及聽力音頻)
評論
0/150
提交評論