新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Thumb指令集之: ARM和Thumb的混合編程

        Thumb指令集之: ARM和Thumb的混合編程

        作者: 時間:2013-09-30 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257035.htm

        11.10和Thumb的

        11.10.1互交工作基礎

        Thumb以其較高的代碼密度和在窄存儲器上的性能,使得它在很多系統中得到廣泛應用。但在很多情況下,還是不得不使用指令,這是因為:

        代碼比Thumb代碼有更快的執行速度;

        ②ARM處理器的一些特定功能必須由ARM指令實現,其中包括PSR指令、協處理器指令;

        ③異常發生時,處理器自動進入ARM狀態,如果異常處理程序需要使用Thumb指令也必須通用一個ARM程序頭(ARMassemblerheader)。

        基于以上原因,即使程序需要由Thumb代碼實現,也必須通過ARM-Thumb互交(ARM-Thumbinterworking)進入Thumb狀態。

        ARM-Thumb互交是指對匯編語言和C/C++語言的ARM和Thumb代碼進行連接的方法,它進行兩種狀態(ARM和Thumb狀態)間的切換。在進行這種切換時,有時需使用額外的代碼,這些代碼被稱為定義了ARM和Thumb過程調用的標準。

        從一個ARM例程調用一個Thumb例程,內核必須進行狀態切換。狀態的變化由CPSR的T位來顯示。在跳轉到一個例程時BX指令可用于ARM和Thumb狀態切換,具體用法如下。

        在Thumb狀態調用ARM例程時,采用:

        BXRn;

        在ARM狀態調用Thumb例程時,采用:

        BX{cond}Rn;

        其中,Rn可以是r0~r15中的任意寄存器。

        這種帶狀態切換的跳轉指令BX,將寄存器Rn的內容拷貝到程序計數器寄存器PC,因此可以實現4G空間的跳轉。指令根據寄存器Rn的bit[0]來決定處理器是否進行狀態切換,詳細內容參見ARM指令一節。

        下面是一段ARM程序,該程序調用虛擬的SWI_writeC子程序從存儲器的固定地址取出字符串“helloworld”并輸出。

        AREAHello,CODE,READONLY

        SWI_WriteCEQU0 ;軟中斷調用參數

        SWI_ExitEQU11 ;程序退出軟中斷調用參數

        ENTRY

        STARTADRr1,TEXT ;取字符串地址

        LOOPLDRBr0,[r1],#1 ;取下一字節內容

        CMPr0,#0 ;判斷是否為字符串尾

        SWINESWI_WriteC ;軟中斷調用打印字符

        BENLOOP ;循環

        SWISWI_Exit ;軟中斷調用退出程序執行

        TEXT=“HelloWorld”,0a,0d,0

        END

        下面的代碼將上面的ARM代碼轉換成等價的Thumb代碼。

        AREAHelloW_Thumb,CODE,READONLY

        SWI_WriteCEQU0 ;軟中斷調用參數

        SWI_ExitEQU11 ;程序退出軟中斷調用參數

        ENTRY ;程序入口點

        CODE32進入ARM狀態

        ADRr0,START+1 ;取得Thumb代碼入口地址

        BXr0 ;進入Thumb代碼

        CODE16 ;Thumb代碼入口點

        STARTADRr1,TEXT ;r1->HelloWorld

        LOOPLDRBr0,[r1] ;取下一字節內容

        ADDr1,r1,#1 ;地址指針加1**T

        CMPr0,#0 ;判斷是否為字符串尾

        BEQDONE ;完成?**T

        SWISWI_WriteC ;如果不是字符串尾

        BLOOP ;繼續循環

        DONESWISWI_Exit ;程序退出

        ALIGN ;字對齊

        TEXTDATA

        HelloWorld,0a,0d,00

        END

        上例中,ARM代碼到Thumb代碼轉換過程中新增加的指令用“**T”標注。

        c++相關文章:c++教程



        上一頁 1 2 3 4 5 6 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大同县| 柳江县| 申扎县| 类乌齐县| 永吉县| 徐闻县| 密山市| 凤冈县| 湟源县| 龙陵县| 开江县| 梨树县| 上饶市| 安多县| 古浪县| 甘泉县| 墨江| 子洲县| 昌平区| 宁武县| 通化县| 富阳市| 双城市| 新竹县| 宝兴县| 阜南县| 调兵山市| 侯马市| 蕉岭县| 合肥市| 扶风县| 无锡市| 萨迦县| 于都县| 五常市| 金溪县| 衡阳县| 宁蒗| 陵川县| 南安市| 高青县|