《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > ARM匯編程序跳轉表

ARM匯編程序跳轉表

2017-06-22
關鍵詞: 匯編語言

程序員在程序設計中,,有時為使程序成一定的功能,,需要調用一系列子程序中的一個,而決定究竟調用哪一個,,則由程序的計算值確定,。當然,,可伶來完成這件事,例如:

                     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]       ,;否則跳轉到表中

但是要注意,每次使用跳轉表都要承受有條件地跳過轉移的代價,,所以還是上面的程序更有效一些,。


本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,,并不代表本網站贊同其觀點,。轉載的所有的文章、圖片,、音/視頻文件等資料的版權歸版權所有權人所有,。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容,、版權和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,,避免給雙方造成不必要的經濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected]