




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第4 4章章 MCS-51MCS-51匯編語言程序設計匯編語言程序設計 匯編語言是面向機器硬件的語言匯編語言是面向機器硬件的語言,要求程序設計者對,要求程序設計者對MCS-51MCS-51單片機具有很好的單片機具有很好的“軟、硬結合軟、硬結合”的功底。的功底。 介紹介紹程序設計的基本知識程序設計的基本知識及如何及如何使用匯編語言來進行使用匯編語言來進行基本的程序設計。基本的程序設計。4.1 4.1 匯編語言程序設計概述匯編語言程序設計概述 4.1.1 4.1.1 機器語言、匯編語言和高級語言機器語言、匯編語言和高級語言用于程序設計的用于程序設計的語言基本上分為語言基本上分為3 3種:機器語言
2、、匯編種:機器語言、匯編語言和高級語言語言和高級語言。 1.1.機器語言機器語言 二進制代碼表示的指令、數字和符號簡稱為機器語言二進制代碼表示的指令、數字和符號簡稱為機器語言 不易懂,難記憶,易出錯。不易懂,難記憶,易出錯。 2匯編語言匯編語言 英文助記符表示的指令稱為英文助記符表示的指令稱為符號語言符號語言或或匯編語言匯編語言將匯編語言程序轉換成為二進制代碼表示的機器語言將匯編語言程序轉換成為二進制代碼表示的機器語言程序稱為程序稱為匯編程序匯編程序經匯編程序經匯編程序“匯編(翻譯)匯編(翻譯)”得到的機器語言程序稱得到的機器語言程序稱為為目標程序目標程序,原來的匯編語言程序稱為,原來的匯編語
3、言程序稱為源程序源程序。匯編語言特點匯編語言特點:面向機器的語言,程序設計員須對面向機器的語言,程序設計員須對MCS-51MCS-51的硬件的硬件有相當深入的了解。有相當深入的了解。(1)(1) 助記符指令和機器指令一一對應,用匯編語言編助記符指令和機器指令一一對應,用匯編語言編寫的寫的程序效率高程序效率高,占用,占用存儲空間小存儲空間小,運行,運行速度快速度快,用匯編語言能編寫出最優化的程序。用匯編語言能編寫出最優化的程序。 能直接管理和控制硬件設備(功能部件),它能處理能直接管理和控制硬件設備(功能部件),它能處理中斷,也能直接訪問存儲器及中斷,也能直接訪問存儲器及I/OI/O接口電路。接
4、口電路。匯編語言和機器語言都脫離不開具體機器的硬件,均匯編語言和機器語言都脫離不開具體機器的硬件,均是面向是面向“機器機器”的語言,缺乏通用性。的語言,缺乏通用性。3 3高級語言高級語言不受具體機器的限制不受具體機器的限制, ,使用了許多數學公式和數學計算使用了許多數學公式和數學計算上的習慣用語,上的習慣用語,非常擅長于科學計算。非常擅長于科學計算。常用的如常用的如BASICBASIC、FORTRANFORTRAN以及以及C C語言等。語言等。高級語言優點:通用性強,直觀、易懂、易學,可讀高級語言優點:通用性強,直觀、易懂、易學,可讀性好。性好。使用使用C C語言(語言(C51C51)、)、P
5、L/MPL/M語言來進行語言來進行MCS-51MCS-51的應用程的應用程序設計。序設計。 對于程序的空間和時間要求很高的場合,匯編語言仍對于程序的空間和時間要求很高的場合,匯編語言仍是必不可缺的。是必不可缺的。 C C語言和匯編語言混合編程語言和匯編語言混合編程 在很多需要直接控制硬件的應用場合,則更是非用匯在很多需要直接控制硬件的應用場合,則更是非用匯編語言不可編語言不可 使用匯編語言編程,是單片機程序設計的使用匯編語言編程,是單片機程序設計的基本功之一基本功之一4.1.2 4.1.2 匯編語言語句的種類和格式匯編語言語句的種類和格式兩種基本類型:指令語句和偽指令語句兩種基本類型:指令語句
6、和偽指令語句(1 1)指令語句)指令語句已在第已在第3 3章介紹章介紹每一條指令語句在匯編時都產生一個指令代碼每一條指令語句在匯編時都產生一個指令代碼機機器代碼器代碼(2 2)偽指令語句)偽指令語句 是為匯編服務的。在匯編時是為匯編服務的。在匯編時沒有機器代碼與之對應。沒有機器代碼與之對應。 MCS-51MCS-51的匯編語言的的匯編語言的四分段格式四分段格式如下:如下: 標號字段標號字段 操作碼字段操作碼字段 操作數字段操作數字段 注釋字段注釋字段規則:規則:(1 1)標號字段和操作字碼段之間要有冒號)標號字段和操作字碼段之間要有冒號“:”相隔;相隔;(2 2)操作碼字段和操作數字段間的分界
7、符是空格;)操作碼字段和操作數字段間的分界符是空格;(3 3)雙操作數之間用逗號相隔;)雙操作數之間用逗號相隔; (4 4)操作數字段和注釋字段之間的分界符用分號)操作數字段和注釋字段之間的分界符用分號“;”相隔。相隔。操作碼字段為必選項,其余各段為任選項。操作碼字段為必選項,其余各段為任選項。例例4-14-1 下面是一段匯編語言程序的四分段書寫格式下面是一段匯編語言程序的四分段書寫格式 標號字段標號字段 操作碼字段操作碼字段 操作數字段操作數字段 注釋字段注釋字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#00000011B ;3R2 LO
8、OP:ADD A,R2 ;(;(A)+(R2)A DJNZ R1,LOOP;R1內容減內容減1不不 為零,則循環為零,則循環 NOP HERE: SJMP HERE基本語法規則:基本語法規則:1 1標號字段標號字段是語句所在地址的標志符號是語句所在地址的標志符號 (1 1)標號后邊必須跟以冒號)標號后邊必須跟以冒號“:” ” (2 2)由)由1 18 8個個ASCIIASCII字符組成字符組成(3 3)同一標號在一個程序中只能定義一次)同一標號在一個程序中只能定義一次 (4 4)不能使用匯編語言已經定義的符號作為標號)不能使用匯編語言已經定義的符號作為標號 2 2操作碼字段操作碼字段 是匯編語
9、言指令中唯一不能空缺的部分。匯編程序就是匯編語言指令中唯一不能空缺的部分。匯編程序就是根據這一字段來生成機器代碼的。是根據這一字段來生成機器代碼的。3 3操作數字段操作數字段 通常有單操作數、雙操作數和無操作數三種情況。如通常有單操作數、雙操作數和無操作數三種情況。如果是雙操作數,則操作數之間,要以逗號隔開。果是雙操作數,則操作數之間,要以逗號隔開。(1 1)十六進制、二進制和十進制形式的操作數表示)十六進制、二進制和十進制形式的操作數表示 采用十六進制形式來表示采用十六進制形式來表示 ,某些特殊場合才采用二,某些特殊場合才采用二進制或十進制的表示形式進制或十進制的表示形式 。十六進制,后綴十
10、六進制,后綴“H”H” 。二進制,后綴二進制,后綴“B”B” 。十進制,后綴十進制,后綴“D”D”,也可省略也可省略。若十六進制的若十六進制的操作數以字符操作數以字符A AF F中的某個開頭時,則中的某個開頭時,則需在它需在它前面加一個前面加一個 “ “0”0”,以便在匯編時把它和字,以便在匯編時把它和字符符A AF F區別開來。區別開來。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代號來表示,也采用工作寄存器和特殊功能寄存器的代號來表示,也可用其地址來表示。可用其地址來表示。 例如,累加器可用例如,累加器可用A A(或(或Acc
11、Acc)表示。也可用)表示。也可用0E0H0E0H來表來表示,示,0E0H0E0H為累加器為累加器A A的地址。的地址。(3 3)美元符號)美元符號$ $的使用的使用用于表示該轉移指令操作碼所在的地址。例如,如下用于表示該轉移指令操作碼所在的地址。例如,如下指令:指令: JNB F0JNB F0, $ $與如下指令是等價的:與如下指令是等價的:HEREHERE:JNB F0JNB F0,HEREHERE 再如:再如:HEREHERE:SJMP HERESJMP HERE可寫為:可寫為: SJMP $SJMP $4 4注釋字段注釋字段 必須以分號必須以分號“;”開頭,換行書寫,但必須注意也要開頭
12、,換行書寫,但必須注意也要以分號以分號“;”開頭。開頭。 匯編時,注釋字段不會產生機器代碼。匯編時,注釋字段不會產生機器代碼。4.1.3 4.1.3 偽指令偽指令在在MCS-51 MCS-51 匯編語言源程序中應有向匯編程序發出的指匯編語言源程序中應有向匯編程序發出的指示信息,告訴它如何完成匯編工作,這是通過使用示信息,告訴它如何完成匯編工作,這是通過使用偽指令來實現的。偽指令來實現的。也稱為匯編程序控制命令。只有在匯編前的源程序中也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經過匯編得到目標程序(機器代碼)才有偽指令。經過匯編得到目標程序(機器代碼)后,偽指令已無存在的必要,所以
13、后,偽指令已無存在的必要,所以“偽偽”體現在匯體現在匯編時,編時,偽指令沒有相應的機器代碼產生偽指令沒有相應的機器代碼產生。常用的偽指令常用的偽指令: 1.ORG1.ORG(ORiGinORiGin)匯編起始地址命令)匯編起始地址命令 在匯編語言源程序的開始,通常都用一條在匯編語言源程序的開始,通常都用一條ORGORG偽指令偽指令來實現規定程序的起始地址。如不用來實現規定程序的起始地址。如不用ORGORG規定,則規定,則匯編得到的目標程序將從匯編得到的目標程序將從0000H0000H開始。開始。例如:例如: ORG 2000HORG 2000HSTARTSTART:MOV A,#00HMOV
14、A,#00H規定標號規定標號STARTSTART代表地址為代表地址為2000H2000H開始。開始。在一個源程序中,可多次使用在一個源程序中,可多次使用ORGORG指令,來規定不同指令,來規定不同的程序段的起始地址。但是,的程序段的起始地址。但是,地址必須由小到大排地址必須由小到大排列,地址不能交叉、重疊列,地址不能交叉、重疊。例如:。例如:ORG 2000HORG 2000H ORG 2500HORG 2500H ORG 3000HORG 3000H2. 2. END(END of assembly)END(END of assembly)匯編終止命令匯編終止命令匯編語言源程序的結束標志,用
15、于終止源程序的匯匯編語言源程序的結束標志,用于終止源程序的匯編工作。在整個源程序中只能有一條編工作。在整個源程序中只能有一條ENDEND命令,且命令,且位于程序的最后。位于程序的最后。3 3DBDB(Define ByteDefine Byte)定義字節命令)定義字節命令在程序存儲器的連續單元中定義字節數據。在程序存儲器的連續單元中定義字節數據。 ORG 2000HORG 2000HDB 30HDB 30H,40H40H,2424,“C”C”,“B”B”匯編后:匯編后:(2000H2000H)=30H=30H(2001H2001H)=40H=40H(2002H2002H)=18H=18H(10
16、10進制數進制數2424)(2003H2003H)=43H=43H(字符(字符“C”C”的的ASCIIASCII碼)碼)(2004H2004H)=42H=42H(字符(字符“B”B”的的ASCIIASCII碼)碼)DBDB功能是從指定單元開始定義(存儲)若干個字節,功能是從指定單元開始定義(存儲)若干個字節,1010進制數自然轉換成進制數自然轉換成1616進制數,字母按進制數,字母按ASCIIASCII碼存碼存儲。儲。4 4DWDW(Define WordDefine Word)定義數據字命令)定義數據字命令從指定的地址開始,在程序存儲器的連續單元中定義從指定的地址開始,在程序存儲器的連續單元
17、中定義1616位的數據字。例如:位的數據字。例如:ORG 2000HORG 2000HDW 1246HDW 1246H,7BH7BH,1010匯編后:匯編后:(2000H2000H)=12H=12H;第;第1 1個字個字(2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2個字個字(2003H2003H)=7BH=7BH(2004H2004H)=00H=00H;第;第3 3個字(個字(2005H2005H)=0AH=0AH(2005H2005H)=0AH =0AH 5 5EQUEQU(EQUateEQUate)賦值命令)賦值命令用于給標號賦值。賦值以
18、后,其標號值在整個程序有用于給標號賦值。賦值以后,其標號值在整個程序有效。例如:效。例如:TEST EQU 2000HTEST EQU 2000H表示標號表示標號TEST=2000HTEST=2000H,在匯編時,凡是遇到標號,在匯編時,凡是遇到標號TESTTEST時,均以時,均以2000H2000H來代替。來代替。 4.1.4 4.1.4 匯編語言程序設計步驟匯編語言程序設計步驟(1 1)分析問題,確定算法)分析問題,確定算法(2 2)根據算法,畫出程序框圖)根據算法,畫出程序框圖(3 3)分配內存工作區及有關端口地址)分配內存工作區及有關端口地址(4 4)編寫程序)編寫程序養成在程序的適當
19、位置上加上注釋的好習慣。養成在程序的適當位置上加上注釋的好習慣。(5 5)上機調試)上機調試編寫完畢的程序,必須編寫完畢的程序,必須“匯編匯編”成機器代碼,才能調成機器代碼,才能調試和運行,調試與硬件有關程序還要借助于仿真開試和運行,調試與硬件有關程序還要借助于仿真開發工具并與硬件連接。發工具并與硬件連接。4.2 4.2 匯編語言源程序的匯編匯編語言源程序的匯編匯編語言源程序匯編語言源程序 “ “翻譯翻譯”成機器代碼(指令代碼)的成機器代碼(指令代碼)的過程稱為過程稱為“匯編匯編”。匯編可分為。匯編可分為手工匯編手工匯編和和機器匯機器匯編編兩類兩類: :4.2.1 4.2.1 手工匯編手工匯編
20、人工查表翻譯指令人工查表翻譯指令。但遇到的相對轉移指令的偏移量。但遇到的相對轉移指令的偏移量的計算,要根據轉移的目標地址計算偏移量,不但的計算,要根據轉移的目標地址計算偏移量,不但麻煩,且容易出錯。麻煩,且容易出錯。4.2.2 4.2.2 機器匯編機器匯編用編輯軟件進行源程序的編輯。編輯完成后,生成一用編輯軟件進行源程序的編輯。編輯完成后,生成一個個ASCIIASCII碼文件,擴展名為碼文件,擴展名為“.ASM”.ASM”。然后在微計算。然后在微計算機上運行匯編程序,把匯編語言源程序翻譯成機器機上運行匯編程序,把匯編語言源程序翻譯成機器代碼。代碼。交叉匯編交叉匯編匯編后的機器代碼是在另一臺計算
21、機(這匯編后的機器代碼是在另一臺計算機(這里是單片機)上運行。里是單片機)上運行。 MCS-51MCS-51單片機的應用程序的完成,應經過三個步驟;單片機的應用程序的完成,應經過三個步驟;(1 1)在微計算機上,運行編輯程序進行源程序的輸入)在微計算機上,運行編輯程序進行源程序的輸入 和編輯;和編輯; (2 2)對源程序進行交叉匯編得到機器代碼;)對源程序進行交叉匯編得到機器代碼;(3 3)通過微計算機的串行口(或并行口)把機器代碼)通過微計算機的串行口(或并行口)把機器代碼傳送到傳送到用戶樣機(或在線仿真器用戶樣機(或在線仿真器)進行程序的調試)進行程序的調試和運行。和運行。第(第(1 1)
22、步,只需在微計算機上使用通用的編輯軟件)步,只需在微計算機上使用通用的編輯軟件即可完成。即可完成。第(第(2 2)步的交叉匯編所用的匯編程序可在購買單片)步的交叉匯編所用的匯編程序可在購買單片機的仿真開發工具時,由廠商提供。機的仿真開發工具時,由廠商提供。第(第(3 3)步驟的實現要借助于單片機仿真開發工具進)步驟的實現要借助于單片機仿真開發工具進行。行。反匯編反匯編分析現成產品的程序,要將二進制的機器分析現成產品的程序,要將二進制的機器代碼語言程序翻譯成匯編語言源程序。代碼語言程序翻譯成匯編語言源程序。例例4-24-2 下面是一段源程序的匯編結果,讀者可通過查下面是一段源程序的匯編結果,讀者
23、可通過查第第3 3章的表章的表3-33-3至表至表3-7 3-7 ,進行手工匯編,來驗證下,進行手工匯編,來驗證下面的匯編結果是否正確。面的匯編結果是否正確。 見表見表4-14-1(P75P75) 4.3 4.3 匯編語言實用程序設計匯編語言實用程序設計 4.3.1 4.3.1 匯編語言程序的基本結構形式匯編語言程序的基本結構形式常采用以下幾種基本結構:常采用以下幾種基本結構: 順序結構、分支結構和循環結構,再加上廣泛使用順序結構、分支結構和循環結構,再加上廣泛使用的子程序和中斷服務子程序。的子程序和中斷服務子程序。 1 1順序結構順序結構 2 2分支結構分支結構 程序中含有轉移指令,程序中含
24、有轉移指令, 無條件分支,有條件分支無條件分支,有條件分支。 有條件分支又分為:有條件分支又分為:單分支單分支結構和結構和多分支多分支結構。結構。 3 3循環結構循環結構 4 4子程序子程序 5 5中斷服務子程序中斷服務子程序4.3.2 4.3.2 子程序的設計子程序的設計一、子程序設計原則和應注意的問題一、子程序設計原則和應注意的問題 一種能完成某一特定任務的程序段一種能完成某一特定任務的程序段。其資源要為所。其資源要為所有調用程序共享。因此,子程序在結構上應具有獨有調用程序共享。因此,子程序在結構上應具有獨立性和通用性,立性和通用性,在編寫子程序時應注意以下問題:在編寫子程序時應注意以下問
25、題: 1 1子程序的第一條指令的地址稱為子程序的入口地子程序的第一條指令的地址稱為子程序的入口地址。該指令前址。該指令前必須有標號必須有標號。 2 2主程序調用子程序主程序調用子程序 兩條子程序調用指令:兩條子程序調用指令: (1 1)絕對調用指令:)絕對調用指令:ACALL addr11ACALL addr11 (2 2)長調用指令:)長調用指令:LCALL addr16LCALL addr163 3注意設置堆棧指針和現場保護注意設置堆棧指針和現場保護4 4最后一條指令必須是最后一條指令必須是RETRET指令指令5 5子程序可以嵌套,即子程序可以調用子程序子程序可以嵌套,即子程序可以調用子程
26、序6 6在子程序調用時,還要注意參數傳遞的問題在子程序調用時,還要注意參數傳遞的問題 二、二、 子程序的基本結構子程序的基本結構 MAINMAIN: ;MAINMAIN為主程序或調用程序標號為主程序或調用程序標號 LCALL SUB LCALL SUB ;調用子程序;調用子程序SUBSUB SUBSUB:PUSH PSWPUSH PSW ;現場保護;現場保護 PUSH ACCPUSH ACC ; 子程序處理程序段子程序處理程序段POP ACCPOP ACC;現場恢復;現場恢復POP PSWPOP PSW; RETRET;最后一條指令必須為;最后一條指令必須為RETRET例例4-34-3 單字節
27、有符號數的加減法子程序(自己閱讀)單字節有符號數的加減法子程序(自己閱讀) 本例中參數傳遞是通過累加器本例中參數傳遞是通過累加器A A完成的,主程序將完成的,主程序將被轉換的數送到被轉換的數送到A A中,子程序將中,子程序將A A中的有符號數求補中的有符號數求補后存于后存于A A中,主程序再將結果放回原來的單元。中,主程序再將結果放回原來的單元。 例例4-44-4 4 4位位BCDBCD碼的減法程序(自己閱讀)碼的減法程序(自己閱讀) 主程序通過地址寄存器主程序通過地址寄存器R0R0和和R1R1將參加運算的將參加運算的BCDBCD碼的地碼的地址傳遞給子程序,子程序則通過累加器將差傳遞給址傳遞給
28、子程序,子程序則通過累加器將差傳遞給主程序。主程序。4.3.3 4.3.3 查表程序設計查表程序設計 數據補償、修正、計算、轉換等各種功能,具有程序數據補償、修正、計算、轉換等各種功能,具有程序簡單、執行速度快等優點。簡單、執行速度快等優點。查表就是根據自變量查表就是根據自變量x,x,在表格中尋找在表格中尋找y,y,使使y=f(x)y=f(x)。執行查表指令時,發出讀程序存儲器選通脈沖執行查表指令時,發出讀程序存儲器選通脈沖/PSEN/PSEN。在在MCS-51MCS-51的指令系統中,給用戶提供了的指令系統中,給用戶提供了兩條極為有兩條極為有用的查表指令:用的查表指令: MOVC A MOV
29、C A,A+DPTRA+DPTR MOVC A MOVC A,A+PCA+PC指令指令“MOVC AMOVC A,A+DPTR”A+DPTR”完成把完成把A A中的內容作為一個中的內容作為一個無符號數與無符號數與DPTRDPTR中的內容相加,所得結果為某一程中的內容相加,所得結果為某一程序序存儲單元的地址,然后把該地址單元中的內容送到累存儲單元的地址,然后把該地址單元中的內容送到累加器加器A A中。中。指令指令“MOVC AMOVC A,A+PC”A+PC”以以PCPC作為基址寄存器,作為基址寄存器,PCPC的的內容和內容和A A的內容作為無符號數,相加后所得的數作的內容作為無符號數,相加后所
30、得的數作為某一程序存儲器單元的地址,根據地址取出程序為某一程序存儲器單元的地址,根據地址取出程序存儲器相應單元中的內容送到累加器存儲器相應單元中的內容送到累加器A A中。中。指令執行完指令執行完,PC,PC的內容不發生變化,仍指向查表指令的內容不發生變化,仍指向查表指令的下一條指令。的下一條指令。優點優點在于預處理較少且不影響其它在于預處理較少且不影響其它特殊功能寄存器的值,所以不必保護其它特殊功能特殊功能寄存器的值,所以不必保護其它特殊功能寄存器的原先值。寄存器的原先值。缺點缺點在于該表格只能存放在這條在于該表格只能存放在這條指令的地址指令的地址X3X2X1X0X3X2X1X0以下的以下的0
31、000FFHFFH之中。表格之中。表格所所在的程序空間受到了限制。在的程序空間受到了限制。例例4-54-5 子程序的功能為:根據累加器子程序的功能為:根據累加器A A中的數中的數x x(0 09 9之間)查之間)查x x的平方表的平方表y y,根據,根據x x的值查出相應的平方的值查出相應的平方y y。x x和和y y均為單字節數。均為單字節數。 地地 址址 子程序子程序Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+2 MOVC A,A+PCY3Y2Y1Y0+3 RETY3Y2Y1Y0+3 RET
32、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 的作用是加上偏移量,可以的作用是加上偏移量,可以根據根據A A的內容查出的內容查出X X對應的平方。對應的平方。 MOVC AMOVC A,+DPTR +DPTR 這條指令的應用范圍較為廣泛,一般這條指令的應用范圍較為廣泛,一般情況下,大多使用該指令,使用該指令時不必計算情況下,大多使用該指令,使用該指令時
33、不必計算偏移量,使用該指令的優點是表格可以設在偏移量,使用該指令的優點是表格可以設在64K64K程序程序存儲器空間內的任何地方,而不像存儲器空間內的任何地方,而不像 MOVC AMOVC A,A+PCA+PC那樣只設在那樣只設在PCPC下面的下面的256256個單元中,使用較方便。個單元中,使用較方便。 上面的程序可改成如下形式:上面的程序可改成如下形式: PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTR MOV DPTR,#TAB1#TAB1 MOVC A MOVC A,A+DPTRA+DPTR PO
34、P DPL POP DPL ;恢復;恢復DPLDPL POP DPH POP DPH ;恢復;恢復DPHDPH RET RETTAB1: DB 00HTAB1: DB 00H,01H01H,04H04H,09H09H,10H 10H DB 19H DB 19H,24H24H,31H31H,40H40H,51H51H例例4-64-6 在一個以在一個以MCS-51MCS-51為核心的溫度控制器中,溫度為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關系,傳感器輸傳感器輸出的電壓與溫度為非線性關系,傳感器輸出的電壓已由出的電壓已由A/DA/D轉換為轉換為1010位二進制數。根據測得的位二進制
35、數。根據測得的不同溫度下的電壓值數據構成一個表,表中放溫度不同溫度下的電壓值數據構成一個表,表中放溫度 值值y y,x x為電壓值數據。設測得的電壓值為電壓值數據。設測得的電壓值x x放入放入R2R3R2R3中,中,根據電壓值根據電壓值x x,查找對應的溫度值,查找對應的溫度值y y,仍放入,仍放入R2R3R2R3中。中。本例的本例的x x和和y y均為雙字節無符號數。程序如下:均為雙字節無符號數。程序如下: LTB2LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A,R3 MOV A,R3 CLR C CLR C RLC A RLC A MOV R3,A MOV
36、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) MOV DPL,AMOV 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 ;查第一字節;查第一字節 MOV R2,A MOV R2,A ;第一字節存入;第一字節存入R2R2中中 CLR ACLR A INC DPT
37、R INC DPTR MOVC A,A+DPTR MOVC A,A+DPTR ;查第二字節;查第二字節 MOV R3,A MOV R3,A ;第二字節存入;第二字節存入R3R3中中 RETRET TAB2:DW TAB2:DW ;溫度值表;溫度值表例例4-74-7 設有一個巡回檢測報警裝置,需對設有一個巡回檢測報警裝置,需對1616路輸入進路輸入進行檢測,每路有一最大允許值,為雙字節數。運行行檢測,每路有一最大允許值,為雙字節數。運行時,需根據測量的路數,找出每路的最大允許值。時,需根據測量的路數,找出每路的最大允許值。看輸入值是否大于最大允許值,如大于就報警。根看輸入值是否大于最大允許值,如
38、大于就報警。根據上述要求,編一個查表程序。據上述要求,編一個查表程序。 取路數為取路數為x(0 x15),yx(0 x15),y為最大允許值,放在表格中。為最大允許值,放在表格中。設進入查表程序前,路數設進入查表程序前,路數x x已放于已放于R2R2中,查表后最中,查表后最大值大值y y放于放于R3R4R3R4中。本例中的中。本例中的x x為單字節數,為單字節數,y y為雙為雙字節數。查表程序如下:字節數。查表程序如下: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 ;保存指針
39、;保存指針 ADD A,#6 ADD A,#6 ;加偏移量;加偏移量MOVC A,A+PC MOVC A,A+PC ;查第一字節;查第一字節XCH A,R3XCH A,R3 ADD A,#3ADD A,#3 MOVC A,A+PC MOVC A,A+PC ;查第二字節;查第二字節 MOV R4,AMOV R4,ARETRET TAB3: TAB3: DW 1520DW 1520,37213721,4264542645,7580 7580 ;最大值;最大值 ;表;表 DW 3483DW 3483,3265732657,883883,99439943 DW 10000 DW 10000,40511
40、40511,67586758,89318931 DW 4468 DW 4468,58715871,1328413284,2780827808表格長度不能超過表格長度不能超過256256個字節,且表格只能存放于個字節,且表格只能存放于MOVC MOVC A,A+PCA,A+PC指令以下的指令以下的256256個單元中。個單元中。4.3.4 4.3.4 關鍵字查找程序設計關鍵字查找程序設計順序檢索和對分檢索順序檢索和對分檢索一、順序檢索一、順序檢索 從第從第1 1項開始逐項順序查找,判斷所取數據是否與關鍵項開始逐項順序查找,判斷所取數據是否與關鍵字相等。字相等。例例4-84-8 從從5050個字節
41、的無序表中查找一個關鍵字個字節的無序表中查找一個關鍵字”H”H。 ORG 1000HORG 1000HMOV 30HMOV 30H,# #H H;關鍵字;關鍵字H H送送30H30H單元單元MOV R1MOV R1,#50#50;查找次數送;查找次數送R1R1MOV AMOV A,#14#14;修正值送;修正值送A A MOV DPTRMOV DPTR,#TAB4 #TAB4 ;表首地址送;表首地址送DPTRDPTRLOOPLOOP:PUSH ACCPUSH ACC MOVC A MOVC A, A+PC A+PC;查表結果送;查表結果送A A CJNE A CJNE A,40H40H,LOO
42、P1LOOP1;(;(40H40H)不等于關鍵)不等于關鍵字則轉字則轉LOOP1LOOP1 MOV R2 MOV R2,DPHDPH ;已查到關鍵字,把該字;已查到關鍵字,把該字 ;的地址送;的地址送R2R2,R3R3 MOV R3 MOV R3,DPL DPL ;DONEDONE:RETRETLOOP1LOOP1:POP ACCPOP ACC ;修正值彈出;修正值彈出 INC AINC A ;A+1AA+1A INC DPTR INC DPTR ;修改數據指針;修改數據指針DPTRDPTR DJNZ R1 DJNZ R1,LOOP LOOP ;R10R10,未查完,繼續查找,未查完,繼續查找
43、 MOV R2MOV R2,#00H#00H ;R1=0R1=0,清,清“0” R2 0” R2 和和R3R3 MOV R3 MOV R3,#00H#00H ;表中;表中5050個數已查完個數已查完 AJMPAJMPDONEDONE;從子程序返回;從子程序返回TAB4TAB4:DB DB , ;5050個無序數據表個無序數據表二、對分檢索二、對分檢索前提:前提:檢索的數據表已經排好序,如何進行數據的排檢索的數據表已經排好序,如何進行數據的排序,將在本節稍后介紹。序,將在本節稍后介紹。方法:方法:取數據表中間位置的數與關鍵字進行比較,如取數據表中間位置的數與關鍵字進行比較,如相等,則查找到;如果
44、所取的數大于關鍵字,則下相等,則查找到;如果所取的數大于關鍵字,則下次對分檢索的范圍是從數據區起點到本次取數。如次對分檢索的范圍是從數據區起點到本次取數。如果取數小于關鍵字,則下次對分檢索的范圍是從本果取數小于關鍵字,則下次對分檢索的范圍是從本次取數數據區起點到數據區終點。依此類推,逐漸次取數數據區起點到數據區終點。依此類推,逐漸縮小檢索范圍,減少次數,大大提高了查找速度。縮小檢索范圍,減少次數,大大提高了查找速度。4.3.5 4.3.5 數據極值查找程序設計數據極值查找程序設計在指定的數據區中找出最大值(或最小值)。在指定的數據區中找出最大值(或最小值)。進行數值大小的比較,從這批數據中找出
45、最大值(或進行數值大小的比較,從這批數據中找出最大值(或最小值)并存于某一單元中。最小值)并存于某一單元中。例例4-94-9 片內片內RAMRAM中存放一批數據,查找出最大值并存中存放一批數據,查找出最大值并存放于首地址中。設放于首地址中。設R0R0中存首地址,中存首地址,R2R2中存放字節數,中存放字節數,程序框圖如圖程序框圖如圖4-14-1所示。所示。程序如下:程序如下: MOV R2MOV R2,n n;n n為要比較的數據字節數為要比較的數據字節數MOV AMOV A,R0R0;存首地址指針;存首地址指針MOV R1MOV R1,A ADEC R2DEC R2; MOV AMOV A,
46、R1 R1 LOOP:LOOP: MOV R3 MOV R3, A A DEC R1 DEC R1 CLR C CLR C SUBB A SUBB A,R1R1;兩個數比較;兩個數比較 JNC LOOP1JNC LOOP1;C=0C=0,A A中的數大,跳中的數大,跳LOOP1LOOP1 MOV A MOV A,R1R1;C=1C=1,則大數送,則大數送A A SJMP LOOP2 SJMP LOOP2LOOP1:MOV ALOOP1:MOV A,R3 R3 LOOP2:DJNZ R2, LOOPLOOP2:DJNZ R2, LOOP;是否比較結束?;是否比較結束? MOV R0MOV R0,
47、 A A ;存最大數;存最大數 RET RET 4.3.6 4.3.6 數據排序程序設計數據排序程序設計升序排,降序排升序排,降序排。僅介紹無符號數據升序排。僅介紹無符號數據升序排。冒泡法:冒泡法:相鄰數互換的排序方法,類似水中氣泡上相鄰數互換的排序方法,類似水中氣泡上浮浮 。排序時從前向后進行相鄰兩個數的比較,次。排序時從前向后進行相鄰兩個數的比較,次序與要求的順序不符時,就將兩個數互換;順序符序與要求的順序不符時,就將兩個數互換;順序符合要求不互換。合要求不互換。 假設有假設有7 7個原始數據的排列順序為:個原始數據的排列順序為:6 6、4 4、1 1、2 2、5 5、7 7、3 3。第一
48、次冒泡的過程是:。第一次冒泡的過程是:6 6、4 4、1 1、2 2、5 5、7 7、3 3 ;原始數據的排列;原始數據的排列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 ;逆序,互換
49、,第一次冒;逆序,互換,第一次冒泡結束泡結束如此進行,各次冒泡的結果如下:如此進行,各次冒泡的結果如下:第第1 1次冒泡結果:次冒泡結果:4 4、1 1、2 2、5 5、6 6、3 3、7 7第第2 2次冒泡結果:次冒泡結果:1 1、2 2、4 4、5 5、3 3、6 6、7 7第第3 3次冒泡結果:次冒泡結果:1 1、2 2、4 4、3 3、5 5、6 6、7 7第第4 4次冒泡結果:次冒泡結果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 ;已完成排序;已完成排序第第5 5次冒泡結果:次冒泡結果:1 1、2 2、3 3、4 4、5 5、6 6、7 7第第6 6次冒泡結果:次冒泡結
50、果:1 1、2 2、3 3、4 4、5 5、6 6、7 7 對于對于n n個數,理論上應進行(個數,理論上應進行(n-1n-1)次冒泡,有時不到)次冒泡,有時不到(n-1n-1)次就已完成排序)次就已完成排序 。如何判定排序是否已完成,看各次冒泡中是否有互換如何判定排序是否已完成,看各次冒泡中是否有互換發生,如果有數據互換,則排序還沒完成。發生,如果有數據互換,則排序還沒完成。在程序設計中,常使用設置互換標志的方法,該標志在程序設計中,常使用設置互換標志的方法,該標志的狀態表示在一次冒泡中是否有互換進行。的狀態表示在一次冒泡中是否有互換進行。例例4-10 4-10 一批單字節無符號數,以一批單
51、字節無符號數,以R0R0為首地址指針,為首地址指針,R2R2中為字節數,將這批數進行升序排列。程序框圖中為字節數,將這批數進行升序排列。程序框圖如圖如圖4-24-2所示。所示。SORTSORT:MOV AMOV A,R0 R0 ;MOV R1MOV R1,A AMOV AMOV A,R2R2;字節數送入;字節數送入R5R5MOV R5MOV R5,A ACLR F0CLR F0;互換標志位;互換標志位F0F0清零清零DEC R5DEC R5;MOV AMOV A,R1R1; LOOP:LOOP:MOV R3MOV R3,A A;INC R1INC R1;CLR CCLR C;MOV AMOV
52、A,R1R1;比較大小;比較大小SUBB ASUBB A,R3R3;JNC LOOP1JNC LOOP1;SETB F0SETB F0;互換標志位;互換標志位F0F0置置1 1MOV AMOV A,R3R3;XCH AXCH A,R1R1;兩個數互換;兩個數互換DEC R1DEC R1;XCH AXCH A,R1R1;INC R1 INC R1 LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,LOOP LOOP JB F0JB F0,SORT SORT RETRET4.3.7 4.3.7 分支轉移程序設計分支轉移程序設計特點是程序中含有轉移指令,轉移指令有
53、分為特點是程序中含有轉移指令,轉移指令有分為無條件無條件轉移轉移和和有條件轉移有條件轉移,因此分支程序也可分為無條件,因此分支程序也可分為無條件分支轉移程序和有條件分支轉移程序。有條件分支分支轉移程序和有條件分支轉移程序。有條件分支轉移程序按結構類型來分,又分為轉移程序按結構類型來分,又分為單分支轉移單分支轉移結構結構和和多分支轉移多分支轉移結構結構。一、分支轉移結構一、分支轉移結構 1 1單分支轉移結構單分支轉移結構 僅有兩個出口,兩者選一。僅有兩個出口,兩者選一。例例4-114-11 求單字節有符號數的二進制補碼求單字節有符號數的二進制補碼參考程序參考程序:CMPTCMPT:JNB Acc
54、.7,RETURNJNB Acc.7,RETURN;(;(A A)00,不需轉換,不需轉換MOV CMOV C,Acc.7Acc.7;符號位保存;符號位保存CPL ACPL A;(;(A A)求反,加)求反,加1 1ADD AADD A,#1#1; MOV Acc.7MOV Acc.7,C C;符號位存;符號位存A A的最高位的最高位RETURNRETURN:RETRET此外,單分支選擇結構還有如圖此外,單分支選擇結構還有如圖4-44-4、圖、圖4-54-5等所示的等所示的幾種形式:幾種形式: 2多分支轉移結構多分支轉移結構 程序的判別部分有兩個以上的出口流向。程序的判別部分有兩個以上的出口流
55、向。常見的兩種形式。如圖常見的兩種形式。如圖4-64-6和圖和圖4-74-7。 指令系統提供了非常有用的兩種多分支選擇指令指令系統提供了非常有用的兩種多分支選擇指令: : 間接轉移指令間接轉移指令: JMP A+DPTR;: JMP A+DPTR;比較轉移指令比較轉移指令: 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;最簡單的分支轉移程序的設計,一般常采用
56、逐次比較最簡單的分支轉移程序的設計,一般常采用逐次比較法,就是把所有不同的情況一個一個的進行比較,法,就是把所有不同的情況一個一個的進行比較,發現符合就轉向對應的處理程序。這種方法的主要發現符合就轉向對應的處理程序。這種方法的主要缺點是程序太長,有缺點是程序太長,有n n種可能的情況,就需有種可能的情況,就需有n n個判個判斷和轉移。斷和轉移。 例例4-12 4-12 求符號函數的值。求符號函數的值。 程序框圖如圖程序框圖如圖4-64-6所示。所示。 程序程序略。略。在實際的應用中,經常遇到的圖在實際的應用中,經常遇到的圖4-74-7結構形式的分支結構形式的分支轉移程序的設計轉移程序的設計 。
57、需根據某一單元的內容是需根據某一單元的內容是0 0,1 1,n n,來分別轉,來分別轉向處理程序向處理程序0 0,處理程序,處理程序1 1,處理程序處理程序n n。一個。一個典型的例子就是當單片機系統中的鍵盤按下時,典型的例子就是當單片機系統中的鍵盤按下時,就會得到一個鍵值,根據不同的鍵值,跳向不同就會得到一個鍵值,根據不同的鍵值,跳向不同的鍵處理程序入口。對于這種情況,可用直接轉的鍵處理程序入口。對于這種情況,可用直接轉移指令(移指令(LJMPLJMP或或AJMPAJMP指令)組成一個轉移表,然指令)組成一個轉移表,然后把該單元的內容讀入累加器后把該單元的內容讀入累加器A A,轉移表首地址放
58、,轉移表首地址放入入DPTRDPTR中,再利用間接轉移指令實現分支轉移。中,再利用間接轉移指令實現分支轉移。 例例4-124-12 根據寄存器根據寄存器R2R2的內容,轉向各個處理程序的內容,轉向各個處理程序PRGXPRGX(X=0X=0n n)。)。(R2R2)=0=0,轉,轉PRG0PRG0(R2R2)=1=1,轉,轉PRG1PRG1 (R2R2)=n, =n, 轉轉PRGnPRGn4.3.8 4.3.8 循環程序設計循環程序設計 特點是程序中含有可以反復執行的程序段,該程序段特點是程序中含有可以反復執行的程序段,該程序段通常稱為循環體。例如求通常稱為循環體。例如求100100個數的累加和
59、,則沒個數的累加和,則沒有必要連續安排有必要連續安排100100條加法指令,可以只用一條加條加法指令,可以只用一條加法指令并使其循環執行法指令并使其循環執行100100次。次。 (1 1)可大大縮短程序長度()可大大縮短程序長度(2 2)使程序所占的內存單)使程序所占的內存單元數量少(元數量少(3 3)使程序結構緊湊和可讀性變好。)使程序結構緊湊和可讀性變好。一、循環程序的結構一、循環程序的結構循環結構程序主要由以下四部分組成。循環結構程序主要由以下四部分組成。 1 1循環初始化循環初始化循環初始化程序段用于完成循環前的的準備工作。例循環初始化程序段用于完成循環前的的準備工作。例如,循環控制計
60、數初值的設置、地址指針的起始地如,循環控制計數初值的設置、地址指針的起始地址的設置、為變量預置初值等。址的設置、為變量預置初值等。 2 2循環處理循環處理循環程序結構的核心部分,完成實際的處理工作,是循環程序結構的核心部分,完成實際的處理工作,是需反復循環執行的部分,故又稱循環體。這部分程需反復循環執行的部分,故又稱循環體。這部分程序的內容,取決于實際處理問題的本身。序的內容,取決于實際處理問題的本身。 3 3循環控制循環控制在重復執行循環體的過程中在重復執行循環體的過程中, ,不斷修改循環控制變量,不斷修改循環控制變量,直到符合結束條件直到符合結束條件, ,就結束循環程序的執行。循環就結束循
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025城市中學班主任疫情德育工作計劃
- 創業貸款用款計劃書范文
- PEP小學英語五年級下冊學生活動計劃
- 教師信息化教學能力教材開發計劃
- 部編版六年級上冊語文興趣培養計劃
- 某健康保健電商全年銷售運營推廣計劃
- 學校總務信息安全計劃
- 新版幼兒園中班幼小銜接工作計劃
- 小學三年級中隊學習困難學生幫扶計劃他
- 媒體傳播行業實習經歷與成果證明書(5篇)
- 衛生部手術分級目錄(2023年1月份修訂)
- LY/T 2121-2013檀香栽培技術規程
- GB/T 8312-2002茶咖啡堿測定
- 通信線路工程施工組織設計方案【實用文檔】doc
- 護士注冊健康體檢表下載【可直接打印版本】
- 預計財務報表編制及分析課件
- 骨科出科試題帶答案
- 河道基槽土方開挖專項施工方案
- 現代美國玉米商業育種的種質基礎概要
- GB∕T 4162-2022 鍛軋鋼棒超聲檢測方法
- 中醫治療室工作制度管理辦法
評論
0/150
提交評論