




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、成都電子機械高等專科學校電氣系成都電子機械高等專科學校電氣系 傅林傅林 第四章 匯編語言程序設計第第4 4章章 匯編語言程序設計匯編語言程序設計4.1 4.1 概概 述述4.2 4.2 匯編語言偽指令匯編語言偽指令4.3 4.3 簡單程序設計簡單程序設計4.4 4.4 循環程序設計循環程序設計4.5 4.5 子程序設計子程序設計4.6 4.6 查表及散轉程序設計查表及散轉程序設計4.7 4.7 實用程序舉例實用程序舉例l 4.1.1 4.1.1 程序設計語言簡介程序設計語言簡介l 1.1.機器語言機器語言l 當指令和地址采用二進制代碼表示時,機器能夠直接識別,因此稱為機器語言。l 機器指令代碼
2、是0和1構成的二進制數信息,與機器的硬件操作一一對應。l 使用機器語言可以充分發揮計算機硬件的功能。l 但是,機器語言難寫、難讀、難交流,而且機器語言隨計算機的型號不同而不同,因此移植困難。然而,無論人們使用什么語言編寫程序,最終都必須翻譯成機器語言,機器才能執行。4.1 4.1 概概 述述l 2. 2.匯編語言匯編語言l 匯編語言是采用易于人們記憶的助記符表示的程序設計語言,方便人們書寫、閱讀和檢查。一般情況下,匯編語言與機器語言一一對應。l 用匯編語言編寫的程序稱為匯編語言源程序(源程序)。l 把匯編語言源程序翻譯成機器語言程序的過程稱為匯編,完成匯編過程的程序稱為匯編程序,匯編產生的結果
3、是機器語言程序(目標程序).l 匯編語言源程序從目標代碼的長度和程序運行時間上看與機器語言程序是等效的。不同系列的機器有不同的匯編語言,因此匯編語言源程序在不同的機器之間不能通用。l 3. 3.高級語言高級語言l 高級語言是對計算機操作步驟進行描述的一整套標記符號、表達格式、結構及其使用的語法規則。 l 它是一種面向過程的語言,使用一些接近人們書寫習慣的英語和數學表達式的語言去編寫程序,使用方便,通用性強,不依賴于具體計算機。目前,世界上的高級語言有數百種。l 用高級語言編寫的源程序,同樣需要翻譯成用各種機器語言表示的目標程序,計算機才能解釋執行,完成翻譯過程的程序稱為編譯程序或解釋程序。高級
4、語言程序所對應的目標代碼往往比機器語言要長的多,運行時間也更多。匯編語言和高級語言相比具有下列優點:占用的內存單元和CPU資源少執行速度快有效的利用計算機的專有特性。適合實時控制 可計算程序運行時間上頁下頁回目錄MOV P1, A如: 輸出操作匯編語言程序設計的步驟:分析任務,建立數學模型確定算法制定流程圖確定數據結構編寫源程序代碼上機調試上頁下頁回目錄4.1.2 4.1.2 匯編語言源程序的設計步驟匯編語言源程序的設計步驟 匯編匯編l1.1.分析任務分析任務l 當我們要編寫某個功能的應用程序時,首先應該詳細分析給定的任務。明確哪些是任務所提供的基本條件,哪些是任務要解決的具體問題,哪些是任務
5、所期望的最終目標。l l 任務明確之后,下一步就是確定解決問題的方法。l 將給定的任務轉換成計算機處理模式,即通常所說的算法。對于較復雜的任務,需要先用數學方法把問題抽象出來。往往同一個數學表達式可以用多種算法實現,我們應綜合考慮尋找出其中的最佳方案,使程序所占內存小,運行時間短。l 2.2.確定算法確定算法 4.1.2 4.1.2 匯編語言源程序的設計步驟匯編語言源程序的設計步驟l3.3.畫程序流程圖畫程序流程圖l畫流程圖是把所采用的算法轉換為匯編語言程序的準備階段,選擇合適的程序結構,把整個任務細化成若干個小的功能,使每個小功能只對應幾條語句。4.1.2 4.1.2 匯編語言源程序的設計步
6、驟匯編語言源程序的設計步驟 匯編匯編流程圖常用符號開始和結束符號任務處理符號判斷選擇符號程序連接符號程序流向符號目標:用自然語言表示算法組成:執行框(矩形框)判別框(菱形框)開始框和終止框指向線連接點三種基本結構n順序結構n選擇結構n循環結構l4.4.分配資源,確定數據結構分配資源,確定數據結構l在用匯編語言進行程序設計時,我們直接面向的是計算機的最底層資源。在編寫代碼之前需要對內存區域進行分配,并確定程序和數據的存放地址。4.1.2 4.1.2 匯編語言源程序的設計步驟匯編語言源程序的設計步驟 匯編匯編l 5. 5.編寫代碼編寫代碼l 在畫好流程圖并分配了相關資源后,就可以編寫程序代碼了。注
7、意: 編寫完成的源程序應以“.ASM”的擴展名保存,以備匯編程序調用。l 6.6.程序修改與調試程序修改與調試l 當一個匯編語言程序編好后難免有錯誤或需要進一步優化的地方,必須進行調試、修改。在源程序的匯編過程中用戶很容易發現程序中存在的語法錯誤,但查找和修改程序中的邏輯錯誤就不那么簡單,我們需要借助開發系統所提供的程序單步操作或設置斷點等調試手段予以排除。4.1.2 4.1.2 匯編語言源程序的設計步驟匯編語言源程序的設計步驟 匯編匯編匯編語言程序的結構定義有關字符名定義程序的起始地址程序主體匯編結束標志匯編語言程序設計屬于結構化程序設計。結構化程序設計的特點:只有一個入口只有一個出口各功能
8、框均可執行結構中無死循環l偽指令是用于告訴匯編程序如何進行匯編的指令,它不控制機器的操作也不能被匯編成機器碼,只為匯編程序所識別并指導匯編如何進行。l MCS-51MCS-51系列單片機的常用偽指令如下系列單片機的常用偽指令如下: : 4.2 4.2 匯編語言偽指令匯編語言偽指令 l l 1.ORG1.ORG起始地址定義偽指起始地址定義偽指l 令格式: ORG16位地址l 功能: 規定目標程序在程序存儲器中所占空間的起始地址。l 例如: ORG1000H 表示后面的數據或程序存放在從1000H開始的程序存儲單元中。l 2.END 2.END匯編程序結束偽指令匯編程序結束偽指令l 格式: END
9、l 功能: 標志源程序的結束,即通知匯編程序不再繼續向下匯編。l 3.EQU 3.EQU宏代換偽指令宏代換偽指令l 格式: 符號EQU字符串l 功能: 在程序中用EQU后面的字符串去替換EQU前面的符號。l EQU后面的字符串可以是符號、數據地址、代碼地址或位地址。l 說明: EQU偽指令所定義的符號必須先定義后使用。l 所以該語句一般放在程序開始。例如:l BUFFER EQU 58H ;BUFFER的值為58Hl MOV A,BUFFER ;表示內部RAM58H單元中數據送給累加器A l 4.DATA4.DATA數值賦值偽指令數值賦值偽指令l 格式: 符號名稱DATA表達式l 功能: 將表
10、達式指定的數據地址或代碼地址賦予符號名稱。l 說明: DATA偽指令功能與EQU偽指令相似,但是DATA所定義的符號可以先使用后定義。該語句一般放在程序開始或結尾。l 例如:l BUFFER DATA58H ;BUFFER的值為58Hl MOV A,BUFFER ;表示內部RAM58H單元中數據送給累加器Al 5.DB5.DB字節存儲偽指令字節存儲偽指令l 格式:標號:DB8位二進制數據表l 功能: 從指定的地址單元開始,定義若干個字節存儲單元的內容。 l 【例】 l ORG 100Hl FIRST:DB 01H,02Hl SECO:DB 011B,A,12l 以上偽指令經匯編后,程序存儲器有
11、關單元l 如圖4-1所示。l 其中偽指令中的011B為二進制數,A為字l 符A的ASCII碼41H,12為十進制數。l 另外,格式中的標號為可選項。 圖圖4-1 4-1 例例4.14.1示意圖示意圖 l 6.DW6.DW字存儲偽指令字存儲偽指令l 格式:標號:DW16位二進制數據表l 功能: 從指定的地址單元開始,定義若干個字存儲單元的內容。l 【例4.2】 l ORG 100Hl FIRST: DW 01Hl DW 1234H,AB l 以上偽指令經匯編后,程序存儲器有關單元l 如圖4-2所示。l 其中16位數據的高8位存入低地址單元,低8l 位存入高地址單元。l 格式中的標號為可選項。圖圖
12、4-2 4-2 例例4.24.2示意圖示意圖 l 7.DS7.DS定義空間偽指令定義空間偽指令l 格式:標號:DS表達式l 功能: 從指定的地址單元開始,保留由表達式指定的若干字節空間作為備用空間。l 例如:l ORG 1000Hl DS 0AHl DB 12H,Bl 偽指令匯編后從1000H單元開始,保留10個字節,從100AH開始連續存放12H、42H。l 8.BIT 8.BIT位地址符號偽指令位地址符號偽指令l 格式: 字符名稱BIT位地址l 功能: 用規定的字符名稱表示位地址。l 例如:l X0 BIT P1.0l X1 BIT 30Hl 經匯編后,P1口的第0位地址賦給X0,位地址3
13、0H賦給X1。l 在程序中可以分別用X0、X1代替P1.0和位地址30H。 結構化程序設計l 結構化程序設計(structured programming)是進行以模塊功能和處理過程設計為主的詳細設計的基本原則。其概念最早由E.W.Dijikstra在1965年提出的,是軟件發展的一個重要的里程碑。它的主要觀點是采用自頂向下、逐步求精的程序設計方法;使用三種基本控制結構構造程序,任何程序都可由順序、選擇、循環三種基本控制結構構造 。l 優點:n 整體思路清楚,目標明確。 n 設計工作中階段性非常強,有利于系統開發的總體管理和控制。 n 在系統分析時可以診斷出原系統中存在的問題和結構上的缺陷。l
14、 缺點缺點n 用戶要求難以在系統分析階段準確定義,致使系統在交付使用時產生許多問題。 n 用系統開發每個階段的成果來進行控制,不能適應事物變化的要求。 n 系統的開發周期長。4.3 4.3 程序設計程序設計 l 4.3.1 4.3.1 順序程序設計順序程序設計l 順序結構的程序,是指程序按指令的排列順序依次執行直至程序結束。這種結構是程序結構中最簡單的一種,用程序流程圖表示的順序結構程序,是一個處理框緊接一個處理框。順序結構表示程序中的各操作是按照它們出現的先后順序執行的。 A B B A P A P 成立 成立 不成立 不成立 a b b b a a 最左邊:順序結構圖最左邊:順序結構圖 中
15、間和右邊:選擇結構圖中間和右邊:選擇結構圖4.3.1 4.3.1 順序程序設計順序程序設計l 例41 已知X、Y、Z分別為片內RAM 30H、31H、32H單元的內容,設XY,試編程完成下式的算術運算:S=(X-Y)*Z, 并將計算結果S存入片內RAM 34H(高字節)、35H(低字節)單元中。l 由于XY,所以X-Y0,不需要借位;(X-Y)*Z的結果最多占用兩個字節。實現該要求的程序流程圖如圖右所示。開始AXAA-Y, BZB、A AB(34H)B(35H)A結束程序清單如下: ORG0030HSTART: MOVA, 30H ;(A)X SUBBA, 31H ;(A)(A)-X MOVB
16、, 32H ;(B)Z MULAB MOV34H, B ;(34H)A*B的高字節 MOV35H, A ;(35H)A*B的低字節 SJMP$例42 編寫雙字節無符號數乘法程序。被乘數高字節放在R2中,低字節存放在R3中,乘數高字節放在R6中,低字節放在R7中。乘積在R2、R3、R4、R5中。程序段如下:MOV A, R3 ;R3R7MOV B, R7MUL ABMOV R4, B ;暫存部分積MOV R5, AMOV A, R3MOV B, R6 ;R3R6MUL ABADD A, R4 ;累加部分積MOV R4, ACLR AADDC A, BMOV R3, AMOV A, R2 ; R2
17、R7MOV B, R7MUL AB ADD A, R4 ;累加部分積MOV R4, AMOV A, R3ADDC A, BMOV R3, ACLR ARLC AXCH A, R2 ;R2R6MOV B, R6MUL ABADD A, R3 ;累加部分積MOV R3, AMOV A, R2ADDC A, BMOV R2, A練習:將練習:將30H單元內的兩位單元內的兩位BCD碼拆開并轉換成碼拆開并轉換成ASCII碼,存入碼,存入RAM31H、32H兩個單元中。兩個單元中。ORG1000H MOVA,30H ;取值;取值 ANLA,#0FH ;取低;取低4位位ADDA,#30H ;轉換成;轉換成A
18、SCII碼碼MOV32H,A ;保存結果;保存結果MOVA,30H ;取值;取值SWAPA ;高;高4位與低位與低4位互換位互換ANLA,#0FH ;取低;取低4位(原來的高位(原來的高4位)位)ADDA,#30H ;轉換成;轉換成ASCII碼碼MOV31H,A ;保存結果;保存結果 SJMP$ 結束取數據低4位轉換成ASCII碼存ASCII碼取數據高4位轉換成ASCII碼存ASCII碼開始l 4.3.2 4.3.2 分支程序設計分支程序設計l 分支程序是按照給定的條件進行判斷,根據不同的情況使程序發生轉移,選擇不同的程序入口。l 通常用條件轉移指令形成簡單分支結構。例如,判斷結果是否為0(J
19、Z、JNZ)、是否有進位或借位(JC、JNC)、指定位是否為1(JB、JNB)、比較指令CJNE等都可作為分支依據。l 條件滿足?AYN(a)條件滿足?ABNY(b)(c)A0A1AnK=0 K=1 K=nK=?分支程序設計l 在內部RAM單元的30H和31H中各有一無符號數,試比較其大小,大數存入40H單元,小數存入41H單元,若相等則存入42H單元。程序流程框圖如下圖所示。開 始A(30H)A=(31H)?(A)(42H)YA(31H)?(A)(41H)(31H)(40H)(A)(40H)(31H)(41H)結 束程序如下: MOV A, 30H CJNE A, 31H, K1 MOV 4
20、2H, A AJMP WAITK1: JNC K2 MOV 41H, A MOV 40H, 31H AJMP WAITK2: MOV 40H, A MOV 41H, 31HWAIT: AJMP $4.4 4.4 循環程序設計循環程序設計l 4.4.1 4.4.1 循環結構循環結構l 順序程序中每條指令只執行一次,分支程序則依據條件不同會跳過一些指令,執行另一部分指令。這兩種程序的特點是每條指令最多只執行一次。循環結構基本流程圖如右圖所示。實質上,有如下圖所示兩種循環機制:DO_WHILE結構、DO_UNTIL結構開始結束初始化循環體循環控制循環結束?NY 循環控制條件 循環體 循環初始狀態 循
21、環初始狀態 循環體 循環控制條件 l 在處理實際問題時,常常要求某些程序段重復執行,此時應采用循環結構實現。l 一般包含程序初始化、循環處理、循環控制和循環結束四部分。l (1 1)初始化部分)初始化部分l 為實現程序循環做準備,如建立循環計數器、設地址指針以及為變量賦初值等。l (2 2)循環處理部分)循環處理部分l 該部分是循環程序的主體,在這里對數據進行實際的處理,是重復執行部分,所以這段程序的設計非常關鍵,應充分考慮程序的效率。l (3 3)循環控制部分)循環控制部分l 為下一次數據處理而修改計數器和地址指針,并判斷循環是否結束。l (4 4)結束部分)結束部分l 分析、處理或存放結果
22、。循環結構補充l 循環結構循環結構l 循環結構表示程序反復執行某個或某些操作,直到某條件為假(或為真)時才可終止循環。在循環結構中最主要的是:什么情況下執行循環?哪些操作需要循環執行?循環結構的基本形式有兩種:當型循環和直到型循環。 l 當型循環當型循環:表示先判斷條件,當滿足給定的條件時執行循環體,并且在循環終端處流程自動返回到循環入口;如果條件不滿足,則退出循環體直接到達流程出口處。因為是“當條件滿足時執行循環”,即先判斷后執行,所以稱為當型循環。 l 直到型循環直到型循環:表示從結構入口處直接執行循環體,在循環終端處判斷條件,如果條件不滿足,返回入口處繼續執行循環體,直到條件為真時再退出
23、循環到達流程出口處,是先執行后判斷。因為是直到條件為真時為止,所以稱為直到型循環。l 4.4.2 4.4.2 單重循環程序設計單重循環程序設計l 1.1.循環次數已知的循環程序循環次數已知的循環程序l 【例4.8】 從60H單元開始的連續單元中有l 一個無符號數的數據塊,其長度在5FH中,編程l 求數據塊的最大值,存入5EH單元。l 分析分析: :l 假設累加器A中有最大值00H,然后逐個取出l 數據塊中的數據與之進行比較。l 如果當前數據大于累加器A的數據,則把數l 據塊中的數據送給累加器A; 圖圖4-4 4-4 例例4.84.8程序流程圖程序流程圖 l 否則累加器A的內容不變,即保證累加器
24、A中存放的是每次比較出的較大數。l 如此循環,直至比較完最后一個數。累加器A中存放的便是所有數據中的最大值。程序流程如圖4-4所示。l 源程序源程序: :l ORG 1000Hl CLR Al MOV B,5FHl MOV R0,#60H l LOOP: CLR Cl SUBB A,R0l JC L1l ADD A,R0l SJMP L2l L1: XCH A,R0l L2: INC R0l DJNZ B,LOOPl MOV 5EH,A l SJMP l END l 【例4.9】 編程確定一個數據塊中負元素的個數。假設數據塊的長度存放在內部RAM51H單元,數據塊從內部RAM52H單元開始存放
25、,要求將負元素的個數存放在50H單元中。l 分析分析: : l 判斷有符號數值的正負可以通過判斷該數值的最高位來完成。l 如果最高位為1,則該數為負;否則該數為正。l 另外,統計負數個數,需要在程序初始化時將存l 放負元素個數的單元清零,以便在循環中進行個l 數累計,流程圖如圖4-5所示。l 源程序源程序: :l ORG 1000Hl MOV R0,#52H l MOV R2,#00Hl MOV B,51H l LOOP: MOV A,R0l JNB Acc.7,NEXT l INC R2圖圖4-5 4-5 例例4.94.9程序流程圖程序流程圖 l NEXT: INC R0l DJNZ B,L
26、OOP l MOV 50H,R2l SJMP l ENDl 2.2.循環次數未知的循環程序循環次數未知的循環程序l 【例4.10】 從 60H單元開始的連續單元中有一個無符號數0FH,編程求該數據的地址并存入5FH單元。l 分析分析: :l 先取出60H單元的數據與立即數0FH比較。l 如果不相等,再取下一個單元數據進行比較;l 如此循環,直到兩個數據相等時,記錄數據地址,退出循環。 l 判斷兩數是否相等有多種方法,在此我們選擇兩數異或指令。如果兩數相等,則異或結果為0; 否則結果為1。程序流程圖如圖4-6所示。l 源程序源程序: :l ORG 1000Hl MOV R0,#5FH l LOO
27、P: INC R0l MOV A,R0l XRL A,#0FH l JZ NEXT l SJMP LOOPl NEXT: MOV 5FH,R0l SJMP l END 圖圖4-6 4-6 例例4.104.10程序流程圖程序流程圖 l 【例4.11】 用 80C51單片機的 P1口作輸出,經驅動電路接 8只發光二極管,如圖4-7所示。l 當輸出位是“1”時,發光二極管被點亮; 輸出位是“0”時二極管熄滅。l 編制單燈循環亮程序,即按l P1.0P1.1P1.2P1.6P1.7P1.0P1.1順序,每次只有一只二極管亮。l 分析分析: :l 要使每個燈輪流被點亮,必須在P1口的各l 位按指定順序輪
28、流輸出 “1”,其余位輸出0,可l 以采用循環移位指令完成。l 8個燈一輪的漸次點亮由循環體完成,然l 后利用無條件轉移指令反復執行循環體。圖圖4-7 4-7 單燈循環電路圖單燈循環電路圖 l 程序流程圖如圖4-8所示。l 源程序源程序: :l ORG 1000Hl MOV A,#01H l LOOP: MOV P1,Al RL A ;累加器A左循環一位l LCALL DELAY ;調用延時子程序l SJMP LOOPl DELAY: MOV R2,#0FAH ;延時子程序l L1: MOV R3,#0FAHl L2: DJNZ R3,L2l DJNZ R2,L1l END 圖圖4-8 4-8
29、 例例4.114.11程序流程圖程序流程圖 l 4.4.3 4.4.3 多重循環程序設計多重循環程序設計l 多重循環又稱為循環嵌套,是指一個循環程序的循環體中包含另一個循環程序。理論上對循環嵌套的層數沒有明確的規定,但由于受硬件資源的限制,實際可嵌套層數不能太多。l 需要注意的是循環嵌套只允許一個循環程序完全包含另一個循環程序,不允許兩個循環程序之間相互交叉嵌套。l 【例4.12】 編程將內部RAM70H79H中10個無符號數按由大到小的順序排序。排序后仍存放在70H79H中。l 分析分析: :l 排序方法有多種,本例題采用“冒泡”法完成。l 具體思路是具體思路是: : 從低地址到高地址將相鄰
30、兩個單元進行比較。l 若低地址的內容大于相鄰高地址單元的內容,則保持原狀; 若低地址的內容小于相鄰高地址單元的內容,則兩單元內容互換。 l 圖4-9給出設標志位冒泡法排序流程圖。l 設標志位冒泡法排序源程序: l ORG 1000Hl LOOP: MOV R0,#70Hl MOV B,#09H l CLR 10Hl LOOP1: MOV A,R0l MOV 20H,A l INC R0l MOV 21H,R0l CJNE A,21H,LOOP2 圖圖4-9 4-9 冒泡法排序流程圖冒泡法排序流程圖 l LOOP2: JNC LOOP3l MOV A,R0l MOV R0,20H l DEC R
31、0l MOV R0,A l INC R0l SETB 10Hl LOOP3: DJNZ B,LOOP1l JB 10H,LOOP l SJMP l ENDl 【例4.13】 編寫軟件延時80ms程序。l 分析分析: : 設單片機的時鐘頻率為6MHz,則其機器周期為2s。l 由于DJNZ指令需要2個機器周期,因此它的指令周期即指令執行時間為4s。MOV和NOP指令分別為2個機器周期和1個機器周期。 l 為了延時80ms,我們可以通過控制循環次數的方法來解決。l 執行兩條 NOP指令和1條 DJNZ指令的時間是 8s,循環250次用時2000s,即程序中第2條到第5條指令完成的功能。l 若想達到延
32、時80ms的目的,只要再使用一個循環40次的DJNZ指令即可。精確計算程序運行時間的公式為:l 2+2+(1+1+2)*250+2*40*2s=80324s l 如果單片機的時鐘頻率為12MHz,則其機器周期為1s。為了延時80ms,我們只要把循環次數由40修改為80就可以了。l 延時程序:l MOV 20H,#40 ;2機器周期指令l BBB1: MOV 21H,#250 l BBB2: NOP ;1機器周期指令l NOP l DJNZ 21H,BBB2 ;2機器周期指令l DJNZ 20H,BBB1l SJMP 循環嵌套問題外循環外循環中循環中循環內循環內循環外循環外循環內循環內循環外循環
33、外循環內循環內循環內循環內循環(a)嵌套正確)嵌套正確(b)嵌套正確)嵌套正確(c)交叉不正確)交叉不正確4.5 4.5 子程序設計子程序設計l 在程序設計過程中,經常會遇到在不同的程序中或同一個程序的不同地方執行同一個操作的情況,例如軟件延時、代碼轉換等。l 為了縮短程序設計周期及程序長度,可以將這些程序段從源程序中分離出來單獨組成一個程序模塊,我們稱之為子程序。l 在需要使用這些模塊的地方可以 “調用子程序”。l 調用子程序的程序被稱為主程序。主程序對子程序的調用是通過ACALL或LCALL指令完成的。一個主程序可以多次調用同一個子程序,也可以調用多個子程序。子程序也可調用其他子程序(稱為
34、子程序嵌套). 所謂調用子程序,暫時中斷主程序的執行,而轉到子程序的入口地址去執行子程序,子程序執行完后返回主程序繼續執行。l 子程序的形式與要求:子程序的形式與要求:1)名稱、地址、功用()名稱、地址、功用(標明子程序的入口地址或名稱,以方便調用);標明子程序的入口地址或名稱,以方便調用);2)指出入口與出口參數,以正確進行)指出入口與出口參數,以正確進行參數傳遞參數傳遞; 參數傳遞參數傳遞 在調用子程序前,主程序應先把有關參數(即入口參數)放在調用子程序前,主程序應先把有關參數(即入口參數)放到某些約定的位置,子程序在運行結束返回前,也應該把運算結果(出口參到某些約定的位置,子程序在運行結
35、束返回前,也應該把運算結果(出口參數)送到約定的位置數)送到約定的位置/ 單元。單元。常采常采用工作寄存器或累加器、地址指針寄存器或堆棧。用工作寄存器或累加器、地址指針寄存器或堆棧。3 3)注意保護現場)注意保護現場5 5)子程序的末尾用)子程序的末尾用RET返回指令結束;返回指令結束; 有關指令:有關指令:1、進棧操作、進棧操作 PUSH direct;2、出棧操縱、出棧操縱 POP direct;3 3、子程序的調用、子程序的調用1 1)絕對調用指令)絕對調用指令ACALL ACALL addrlladdrll;斷點入棧;斷點入棧-PC-PC當前值,當前值, SP SP (SPSP)+2+
36、2 PC11 PC111515保持不變保持不變,addr11-PC,addr11-PC底底1111位位2)長調用指令)長調用指令 LCALL addr16;(;(PC)+3-PC , 斷點入棧斷點入棧 轉地址轉地址addr16執行執行4. 子程序返回指令子程序返回指令 RET ;PC158 (SP),),SPSP-1 ;PC70 (SP),),SPSP-1使用子程序的優點 不必重復書寫同樣的程序,提高編程效率 程序的邏輯結構簡單,便于閱讀 縮短了源程序和目標程序的長度,節省了存儲器空間 使程序模塊化、通用化、便于交流共享資源 便于按某種功能調試上頁下頁回目錄l l 4.5.1 4.5.1 關于
37、子程序的幾點說明關于子程序的幾點說明l 1.每個子程序的起始指令前必須定義一個標號,作為該子程序的名稱,以便主程序正確的調用它。子程序通常以 RET指令結束,以便正確的返回主程序。l 2.子程序應具有通用性。一般,子程序的操作對象通常采用寄存器或寄存器間接尋址等尋址方式,盡量避免采用立即尋址。l 3.子程序應保證放在存儲器的任何空間都能正確運行,即具有浮動性。例如,子程序中應使用相對轉移指令,避免使用絕對轉移或長轉移。l 4.進入子程序時需要把在主程序中使用并在子程序中也要使用的寄存器進行保存,并在返回主程序之前恢復原來狀態。l 5.子程序的調用和返回指令,以及保護現場等操作均需用到堆棧,因此
38、在程序初始化時應設置堆棧指針SP,開辟堆棧保護區。l 6.設計子程序時應首先確定子程序名稱,確定子程序的入口參數和出口參數,確定子程序需要使用的寄存器和存儲單元,確定子程序的算法,再編寫源程序。 4.5.2 4.5.2 子程序及其嵌套調用子程序及其嵌套調用l 子程序的嵌套調用是指在一個子程序中又調用另一個子程序。l 對于MCS-51單片機,子程序嵌套次數一般不受限制。l 子程序的嵌套調用過程如圖4-10所示。l 當主程序執行到LCALL SB01指令時,它會將斷點地址M02壓入堆棧,并轉去執行SB01子程序。 一、子程序嵌套調用l 在SB01子程序中執行到LCALL SB02指令時,它會將斷點
39、地址SB12壓入堆棧,并轉去執行SB02子程序。l SB02子程序執行到最后的RET指令時,它會從堆棧中取出斷點地址SB12送給指令計數器PC,程序返回SB01子程序。l SB01子程序執行到最后的RET指令時,它會從堆棧中取出斷點地址M02送給指令計數器PC,程序返回主程序,繼續執行。圖圖4-10 4-10 子程序嵌套示意圖子程序嵌套示意圖 二、調用子程序的要點 子程序開頭的標號段必須有一個標志,該標志既是 子程序的名字又是其入口地址,以便主程序調用。在主程序中利用指令ACALL或LCALL可轉入子程序。 該指令具有保護斷點的功能例如:調用延時子程序LCALL(ACALL) DELY 子程序
40、結尾必須使用一條從子程序返回指令RET, 它具有恢復斷點的功能LCALL addr16; PC addr16 轉向子程序;(PC) (PC)+3;SP (SP)+1,(SP) PC70;SP (SP)+1,(SP) PC158;在調用子程序之前,保護斷點地址RET; PC158 (SP) ,(SP) (SP) -1; PC70 (SP) ,(SP) (SP) -1主程序CALL斷點子程序RET1、子程序的結構上頁下頁回目錄2、參數傳遞子程序入口條件: 在調用一個子程序時,主程序應先把有關參數放到某些約定的位置,子程序運行時,可以從約定的位置得到有關參數。子程序出口條件:子程序結束前,也應把處理
41、結果送到約定位置參數傳遞的方法: 子程序無須傳遞參數 這類子程序中所需要的參數是子程序賦予,不需要主程序給出上頁下頁回目錄2、參數傳遞子程序入口條件: 在調用一個子程序時,主程序應先把有關參數放到某些約定的位置,子程序運行時,可以從約定的位置得到有關參數。子程序出口條件:子程序結束前,也應把處理結果送到約定位置參數傳遞的方法: 子程序無須傳遞參數 這類子程序中所需要的參數是子程序賦予,不需要主程序給出上頁下頁回目錄主程序:.LCALL DELY.子程序:不需主程序提供入口參數,從子程序開始到子程序返回,大約為20ms例4-23 調用延時子程序DELYDELY: MOV R7, #100DLY0
42、: MOV R6, #98NOPDLY1: DJNZ R6, DLY1DJNZ R7, DLY0RET子程序開始的標號子程序返回指令調用子程序上頁下頁回目錄982=196s1s1s設:主頻為12MHZ2s(196+2+2) 100 +3 =20003s = 20.003ms2s1s+3意味著每個機器周期為1s 用累加器和工作寄存器傳遞參數入口參數:放在累加器A和工作寄存器中R0 R7中出口參數:放在累加器A和工作寄存器中R0 R7中例 雙字節求補子程序CPLD解:采用“變反加1”的方法,十六位數變反加1, 不僅低字節要加1,高字節要加低字節的進位。 故采用ADD指令,不采用INC指令。 INC
43、指令不影響CY位上頁下頁回目錄入口參數:(R7R6)=16位數出口參數:(R7R6)=求補后的16位數 CPLD: MOV A,R6CPL A ADD A,#1 MOV R6,A MOV A,R7 CPL A ADDC A,#0 MOV R7,A RET上頁下頁回目錄Cy+ CyR7R6R7R6用累加器用累加器A A或工作寄存器或工作寄存器RnRn傳遞參數傳遞參數例:把例:把A中一個十六進制數的中一個十六進制數的ASC字符轉換為一位十六進制數。字符轉換為一位十六進制數。主程序部分:主程序部分:START:; MOV A,#34H;設置入口參數于;設置入口參數于A中中子程序:子程序:ASCH:
44、CLRC SUBB A,#30H CJNE A,#10,$+3 ;$+3為下條指令的首址為下條指令的首址 JC NEXT ;(A)10,轉,轉NEXT SUBB A,#07H ;(A)0AH,則再減,則再減07H(共減(共減37H)NEXT: NOP RET R0 R0 R0 通過操作數地址傳遞參數入口參數:(R0)=求補數低字節指針,(R7)=n-1出口參數:(R0)=求補后高字節指針例4-25 n字節求補子程序CPLNCPLN: MOV A,R0CPL AADD A,#1MOV R0,AMOV A,R0CPL AADDC A,#0MOV R0,ARETNEXT: INC R0DJNZ R7
45、, NEXT上頁下頁回目錄內部RAM字節1字節2字節3字節n R0 R0 通過堆棧傳遞參數例4-26 在HEX單元存放兩個十六進制數,將它們分別 轉換成ASCII碼并存入ASC和ASC+1單元解: 由于要進行兩次轉換,故可調用查表子程序完成上頁下頁回目錄 HEX SPSPSPSP .PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.MOVC A,A+PCHASC: DEC SPDEC SPPOP ACCANL A,#0FHADD A,#5PUSH ACCINC SPINC SPRETASCTAB: DB
46、0 1 2 7 DB 8 9 A F60H61H62H63H64H HEX *PCL *PCHPC斷點SP0000 HEXL ASCAASCSPSPSPSP主程序子程序上頁下頁回目錄 5). 5). 用寄存器作指針來傳遞參數用寄存器作指針來傳遞參數 例例2:將片內一組區域清零子程序如下:將片內一組區域清零子程序如下: ZOER: CLR A LOOP: MOV R0, A; INC R0 DJNZ R2 ,LOOP; RET 分析入口參數分析入口參數? 出口參數出口參數? 編程完成編程完成20H28H和和30H39H兩段區域清零兩段區域清零. 3、現場保護 如果子程序使用的寄存器與主程序使用的
47、寄存器 有沖突,在轉入子程序前,特別是進行中斷服務 子程序時,要進行現場保護。主程序使用的內部 RAM 內容,各工作寄存器內容, 累加器 A 和 DPTR 以及 PSW 等寄存器內容。將要保護的單元壓入堆棧。上頁下頁回目錄中斷保護時:還可以用 RS1 RS0 來選擇其他通用寄存器組, 以便保護主程序現場。R0 R7例如:十翻二子程序的現場保護BCDCB: PUSH ACCPUSH PSWPUSH DPLPUSH DPH.POP DPHPOP DPLPOP PSWPOP ACCRET推入與彈出應按照“先進后出”,或“后進先出”的順序; 保護現場; 十翻二; 恢復現場;上頁下頁回目錄三、子程序的調
48、用及嵌套1、子程序的調用 將內部RAM41H43H中內容左移4位,移出部分送 40H單元 由于多字節移位是程序設計中經常用到的,有一定的普遍性。為了程序設計的靈活性,我們編一個“n字節 左移一位”子程序,反復調用4次即為n字節左移4位。(R0)指向內部RAM的操作數地址,高字節在先(R4)= 字節長度(R0)指向內部RAM的結果地址,低字節在先上頁下頁回目錄使用 LCALL 或 ACALL 指令主程序:RLC4: MOV R7, #4MOV A, R0ANL A, #0FHMOV R0, ARET;為進入子程序設置入口條件;R7為左移位數計數器;轉子程序;未完,繼續;存結果;屏蔽高四位結果上頁
49、下頁回目錄 子程序:RLC1: CLR CMOV A, R0RLC AMOV R0, A RETR0CYA40H41H42H43HA37A30A27A20A17A10A07A00A37 A3000A37A36A36 0R0A26 A37A16 A27A06 A27上頁下頁回目錄2、子程序的嵌套 子程序中可調用其他子程序上頁下頁回目錄 子程序與主程序的概念是相對的,在一個子程序中又可調用其它子程序,這就是子程序的多重嵌套。多重嵌套的過程SPSP *PC0L *PC0H *PC1L*PC1H5FH60H61H62H63H64H65H*PC2H*PC2L 斷點入棧斷點入棧SPSP斷點入棧SPSPSP
50、SP彈出斷點彈出斷點SPSP彈出斷點SPSP上頁下頁回目錄棧 底堆棧的設置是十分重要的l 4.6.1 4.6.1 查表程序設計查表程序設計l 查表程序是指適當的組織一些表格,跟控制程序一起事先輸入到單片機的程序存儲器中。使用查表指令迅速獲取結果數據。該類程序主要用于代碼轉換、算術運算等。l 說明說明: :l 在例4.16和例4.17中分別使用了指令MOVC A,A+PC和指令MOVC A,A+DPTR實現查表。l 第一條指令是以 PC作為基址寄存器,A中存放偏移量(偏移量為當前的PC值到表格首地址之間的距離),兩者的和為結果所在程序存儲單元的地址。 4.6 4.6 查表及散轉程序設計查表及散轉
51、程序設計l 該指令執行后PC仍指向下一條指令。l 用用PCPC的內容作為基地址來查表,通常分為三步的內容作為基地址來查表,通常分為三步: :l (1)將所查表格的項數(即在表格中的位置)送入累加器A中;l (2)計算偏移量data,并在MOVC A,A+PC指令前加上指令ADD A,#data。計算公式如下:l 偏移量=表格首地址-(MOVC指令所在的地址+1)l (3)執行查表指令MOVC A,A+PC,結果存入累加器A。l 第二條指令是以 DPTR作為基址寄存器,A與DPTR兩者的和為結果所在程序存儲單元的地址。l 用用DPTRDPTR內容作為基地址來查表,通常也分為三步內容作為基地址來查
52、表,通常也分為三步: :l (1)將表格的項數(即在表格中的位置)送入累加器A中;l (2)將表格的首地址送入DPTR中;l (3)執行查表指令MOVC A,A+DPTR,結果存入累加器A。 l 4.6.2 4.6.2 散轉程序設計散轉程序設計l 在設計單片機應用程序時,經常遇到根據不同的輸入或運算結果決定程序流向的問題。這就是散轉程序,實際就是一種多分支程序。l 散轉程序也需要一個表,但表中所列的不是普通數據,而是某些功能程序的入口地址、偏移量或轉向這些功能程序的轉移指令。l 程序的散轉功能,主要依靠間接轉移指令JMPA+DPTR完成。l 1.1.利用轉移指令表進行散轉利用轉移指令表進行散轉
53、l 假設有一個標志單元,它的可能取值為 0,1,2的自然數,每個值對應一個處理程序。我們可以利用轉移指令表,使程序根據標志單元的值轉向各自的處理程序。l 選擇與處理程序相同數目的無條件轉移指令,由這些指令組成一張指令表,且第1條轉移指令轉向 “0” 標志所對應的處理程序,第2條轉移指令轉向“1”標志所對應的處理程序,依此類推。 l 然后把指令表的起始地址和標志單元的值分別送數據指針DPTR和累加器A中,最后使用散轉指令完成。l 2.2.利用轉向地址表進行散轉利用轉向地址表進行散轉l 當轉向范圍比較大時,可直接使用轉向地址表法,即把每個處理程序的入口地址直接放到地址表內。l 用查表指令從表中查找
54、與變量值對應的處理程序的入口地址,再通過間接轉移指令,使程序轉向該地址指向的功能程序。l 3.3.利用利用 “RETRET” 指令進行散轉指令進行散轉l 此方法與轉向地址表法基本相同。l 兩者的惟一區別是:l 轉向地址表法,將表中取出功能程序的入口地址直接送給數據指針; l 而返回指令法,則把入口地址壓入堆棧進行保存,并隨后便執行一條RET指令,使程序轉向功能程序。l 當程序出現多重分支時,常用無條件間接轉移指令實現散轉當程序出現多重分支時,常用無條件間接轉移指令實現散轉。JMP A+DPTR利用散轉指令JMP A+DPTR可轉向任一處理程序間接轉移指令(又稱散轉指令)間接轉移指令(又稱散轉指
55、令) JMP A+DPTR ;PC (A) + (DPTR 目的地址由指針目的地址由指針DPTR和變址和變址A的內容之和形成,的內容之和形成,范圍達范圍達 64K 。散轉程序設計散轉程序設計根據根據R0中的內容,轉向各個子程序。中的內容,轉向各個子程序。 R00,轉入,轉入Pr0 R01,轉入,轉入Pr1 R02,轉入,轉入Pr2 R0n,轉入,轉入Prn ORG 0030HJUMP1: MOV DPTR, #TAB CLR A MOV A, R0 ADD A, R0 JMP A+DPTR ORG 0100HTAB: AJMP Prog0 ;(2個字節個字節) AJMP Prog1 ;(2個字
56、節個字節) AJMP Prog2 ;(2個字節個字節) Prog0: Prog1: Prog2: 處理 0處理 1處理 nR0= ?01n 思考:為什么A(R0)中的內容要乘以2? 例 1 根據工作寄存器R0 內容的不同, 使程序轉入相應的分支。程序如下: LP0: MOV DPTR, TAB ; 取表頭地址 MOV A, R0 ADD A, R0 ; R0內容乘以2 JNC LP1 ; 無進位轉移,當(A)80H(128D)時有 進位,當(A)80H(128D)時無進位,進位 應加到高位DPH中. INC DPH ; 加進位位LP1: JMP A+DPTR; 跳至散轉表中相應位置 TAB:
57、AJMP PR0 ;占2個字節 AJMP PR1 AJMP PRN PRO: 例2: MOV DPTR, TAB MOV A, R0 MOV B, 03H ; 長跳轉指令占 3 個字節 MUL AB XCH A, B ADD A, DPH MOV DPH, A XCH A, B JMP A+DPTR; 跳至散轉表中相應的位置 TAB: LJMP PR0 ; 跳至不同的分支 LJMP PR1 ;占3個字節 LJMP PRN PR0: PR1: 4.7 4.7 實用程序舉例實用程序舉例l 設計單片機的應用程序,不僅要掌握幾種基本結構程序的設計步驟、設計方法,還要熟悉一些常用子程序的基本功能和使用方
58、法。l 典型的子程序:u 代碼轉換類子程序u 運算類子程序u 數據塊處理和數據比較類子程序u 延時子程序例例1 將單字節16進制整數轉換成單字節BCD碼整數的子程序。入口條件:待轉換的單字節16進制整數在累加器A中。出口狀態:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。CHBCD: PUSH PSW ;保護現場 PUSH B MOV B, #100 DIV AB ;(A)BCD碼的百位 MOV R3, A ; (R3)BCD碼的百位 MOV A, #10 ;余數繼續分離十位和個位 XCH A, B DIV AB ;(A)BCD碼的十位 SWAP A ORL A, B ;將十
59、位和個位拼裝成BCD碼 POP B ;恢復現場 POP PSW RET4.7.1 4.7.1 代碼轉換類子程序代碼轉換類子程序例例3 將4位二進制數轉換成ASCII碼。入口條件:待轉換的4位二進制數存入R2中。出口狀態:轉換后的ASCII碼存R2中。ASCB: PUSH PSW ;保護現場 PUSH A MOV A, R2 ANL A, #0FH ;取出四位二進制數 PUSH A ;存入堆棧 CLR C SUBB A, #0AH POP A ;彈回A中 JC LOOP ;該數小于10,則轉LOOP ADD A, #07H ;否則加07HLOOP: ADD A, #30H ;加30H MOV R
60、2, A ;轉換后的ASCII碼存入R2 POP A ;恢復現場 POP PSW RETnZHENFA: MOV A,R2n MOV B,R4n MUL ABn MOV R5,An MOV R6,Bn MOV A,R2n MOV B,R3n MUL ABn ADD A,R6n MOV R6,An MOV A,Bn ADDC A,#00Hn MOV R7,An RET 被乘數:被乘數:R3、R4 (16位)位) 乘數:乘數: R2 (8位)位) 乘積:乘積: R5、R6、R7算法:算法: R3 R4 R2 ( R4R2 )H ( R4R2)L +( R3R2 )H ( R3R2 )L R7 R6
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國聚合支付行業前景預測及發展戰略建議報告
- 2025至2030中國組合曲軸運行業發展態勢及投資規劃研究報告
- 2025至2030中國磁性碳粉樹脂市場深度調查與發展趨勢研究報告
- 2025至2030中國矢量磁體行業發展狀況與前景趨勢研究報告
- 2025至2030中國益生菌市場供需前景及投資潛力研究報告
- 2025至2030中國電動車模型行業風險評估及發展潛力研究報告
- 2025至2030中國漁具行業銷售動態及供需趨勢研究報告
- 2025至2030中國海洋飼料市場銷售模式與競爭前景研究報告
- 2025至2030中國水泥壓力管行業供需現狀與多元化發展策略報告
- 2025至2030中國氯化鋅市場產銷規模及未來營銷創新策略研究報告
- 青島2025年山東青島市即墨區部分事業單位招聘66人筆試歷年參考題庫附帶答案詳解
- 開卡車的考試題及答案
- 三力老人測試題及答案
- 電動葫蘆考試試題及答案
- 四年級下冊道德與法制全冊電子教案備課
- 精神病人腸梗阻的護理
- 人力資源管理數字化轉型方案
- 數字藝術創作版權保護協議
- 保健院急診急救工作制度與流程(2025版)
- 珍奇的稀有動物針鼴課件
- 臺達VFDM變頻器說明書
評論
0/150
提交評論