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