張同華,韓名君2,
(1.蕪湖信息技術(shù)職業(yè)學(xué)院 電子信息系,安徽 蕪湖 241003;2.安徽大學(xué) 電子信息工程學(xué)院,安徽 合肥 230039)
嵌入式芯片匯編語言結(jié)構(gòu)化編碼設(shè)計的研究
張同華1,韓名君2,1
(1.蕪湖信息技術(shù)職業(yè)學(xué)院 電子信息系,安徽 蕪湖 241003;2.安徽大學(xué) 電子信息工程學(xué)院,安徽 合肥 230039)
為提高嵌入式芯片匯編語言編碼設(shè)計的水平,克服因語句結(jié)構(gòu)本身的非結(jié)構(gòu)化及存儲分配的隨意性所造成的困難,根據(jù)軟件工程中結(jié)構(gòu)化設(shè)計的規(guī)范,以MCS-51單片機(jī)匯編語言為例,提出了可操作性的解決方案:針對語句的結(jié)構(gòu),設(shè)計與結(jié)構(gòu)化盒圖等效的程序流程圖和語句結(jié)構(gòu)體,構(gòu)建出結(jié)構(gòu)化的選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu);針對存儲的分配,設(shè)計依據(jù)程序之間的調(diào)用關(guān)系,同層共享非同層獨享的變量存儲空間分配策略。
結(jié)構(gòu)化程序設(shè)計;嵌入式芯片;編碼設(shè)計;匯編語言
在電子技術(shù)應(yīng)用中,各類嵌入式芯片的使用越來越廣泛,芯片制造公司提供了芯片指令代碼助詞符系統(tǒng)及匯編編譯軟件,電子技術(shù)設(shè)計人員相應(yīng)的承擔(dān)著使用匯編語言進(jìn)行程序設(shè)計的工作。
高質(zhì)量的軟件設(shè)計必須遵循軟件工程規(guī)范[1],有關(guān)在軟件工程規(guī)范的指導(dǎo)下進(jìn)行嵌入式芯片匯編語言程序設(shè)計的方法,人們已做過有益的探討,并應(yīng)用于實踐中[2,3]。
在軟件工程規(guī)范中,要求在編碼設(shè)計階段運用結(jié)構(gòu)化程序設(shè)計方法,但對嵌入式芯片卻是個難題:其一,嵌入式芯片的匯編語言本身是非結(jié)構(gòu)化的低級語言,不能像高級語言一樣直接實現(xiàn)結(jié)構(gòu)化的程序編碼,其二,編碼設(shè)計過程中的存儲空間的分配,也不能像高級語言一樣由編譯系統(tǒng)完成。
因為這個難題,當(dāng)前有關(guān)嵌入式芯片的各類文獻(xiàn)及教材中,編碼設(shè)計普遍達(dá)不到結(jié)構(gòu)化設(shè)計的要求。在有關(guān)匯編語言編程方法的研究中,還沒有直接解決這個難題的詳細(xì)且可行的方案。
運用嵌入式芯片專用的已結(jié)構(gòu)化的高級語言系統(tǒng)可以回避以上難題,如MCS-51單片機(jī)的C51高級語言[4]。但高級語言只針對長期且大量應(yīng)用的芯片進(jìn)行開發(fā),新面世的芯片很少有相應(yīng)的高級語言支持,另外,高級語言在提高編程效率的同時,也降低了程序的運行效率,而有些嵌入式實時系統(tǒng)更需要的是運行效率,芯片制造公司鼓勵使用匯編語言進(jìn)行芯片功能的開發(fā)[5]。
所以,需要尋找在原有嵌入式芯片匯編語言基礎(chǔ)上直接解決這個難題的方法,現(xiàn)提出一種解決方案,就是,通過構(gòu)建結(jié)構(gòu)化的基本程序功能模塊,制定存儲空間使用策略,使編碼設(shè)計達(dá)到結(jié)構(gòu)化程序設(shè)計的標(biāo)準(zhǔn)。
本文先介紹結(jié)構(gòu)化設(shè)計方法的相關(guān)規(guī)范,再以電子技術(shù)設(shè)計人員中廣泛使用的MCS-51單片機(jī)匯編語言為例,解析本方案的內(nèi)容。
軟件工程方法將一個完整的軟件系統(tǒng)的設(shè)計分為:可行性研究、需求分析、總體設(shè)計、編碼設(shè)計(含詳細(xì)設(shè)計)、軟件測試和軟件維護(hù)幾個階段,每個階段有相應(yīng)的設(shè)計規(guī)范與設(shè)計方法,結(jié)構(gòu)化設(shè)計方法是編碼設(shè)計這個階段的主要方法。
結(jié)構(gòu)化設(shè)計的要求是:程序由一條或多條指令代碼構(gòu)成的程序塊組成,每個程序塊只能是單個入口與單個出口且程序流程是單向的,程序塊的內(nèi)部只能是順序、選擇或重復(fù)三種結(jié)構(gòu),程序塊之間只能是順序或嵌套二種關(guān)系。
盒圖(N-S圖)在形式上沒有轉(zhuǎn)移語句,只有順序、選擇與重復(fù)三種結(jié)構(gòu),其中重復(fù)的主要方式是循環(huán),如圖1中(a)、(b)和(c)所示,所以能用盒圖表示的只能是模塊化的程序結(jié)構(gòu)。

