由簡入繁
本篇先由一個簡單的組合語言程式起始,程式只有短短不到10行,不過這是一個完整的原始程式檔,編譯下載後可以點亮硬體平台的LED,下一篇另一個程式是第一個程式的改良版,程式開始讓LED閃動,像是單晶片的心臟開始跳動;兩個程式作者刻意維持最簡單的風格.作者也曾是電腦初學者,深知初學者的痛苦,記憶中作者的第一份程式長度約略100行上下,花了大約2個小時輸入和檢查,終於到了見真章的一刻,程式進入編譯階段,說時遲那時快,編譯後整個螢幕出現數拾行的錯誤訊息,當下的失望即使經過多年,仍然歷歷在目.
所以作者認為,初學者的第一個程式越簡單越好。簡單的程式較不會出錯,即使出錯也容易改正。文章中的每一個例題,都出自完整的專案程式,可以正確無誤的編譯和下載到硬體平台執行,即使如此作者還是建議讀者動手將原始碼重新輸入一遍,然後再編譯和下載.很多時候看別人寫程式好像不費什麼力氣,但真正自己寫作時卻總是錯誤百出.寫程式如同NIKE公司那句著名的廣告詞 JUST DO IT.
極簡的組合語言程式
P1M0 = 0x92
P1M1 = 0x91
LED = P1.0
.AREA SYS (ABS,OVR)
.ORG 0x0
LJMP _RESET
_RESET:
MOV SP,#0xE0
MOV P1M1,#0x0
MOV P1M0,#0xFF
SETB LED
_ledon:
LJMP _ledon
; END
顯示的資料來自於原始碼編譯後的1Asm-LED on專案的begin.lst檔案,真正的程式部分是在1,2,3..這些行號往後的文字.即begin.a51原始碼的內容.作者當年接觸8051單晶片時,即是由組合語言入門.以今日的情況,因為C語言發展日益完備.組合語言的重要性已大不如前.多數的程式寫作,都是以C語言為主.但工程師仍應具備組合語言的基本概念,尤其是在8051的程式除錯階段.組合語言仍有舉足輕重的地位.作者將在往後的文章中,另作說明.
組合語言的虛擬指令
原始碼的1—9行,不具備程式功能,只用來告訴編譯器,如何編譯原始碼,一般此類原始碼,稱為虛擬指令。
程式用 = 號讓P1M0這個英文字詞,等同於16進位的數字0x92.所以第14行的程式,可以有兩種不同的寫法
MOV P1M1,#0x0
MOV 0X92,#0x0
兩者編譯後,會得到完全一樣的程式碼.”=”於此處為一個虛擬指令,使用虛擬指令,可以讓原始程式碼更容易閱讀。
.AREA SYS (ABS,OVR)
.ORG 0x0
等號=,.AREA,.ORG等,在組合語言構成中,都是屬於虛擬指令,有關虛擬指令用法請參考SDCC使用手冊檔案中的說明,現在較重要的是.ORG指令,一般ORG指令會跟著一個數字,此處為0X0,代表16進位的數字0.
回頭看8051的技術資料,位址0是一個特殊的記憶體位址,當8051開始加入電源(冷開機)時,由位址0的指令碼開始執行.所以ORG指令跟隨的數字0,代表往後的程式碼,是準備在開機後執行的.換另一種說法,如果ORG指令不是0,而是其他的數值,那麼編譯後的程式碼,就很有可能在開機時不會被執行!
留言列表