<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編程序模塊化設(shè)計(jì)

          匯編程序模塊化設(shè)計(jì)

          作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
          單片機(jī)程序設(shè)計(jì)雖然小,可能很多人并不去注意項(xiàng)目開(kāi)發(fā)的一些方法,方案拿到手就開(kāi)始寫(xiě),然后是想到什么地方,就寫(xiě)到什么地方,思緒凌亂,要將項(xiàng)目按時(shí)完成倒是沒(méi)有問(wèn)題,但是如果說(shuō)后期的維護(hù),修改等,就是噩夢(mèng)了,更不用說(shuō)讓別人來(lái)維護(hù)代碼了,因?yàn)樽约嚎雌饋?lái)都吃力。

          本文引用地址:http://www.ex-cimer.com/article/201611/315475.htm

          單片機(jī)程序很容易寫(xiě),但是怎么寫(xiě)的好確實(shí)需要經(jīng)驗(yàn)積累,技巧的積累。很多時(shí)就是一個(gè)新手和一個(gè)老手的區(qū)別所在。好的單片機(jī)程序要做到以下幾點(diǎn):

          C語(yǔ)言的話還是有些書(shū)去介紹怎么設(shè)計(jì)程序,但是匯編的書(shū)籍除了介紹指令集,根本沒(méi)有去介紹匯編程序的一些設(shè)計(jì)思想,小技巧等。掌握一些技巧后,發(fā)現(xiàn)學(xué)習(xí)匯編其實(shí)并不難。

          可能學(xué)C語(yǔ)言的時(shí)候接觸過(guò)模塊化的概念,其實(shí)匯編也需要模塊化。代碼應(yīng)該是一個(gè) block 為單位的,例如C語(yǔ)言的函數(shù),嚴(yán)格規(guī)定統(tǒng)一的“入口”“出口”,這樣的代碼讓人看起來(lái)清晰,代碼可靠,維護(hù)方便。模塊應(yīng)該是一個(gè)獨(dú)立的整理,和外界的聯(lián)系只能夠通過(guò)模塊的入口和出口,少用或者不用全局變量。

          目標(biāo):如果你的匯編寫(xiě)的很像C 那么你就理解了什么叫模塊了。

          例如看下面的一個(gè)例子:

          (注釋:xxx表示一行或者多行代碼)

          -----------------------------------------------------程序塊一

          Label1 :

          xxxxxxx

          jbs flag 如果滿足條件

          Jmp Label2 則跳出程序塊一,繼續(xù)執(zhí)行下面的程序

          Xxxxxxx

          -----------------------------------------------------程序塊二

          Label2 :

          Xxxxxxxx

          Lable3 :

          XXXXXX

          意圖很簡(jiǎn)單,Label1 先執(zhí)行一段程序,然后條件判斷跳轉(zhuǎn)到 Label2 。這樣寫(xiě)無(wú)疑能完成程序需要的邏輯,但是這樣好不好?為什么?

          我們說(shuō),這樣處理是不好的,為什么?我們可以先看一個(gè)例子,如果程序塊一需要移動(dòng),那么看發(fā)生什么事情,事實(shí)上這是非常常見(jiàn)的

          -----------------------------------------------------程序塊二

          Label2 :

          Xxxxxxxx

          -----------------------------------------------------程序塊一

          Label1 :

          xxxxxxx

          jbs flag

          Jmp Label2

          Xxxxxxx

          Lable3 :

          XXXXXX

          看出沒(méi)有,邏輯變了?。?!程序本來(lái)的意圖是跳出程序塊一,繼續(xù)執(zhí)行下面的程序的,但是移動(dòng)了之后發(fā)現(xiàn)程序塊一中的跳轉(zhuǎn)地址依然是跳到程序塊二的入口,很容易會(huì)形成一個(gè)死循環(huán),違背的當(dāng)初的意圖。當(dāng)然有人肯定會(huì)說(shuō):“這很簡(jiǎn)單啊,我修改一下”

          jbs flag

          Jmp Label3

          這樣程序不是一樣可以正常的跑嗎?對(duì)的,你沒(méi)有錯(cuò)。但是問(wèn)題是,你每移動(dòng)一次程序塊,都在這里修改標(biāo)號(hào),工作量大,容易出錯(cuò),在實(shí)際維護(hù)程序中,簡(jiǎn)直就是一場(chǎng)噩夢(mèng)。

          這就是我今天想說(shuō)的,就叫模塊間“耦合”。一個(gè)模塊和其他模塊發(fā)生了互聯(lián)關(guān)系,使得兩個(gè)程序都不能很好的獨(dú)立出來(lái)。

          怎么處理這個(gè)問(wèn)題?看例子:

          -----------------------------------------------------程序塊一

          Label1 :

          xxxxxxx

          jbs flag

          Jmp Label1_end

          Xxxxxxx

          Label1_end:

          -----------------------------------------------------程序塊二

          Label2 :

          Xxxxxxxx

          這個(gè)程序只做了很小的修改, jmp 指令跳出的不是原來(lái)的 Label2,而修改為在原來(lái)的模塊一中的結(jié)尾處的 Label1_end 標(biāo)號(hào)處??梢岳斫獠??這樣程序塊一就完全的獨(dú)立起來(lái)了,他和程序中的其他模塊一點(diǎn)關(guān)系都沒(méi)有。如果我要移動(dòng)一下:

          -----------------------------------------------------程序塊二

          Label2 :

          Xxxxxxxx

          -----------------------------------------------------程序塊一

          Label1 :

          xxxxxxx

          jbs flag

          Jmp Label1_end

          Xxxxxxx

          Label1_end:

          這次好多了,我們發(fā)現(xiàn)根本不需要修改代碼,原來(lái)的程序就運(yùn)行的很好。或者這只是一個(gè)微不足道的小例子,但是我想說(shuō)的是,從這個(gè)小例子中體驗(yàn)到模塊化程序的重要性。當(dāng)然了,這個(gè)是最基本的技巧。



          關(guān)鍵詞: 匯編程序模塊

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();