書名: 單片機原理及應用系統設計作者名: 胡景春主編本章字數: 9字更新時間: 2021-10-27 13:42:53
3.5 匯編語言程序設計
3.5.1 程序設計步驟和基本結構
1.匯編語言程序設計的步驟
1)分析題意。明確課題要達到的目的、技術指標等。
2)確定算法。根據要求和條件,確定所采用的計算公式和計算方法。這是程序設計的依據。
3)畫程序流程圖。程序流程圖是用流程圖的方式使程序的算法具體化的表示,它直觀清晰地表現了程序的設計思路。對于較大的程序,流程圖有助于對程序進行高效的設計和調試。程序流程圖的常用符號如圖3-3所示,用這些符號可以構成不同算法的程序流程。

圖3-3 程序流程圖常用符號
4)分配內存工作單元,確定程序與數據區的存放地址。
5)編寫源程序代碼。按照匯編語言程序設計格式,用指令和偽指令實現流程圖的功能代碼,形成完整的程序。
6)程序優化。主要是指縮短程序代碼長度、減少程序執行時間及節省內部工作單元。
7)上機調試、修改和最后確定源程序。利用軟件仿真技術和系統仿真方法對程序仿真運行,并對程序進行測試和修改,直至滿足要求。
2.結構化程序設計
單片機的結構化程序主要包括5種結構:順序結構、分支機構、循環結構、子程序及中斷服務程序。其中,中斷服務程序將在第7章介紹。
(1)順序結構
順序結構是指程序中的語句由前往后順序執行,如圖3-4a所示。

圖3-4 三種基本的程序結構
(2)分支結構
分支結構程序的特點是程序中含有轉移指令。由于轉移指令有無條件轉移(LJMP、AJMP、SJMP、JMP)和條件轉移(JZ、JNZ、CJNE、JC、JNC、JB、JNB)之分,因此分支程序也可分為無條件分支程序和條件分支程序兩類。
分支結構程序首先要對問題的條件進行判斷,根據判斷結果轉向不同的分支程序段。圖3-4b、c是常用的兩種分支情況,相對于順序執行的程序而言,圖3-4b是一種“單分支”,圖3-4c是一種“雙分支”,對于多分支,可以通過多次應用“雙分支”或“散轉”方法實現。
【例3-14】 編程實現如下分段函數,設自變量X放在30H單元,并將Y存入FUNC單元。

解:這是一個三分支歸一的條件轉移問題,程序實現通常可分為“先分支后賦值”和“先賦值后分支”兩種求解辦法。這里用“先分支后賦值”方法編程。程序流程圖如圖3-5所示。

圖3-5 例3-14流程圖

散轉指令JMP @A + DPTR可以實現無條件轉移。其中,DPTR裝入多分支轉移程序的首地址,用累加器A的內容來動態選擇其中的某一個分支予以轉移。這樣一條指令可實現以DPTR內容為起始地址的256字節范圍內的選擇轉移。
【例3-15】設有一個鍵值處理子程序KEYREAD,能把讀取的按鍵“0~9”轉換為對應的數值并傳給累加器A。編寫程序對讀入的不同鍵值0~9,分別轉入對應的鍵控程序段KEY0 ~ KEY9執行。
解:按題目要求編寫程序如下:

(3)循環結構
對于需要重復執行的同類操作,如統計數據個數等,可采用循環程序實現。
循環程序結構有“先處理后判斷”和“先判斷后處理”兩種,如圖3-4d、e所示。
循環程序一般由4部分組成,即循環變量初值、循環變量變化方式(每執行一次循環體加1或減1)、循環體(重復執行部分)及循環變量終值(循環結束的條件)。
【例3-16】將外部RAM的1000H單元開始的10個數據傳送到內部RAM中50H起始的連續單元。
解:為了使讀者對兩種循環結構有一個全面了解,以便進行分析比較,現給出兩種設計方案。
方案一:“先處理后判斷”

方案二:“先判斷后處理”

(4)子程序
在匯編語言程序設計時,對于一些經常需要執行的程序段,為避免重復編制程序,節省程序代碼所占的存儲空間,可將其編制成獨立的子程序段,在需要的位置采用特定的指令調用該子程序,執行后再返回到調用位置繼續執行后序程序指令。
子程序結構:

子程序可以和主程序之間傳遞參數,主程序傳給子程序的參數為入口參數,通過約定的工作寄存器R0~R7、特殊功能寄存器SFR、內存單元或堆棧等傳送給子程序使用;子程序執行的結果傳給主程序的參數為出口參數,通過約定的R0~R7、SFR、內存單元或堆棧等傳遞給主程序使用。
【例3-17】請編程實現c = a2+b2。設a放在30H單元,b放在31H單元,運算結果放在32單元,a和b皆為小于10的整數。
解:本程序由主程序和子程序兩部分組成。主程序通過累加器A傳送子程序的入口參數a或b,子程序也通過累加器A傳送出口參數a2、b2給主程序,子程序為求一個數的平方的通用子程序。程序如下:

上述程序采用了查表法求一個1位十進制數的平方,并且通過子程序調用求兩個數的平方和。
【例3-18】請編寫一個延時子程序,延時時間系數放在30H單元(設fosc=6MHz)。
解:本子程序入口參數是延時時間系數,延時的時間由程序指令的執行時間確定。程序如下:

上述子程序采用二層循環。由fosc=6MHz知道機器周期為2μs,DJNZ指令執行1次要2個周期,所以內循環的時間為1ms。外循環次數由入口參數確定,若入口參數為N,則調用一次DELAY子程序,延時時間約為N ms,改變入口參數,可以得到不同的時延。
- Cortex-M3 + μC/OS-II嵌入式系統開發入門與應用
- Mastering Delphi Programming:A Complete Reference Guide
- BeagleBone By Example
- 硬件產品經理成長手記(全彩)
- 現代辦公設備使用與維護
- INSTANT ForgedUI Starter
- 筆記本電腦維修不是事兒(第2版)
- Visual Media Processing Using Matlab Beginner's Guide
- Rapid BeagleBoard Prototyping with MATLAB and Simulink
- 單片機系統設計與開發教程
- 電腦高級維修及故障排除實戰
- Istio服務網格技術解析與實踐
- 筆記本電腦芯片級維修從入門到精通(圖解版)
- Spring Security 3.x Cookbook
- 微服務架構基礎(Spring Boot+Spring Cloud+Docker)