圖1 三種基本程序結(jié)構(gòu)的盒圖表示法
采用匯編語言進(jìn)行總體設(shè)計很容易達(dá)到模塊化設(shè)計的要求,但在實行編碼設(shè)計的結(jié)構(gòu)化時卻存在著困難。
原因之一在于匯編語言作為低級語言,沒有結(jié)構(gòu)化的語句結(jié)構(gòu)體,系統(tǒng)只提供了多種轉(zhuǎn)移語句。解決的辦法是通過構(gòu)建結(jié)構(gòu)化語句體的來實現(xiàn)結(jié)構(gòu)化,其中的關(guān)鍵是所有轉(zhuǎn)移語句必須控制在語句結(jié)構(gòu)體內(nèi),可以用所構(gòu)建語句體的流程圖能否能對應(yīng)一個等效盒圖作為是否達(dá)到結(jié)構(gòu)化的標(biāo)準(zhǔn)。
另一個原因在于匯編語言作為低級語言,編譯系統(tǒng)本身不能有效進(jìn)行存儲空間的分配。解決的辦法是先將程序中變量所對應(yīng)的存儲空間機(jī)動化,再根據(jù)軟件系統(tǒng)子程序之間的模塊結(jié)構(gòu)制定相應(yīng)的分配策略。
在MCS-51單片機(jī)匯編語言中,轉(zhuǎn)移條件一般由邏輯值表示,所以先將條件式變成邏輯值形式的“值L”,再判斷“值L”進(jìn)行轉(zhuǎn)移,在流圖中,應(yīng)將條件式變成邏輯值的語句包含在判斷語句體中。另外,為了使用標(biāo)號表示的轉(zhuǎn)移目標(biāo)位置仍然在語句體內(nèi),在需要時,可以將轉(zhuǎn)移的目標(biāo)位置設(shè)置成空操作指令,以去除語句體與內(nèi)嵌模塊的地址標(biāo)號的關(guān)聯(lián),達(dá)到信息隱藏的目的。
語句結(jié)構(gòu)體有順序、選擇與重復(fù)(循環(huán))三種,現(xiàn)分別說明符合結(jié)構(gòu)化標(biāo)準(zhǔn)的分支選擇語句和重復(fù)循環(huán)語句的語句結(jié)構(gòu)體構(gòu)建方法。
分支結(jié)構(gòu)有雙分支,單分支、多分支三種形式,在結(jié)構(gòu)上,單分支可以通過雙分支簡化得到,多分支可以通過雙分支嵌套得到,還有一種常用的并行多分支,一般另行設(shè)計專用的程序結(jié)構(gòu)。現(xiàn)介紹雙分支與并行多分支的結(jié)構(gòu)體的構(gòu)建。
雙分支語句結(jié)構(gòu)體的構(gòu)建如圖2所示,結(jié)構(gòu)化的流程圖如圖2(a)所示,對應(yīng)的語句結(jié)構(gòu)如圖2(b)所示,等效的盒圖如圖2(c)所示。雙分支內(nèi)嵌判定條件分別為真與假時所要執(zhí)行的“T分支”與“F分支”二個程序模塊。

