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

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

2017-06-22
關(guān)鍵詞: 匯編語(yǔ)言

程序員在程序設(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à),所以還是上面的程序更有效一些。


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