程序員在程序設(shè)計(jì)中,有時(shí)為使程序成一定的功能,需要調(diào)用一系列子程序中的一個(gè),而決定究竟調(diào)用哪一個(gè),則由程序的計(jì)算值確定。當(dāng)然,可伶來(lái)完成這件事,例如:
BL JUMPTAB
…
JUMPTAB CMP R0,#0
BEQ SUB0
CMP R0,#1
BEQ SUB1
CMP R0,#2
BEQ SUB2
然而當(dāng)子程序列表很長(zhǎng)時(shí),這種解決方案變得非常慢,這是一般不希望的。為了解決這個(gè)問(wèn)題,程序員提出了跳轉(zhuǎn)表的有效解決方案。跳轉(zhuǎn)表是利用程序計(jì)數(shù)器PC在通用寄存器文件中的可見(jiàn)性實(shí)現(xiàn)。例如:
BL JUMPTAB
…
JUMPTAB ADR R1,SUBTAB ;R1<-SUBTAB
CMP R0,#SUBMAX ;檢查超限
LDRLS PC,[R1,R0,LSL #2] ;如果OK,則跳轉(zhuǎn)到表中
B ERROR ;否則,發(fā)出錯(cuò)誤信息
SUNTAB DCD SUB0 ;子程序表入口
DCD SUB1
DCD SUB2
DCD指示匯編器保留一個(gè)存儲(chǔ)子,將它初始化為右邊表達(dá)式的值,這在偽操作中已介紹,在這種情況下存儲(chǔ)字中保留的只是標(biāo)號(hào)的地址。
不管表中有多少子程序,以及它們使用的頻度如何互不相關(guān),這種方法的性能不變。但要注意,讀跳轉(zhuǎn)表時(shí)不能超出了表的末端,檢查越限是必需的。越限檢查時(shí)通過(guò)有條件地向PC置數(shù)實(shí)現(xiàn)的,所以越限時(shí)讀取指令被跳過(guò),并轉(zhuǎn)移到錯(cuò)誤處理。越限檢查惟一的性能代價(jià)是執(zhí)行同最大值進(jìn)行比較的指令。更直接的代碼可以是:
CMP R0,#SUBMAX ;檢查越限
BHI ERROR ;如果越限,則調(diào)出出錯(cuò)處理
LDR PC,[R1,R0,LSL #2] ;否則跳轉(zhuǎn)到表中
但是要注意,每次使用跳轉(zhuǎn)表都要承受有條件地跳過(guò)轉(zhuǎn)移的代價(jià),所以還是上面的程序更有效一些。