官术网_书友最值得收藏!

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,改變入口參數,可以得到不同的時延。

主站蜘蛛池模板: 阿巴嘎旗| 兴宁市| 海丰县| 长岛县| 靖远县| 定西市| 彭泽县| 锦屏县| 蒙城县| 长乐市| 磐安县| 太白县| 贺兰县| 绥宁县| 龙州县| 江永县| 吴堡县| 定日县| 辽宁省| 那坡县| 蒲江县| 高台县| 民乐县| 监利县| 绿春县| 梓潼县| 克东县| 法库县| 福泉市| 宜兴市| 北京市| 孟津县| 都兰县| 澜沧| 潮安县| 海盐县| 永仁县| 汉阴县| 高平市| 邵东县| 和政县|