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

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ù),可以得到不同的時延。

主站蜘蛛池模板: 句容市| 易门县| 老河口市| 岳普湖县| 云林县| 承德县| 泰来县| 鄂托克旗| 西盟| 虞城县| 镇赉县| 房山区| 德格县| 休宁县| 静宁县| 永清县| 海兴县| 浦北县| 通州市| 嘉峪关市| 蓬莱市| 永登县| 卢湾区| 建水县| 偏关县| 万宁市| 南涧| 岳普湖县| 青龙| 西林县| 乐山市| 宁城县| 旌德县| 丽江市| 左权县| 兴化市| 太原市| 巴青县| 施甸县| 枣阳市| 神农架林区|