Freescale MC9S08AW60汇编学习笔记(五)
前面學(xué)習(xí)了查表的功能,可以用查表的功能實現(xiàn)不少強大的功能,如查立方表、平方表、函數(shù)表、數(shù)碼管顯示的段碼表等。這里還有一種由查表和轉(zhuǎn)移指令配合使用而實現(xiàn)的一種強大的功能:散轉(zhuǎn)。散轉(zhuǎn)是指根據(jù)輸入數(shù)據(jù)的不同來跳轉(zhuǎn)到不同的程序入口進行處理,也就是說如果有多個子程序,我們不僅可以讓它們按順序一個個執(zhí)行,還可以根據(jù)做判斷用的數(shù)據(jù)的值來決定跳轉(zhuǎn)到哪一個子程序。實現(xiàn)散轉(zhuǎn)的具體做法是:在程序中定義一塊連續(xù)存儲單元作為跳轉(zhuǎn)表,表中順序存放各分支處理程序的跳轉(zhuǎn)地址。各跳轉(zhuǎn)地址在表中的偏移地址等于跳轉(zhuǎn)表首地址加上它們各自的序號所占字節(jié)數(shù)的乘積。感覺關(guān)于跳轉(zhuǎn)地址這一塊有點不好理解,就用一個例子來說明一下:
設(shè)字節(jié)變量Num的取值范圍為0~3,另有程序入口地址Pro0~Pro3,編寫子程序,要求根據(jù)Num的值轉(zhuǎn)向不同的Pro程序。如Num為2則轉(zhuǎn)向Pro2。代碼如下:
?org $0070
Num ds.b 1
?org $1860
Pro0:nop ? ? ? ? ? ? ? ? ? ?;子程序群,這里都讓他們空操作。
rts
Pro1:nop
rts
Pro2:nop
rts
Pro3:nop
rts
Sbranch: ? ? ? ? ? ? ? ? ? ;分支程序,有點像c語言中switch
ldx Num ? ? ? ? ? ? ?;Num-->X
lda #05h ? ? ? ?
mul ? ? ? ? ? ? ? ? ? ? ;Num*5-->X:A
tax ? ? ? ? ? ? ? ? ? ? ?;A-->X ?
clrh ? ? ? ? ? ? ? ? ? ? ;查表之前別忘清零
jmp Pro_Tab,x
Pro_Tab: ? ? ? ? ? ? ? ? ? ;跳轉(zhuǎn)表
jsr Pro0 ? ? ? ? ? ? ? ;跳轉(zhuǎn)到Pro0,3B
bra Sb_End ? ? ? ? ?;調(diào)用Pro0完畢,返回,2B
jsr Pro1
bra Sb_End
jsr Pro2
bra Sb_End
jsr Pro3
Sb_End: rts
main:
clra
clrx
clrh
mov #$01,Num ? ? ;設(shè)定Num的值,用來作為選擇子程序的判斷數(shù)
bsr Sbranch
again:
nop
jmp again
?org $fffe
?dc.w main
細心的人肯定會發(fā)現(xiàn)Num是先乘以5之后才用來做散轉(zhuǎn)的,其原因在于Pro_Tab標號后面的JSR指令是3字節(jié)指令,BRA指令值2字節(jié)指令,故數(shù)值Num、標號Pro_Tab的地址Addr_Pro和指令語句JSR ?Pro_n的首地址Addr_Pro_n之間的關(guān)系為:
? ? ? ? ? Address_Pro_n=Addr_Pro+Num*5
是不是突然發(fā)現(xiàn)匯編的強大了,從一開始匯編給人的感覺是在寄存器之間跳來跳去變成了匯編可以實現(xiàn)這個功能那個功能,只要設(shè)計足夠精巧、心思足夠細膩,就算是匯編這種呆板的機器語言也可以煥發(fā)勃勃生機,舉個例子:MenuetOS是一款完全用匯編語言寫成的操作系統(tǒng)。 因此它運行起來超快,體積也非常小,它甚至可以放在一張軟盤內(nèi)。MenuetOS提供了搶占式多任務(wù)處理,一個引人注目的漂亮GUI,用于網(wǎng)絡(luò)接入的 TCP/IP堆棧等等。由此可見:強大的不是工具而是人。當然,如果強大的工具加強大的人必然可以爆發(fā)出驚人的力量。
轉(zhuǎn)載于:https://www.cnblogs.com/daviddolphin/p/4469901.html
總結(jié)
以上是生活随笔為你收集整理的Freescale MC9S08AW60汇编学习笔记(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS 8.5配置.net网站[花了半个
- 下一篇: apache配置优化