- 單片機原理及應(yīng)用系統(tǒng)設(shè)計
- 胡景春主編
- 1863字
- 2021-10-27 13:42:54
3.5 匯編語言程序設(shè)計
3.5.1 程序設(shè)計步驟和基本結(jié)構(gòu)
1.匯編語言程序設(shè)計的步驟
1)分析題意。明確課題要達(dá)到的目的、技術(shù)指標(biāo)等。
2)確定算法。根據(jù)要求和條件,確定所采用的計算公式和計算方法。這是程序設(shè)計的依據(jù)。
3)畫程序流程圖。程序流程圖是用流程圖的方式使程序的算法具體化的表示,它直觀清晰地表現(xiàn)了程序的設(shè)計思路。對于較大的程序,流程圖有助于對程序進行高效的設(shè)計和調(diào)試。程序流程圖的常用符號如圖3-3所示,用這些符號可以構(gòu)成不同算法的程序流程。

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

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

解:這是一個三分支歸一的條件轉(zhuǎn)移問題,程序?qū)崿F(xiàn)通??煞譃椤跋确种Ш筚x值”和“先賦值后分支”兩種求解辦法。這里用“先分支后賦值”方法編程。程序流程圖如圖3-5所示。

圖3-5 例3-14流程圖

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

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

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

(4)子程序
在匯編語言程序設(shè)計時,對于一些經(jīng)常需要執(zhí)行的程序段,為避免重復(fù)編制程序,節(jié)省程序代碼所占的存儲空間,可將其編制成獨立的子程序段,在需要的位置采用特定的指令調(diào)用該子程序,執(zhí)行后再返回到調(diào)用位置繼續(xù)執(zhí)行后序程序指令。
子程序結(jié)構(gòu):

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

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

上述子程序采用二層循環(huán)。由fosc=6MHz知道機器周期為2μs,DJNZ指令執(zhí)行1次要2個周期,所以內(nèi)循環(huán)的時間為1ms。外循環(huán)次數(shù)由入口參數(shù)確定,若入口參數(shù)為N,則調(diào)用一次DELAY子程序,延時時間約為N ms,改變?nèi)肟趨?shù),可以得到不同的時延。
- Cortex-M3 + μC/OS-II嵌入式系統(tǒng)開發(fā)入門與應(yīng)用
- 深入理解Spring Cloud與實戰(zhàn)
- SDL Game Development
- 電腦組裝、維護、維修全能一本通(全彩版)
- 硬件產(chǎn)品經(jīng)理手冊:手把手構(gòu)建智能硬件產(chǎn)品
- 電腦維護365問
- 微服務(wù)分布式架構(gòu)基礎(chǔ)與實戰(zhàn):基于Spring Boot + Spring Cloud
- Source SDK Game Development Essentials
- Intel Edison智能硬件開發(fā)指南:基于Yocto Project
- 電腦組裝與維護即時通
- FreeSWITCH Cookbook
- Arduino項目開發(fā):智能生活
- Blender 3D By Example
- 創(chuàng)客電子:Arduino和Raspberry Pi智能制作項目精選
- 主板維修實踐技術(shù)