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