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