圖2 雙分支語結(jié)構(gòu)體
并行多分支語句結(jié)構(gòu)體的構(gòu)建如圖3,結(jié)構(gòu)化的流程圖如圖3(a)所示,對應(yīng)的語句結(jié)構(gòu)如圖3(b)所示,等效的盒圖如圖3(c)所示。并行多分支內(nèi)嵌多個判定條件,某個條件為真則執(zhí)行對應(yīng)的處理分支程序模塊。

圖3 并行多分支語句結(jié)構(gòu)體
循環(huán)結(jié)構(gòu)常分為當(dāng)型循環(huán)、直到型循環(huán)和計數(shù)循環(huán)三種形式,計數(shù)循環(huán)可以在當(dāng)型循環(huán)或直到型循環(huán)基礎(chǔ)修改得到,現(xiàn)介紹當(dāng)型循環(huán)與直到型循環(huán)結(jié)構(gòu)體的構(gòu)建。
當(dāng)型循環(huán)語句結(jié)構(gòu)體的構(gòu)建如圖4,結(jié)構(gòu)化的流程圖如圖4(a)所示,對應(yīng)的語句結(jié)構(gòu)如圖4(b)所示,等效的盒圖如圖4(c)所示。當(dāng)型循環(huán)內(nèi)嵌循環(huán)體程序模塊。

圖4 當(dāng)型循環(huán)語句結(jié)構(gòu)體
直到型循環(huán)語句結(jié)構(gòu)體的構(gòu)建如圖5,結(jié)構(gòu)化的流程圖如圖5(a)所示,對應(yīng)的語句結(jié)構(gòu)如圖5(b)所示,等效的盒圖如圖5(c)所示。直到型循環(huán)內(nèi)嵌循環(huán)體程序模塊。

圖5 直到型循環(huán)語句結(jié)構(gòu)體
為給系統(tǒng)存儲空間的重新分配創(chuàng)造條件,程序變量所對應(yīng)的存儲空間需機(jī)動化。編碼時應(yīng)當(dāng)用變量名代表存儲空間,而不能直接使用絕對的存儲地址,這樣做可以方便的實現(xiàn)存儲空間再分配,同時,也使得程序的可讀性變強(qiáng),調(diào)試更容易。存儲空間可分為變量與數(shù)據(jù)塊二類,數(shù)據(jù)塊可用首址與長度二個專用變量表示。
存儲空間是分類別的,為了方便再分配,可以將變量的類別信息包含在變量名中,變量名的命名在“匈牙利命名規(guī)則”基礎(chǔ)上做適當(dāng)補(bǔ)充,變量命名規(guī)則設(shè)置如下:
M作用域_類別_限定詞
M為變量說明,所有變量的第一個字母用M開始;作用域用P或S表示,P為全局變量,S為私有變量;類別是變量類型,Di為字節(jié)地址,Ri為可間址的工作區(qū)寄存器,Rn為普通工作區(qū)寄存器,Da為字節(jié)常數(shù),Bi為位地址,Dbs為數(shù)據(jù)塊首址,Dbl為數(shù)據(jù)塊長度;限定詞為區(qū)分不同變量的自選詞。

