匯編程序模塊化設(shè)計
單片機(jī)程序很容易寫,但是怎么寫的好確實需要經(jīng)驗積累,技巧的積累。很多時就是一個新手和一個老手的區(qū)別所在。好的單片機(jī)程序要做到以下幾點:
C語言的話還是有些書去介紹怎么設(shè)計程序,但是匯編的書籍除了介紹指令集,根本沒有去介紹匯編程序的一些設(shè)計思想,小技巧等。掌握一些技巧后,發(fā)現(xiàn)學(xué)習(xí)匯編其實并不難。
可能學(xué)C語言的時候接觸過模塊化的概念,其實匯編也需要模塊化。代碼應(yīng)該是一個 block 為單位的,例如C語言的函數(shù),嚴(yán)格規(guī)定統(tǒng)一的“入口”“出口”,這樣的代碼讓人看起來清晰,代碼可靠,維護(hù)方便。模塊應(yīng)該是一個獨立的整理,和外界的聯(lián)系只能夠通過模塊的入口和出口,少用或者不用全局變量。
目標(biāo):如果你的匯編寫的很像C 那么你就理解了什么叫模塊了。
例如看下面的一個例子:
(注釋:xxx表示一行或者多行代碼)
-----------------------------------------------------程序塊一
Label1 :
xxxxxxx
jbs flag 如果滿足條件
Jmp Label2 則跳出程序塊一,繼續(xù)執(zhí)行下面的程序
Xxxxxxx
-----------------------------------------------------程序塊二
Label2 :
Xxxxxxxx
Lable3 :
XXXXXX
意圖很簡單,Label1 先執(zhí)行一段程序,然后條件判斷跳轉(zhuǎn)到 Label2 。這樣寫無疑能完成程序需要的邏輯,但是這樣好不好?為什么?
我們說,這樣處理是不好的,為什么?我們可以先看一個例子,如果程序塊一需要移動,那么看發(fā)生什么事情,事實上這是非常常見的
-----------------------------------------------------程序塊二
Label2 :
Xxxxxxxx
-----------------------------------------------------程序塊一
Label1 :
xxxxxxx
jbs flag
Jmp Label2
Xxxxxxx
Lable3 :
XXXXXX
看出沒有,邏輯變了?。。〕绦虮緛淼囊鈭D是跳出程序塊一,繼續(xù)執(zhí)行下面的程序的,但是移動了之后發(fā)現(xiàn)程序塊一中的跳轉(zhuǎn)地址依然是跳到程序塊二的入口,很容易會形成一個死循環(huán),違背的當(dāng)初的意圖。當(dāng)然有人肯定會說:“這很簡單啊,我修改一下”
jbs flag
Jmp Label3
這樣程序不是一樣可以正常的跑嗎?對的,你沒有錯。但是問題是,你每移動一次程序塊,都在這里修改標(biāo)號,工作量大,容易出錯,在實際維護(hù)程序中,簡直就是一場噩夢。
這就是我今天想說的,就叫模塊間“耦合”。一個模塊和其他模塊發(fā)生了互聯(lián)關(guān)系,使得兩個程序都不能很好的獨立出來。
怎么處理這個問題?看例子:
-----------------------------------------------------程序塊一
Label1 :
xxxxxxx
jbs flag
Jmp Label1_end
Xxxxxxx
Label1_end:
-----------------------------------------------------程序塊二
Label2 :
Xxxxxxxx
這個程序只做了很小的修改, jmp 指令跳出的不是原來的 Label2,而修改為在原來的模塊一中的結(jié)尾處的 Label1_end 標(biāo)號處??梢岳斫獠唬窟@樣程序塊一就完全的獨立起來了,他和程序中的其他模塊一點關(guān)系都沒有。如果我要移動一下:
-----------------------------------------------------程序塊二
Label2 :
Xxxxxxxx
-----------------------------------------------------程序塊一
Label1 :
xxxxxxx
jbs flag
Jmp Label1_end
Xxxxxxx
Label1_end:
這次好多了,我們發(fā)現(xiàn)根本不需要修改代碼,原來的程序就運行的很好?;蛘哌@只是一個微不足道的小例子,但是我想說的是,從這個小例子中體驗到模塊化程序的重要性。當(dāng)然了,這個是最基本的技巧。
評論