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

ARM匯編程序跳轉(zhuǎn)表

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

程序員在程序設計中,有時為使程序成一定的功能,需要調(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)移的代價,所以還是上面的程序更有效一些。


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