圖6 存儲空間機(jī)動配置的程序
除了累加器A、程序狀態(tài)字PSW和位累加器Cy外,變量的使用必須經(jīng)等值偽指令命名,子程序間變量的傳遞用全局變量完成。圖6為一個實現(xiàn)了存儲空間機(jī)動配置的程序段。
軟件系統(tǒng)的結(jié)構(gòu)一般分為主程序系統(tǒng)和若干個中斷部分,每個部分的程序結(jié)構(gòu)圖如圖7所示,每個程序有自己所需要的存儲空間,用變量集表示。因為中斷的發(fā)生有具不確定性,所以中斷程序必須獨立處理存儲空間的分配。

圖7 主程序或中斷程序塊結(jié)構(gòu)示意圖
所有子程序編碼結(jié)束后,根據(jù)程序結(jié)構(gòu)圖,為每個程序分配實際存儲空間,分配的步驟是:
①分配主程序與中斷程序所需要的所有全局變量;
②為同層各模塊分配存儲空間,同層間空間共享;
③為不同模塊層分配存儲空間,空間獨享;
④以同樣的方式分配各中斷程序的存儲空間,中斷程序與主程序之間空間獨享。
有限的堆棧空間主要用于中斷調(diào)用時的累加器A與程序狀態(tài)字PSW的存儲。
本文分析了嵌入式芯片匯編語言在編碼設(shè)計過程中實現(xiàn)結(jié)構(gòu)化設(shè)計的困難所在,以通用的MCS-51單片機(jī)為樣本,給出了在匯編語言基礎(chǔ)上構(gòu)建結(jié)構(gòu)化語句結(jié)構(gòu)體的可行的實施辦法,提出了系統(tǒng)變量存儲空間統(tǒng)一分配的策略,使程序編碼達(dá)到了結(jié)構(gòu)化設(shè)計的要求,增加了程序的可讀性及可維護(hù)性。
[1] 屠立德,屠祁.軟件工程方法[M].北京,機(jī)械工業(yè)出版社,2001.
[2] 楊勇,王為民.MCS-51系列單片機(jī)結(jié)構(gòu)化程序設(shè)計探討[J].電子技術(shù)應(yīng)用,2007(7):24-26.
[3] 曲輝,李海軍,吳利斌,等.單片機(jī)結(jié)構(gòu)化程序設(shè)計方法與實現(xiàn)[J].內(nèi)蒙古農(nóng)業(yè)大學(xué)學(xué)報,2010,31(1):158-161.
[4] 熊光澤,古幼鵬,桑楠.嵌入式應(yīng)用軟件設(shè)計方法學(xué)研究綜述[J].計算機(jī)應(yīng)用,2004,24(4):1-4.
[5] 宓哲民,顏見明.淺談結(jié)構(gòu)化程序設(shè)計(上)[J].可編程控制器與工廠自動化,2010(10):127-129.
Research on the design of assembly language structured code in embedded chip
ZHANG Tong-hua1,HAN Ming-jun2,1
(1.Department of Electronic Information,Wuhu Vocational College of Information Technology,Wuhu 241003,China;2.School of Electronics and Information Engineering,Anhui University,Hefei 230039,China)
In order to improve the design level of assembly language code in embedded chip and overcome the difficulty of unstructured language statements and random storage allocation,this article,taking MCS-51 MCU assembly language as an example,presents an operable solution according to structural design specifications in software engineering.Based on sentence structures,we have designed equivalent program flowchart and sentence structures with structured box figure to construct the structured choice structure and circulation structure.According to the distribution of storage and call relationship of programs,we have presented a variable storage space distribution strategy of same layer sharing and different layer exclusive.
structured programming;embedded chip;code design;assembly Language
TP368.1
A
1009-3907(2011)06-0022-05
2011-04-13
安徽省專業(yè)帶頭人資助項目(DDR2008GZ94),安徽省省級教學(xué)名師資助項目(MS2009GZ07),安徽省省級電工電子示范實驗中心資助項目(2008SFZX30)。
張同華(1963-),男,安徽蕪湖人,副教授,碩士,主要從事程序設(shè)計與電子技術(shù)方面研究。
責(zé)任編輯:吳旭云