新聞中心

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

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

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

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

        上面的例子分為4部分,通過下面的步驟編譯和運行。

        ①使用文本編輯器,如notepad,輸入上面的代碼,并保存成文件addreg.s;

        ②在命令行中鍵入匯編命令armasm–gaddreg.s;

        ③在命令行中鍵入鏈接命令armlinkaddreg.o-oaddreg;

        ④使用調試器(Debugger)(如,RealViewDebuggerorAXD)運行映像文件。可以使用單步執行,觀察代碼在Thumb狀態下的執行。

        注意

        Thumb代碼的地址標號如果用偽操作export聲明為“外部的”,則連接器會自動調整該地址標號使其bit[0]等于1;如果該地址標號沒有被聲明為“外部的”,則使用者必須手動地對標號進行調整,如上例中的ThumProg+1。

        (5)v5架構下的狀態切換

        v5體系結構的指令集中,增加了下面兩條指令用于和Thumb代碼互交。

        ·BLXaddress

        該指令跳轉到指令中指定的地址處執行程序并進行程序狀態切換,該地址是“PC相關的”,地址范圍為±32MB(ARM狀態)或±4MB(Thumb狀態)。

        ·BLXregister

        在該中格式的跳轉指令中寄存器Rm指定轉移目標,Rm的第0位拷貝到CPSR中的T位,bit[31:0]移入PC。

        使用上面兩條指令,在執行程序跳轉之前,處理器自動將返回連接寄存器LR的bit[0]位更新為CPSR寄存器的T位,所以無論處理器狀態是否發生變化,程序都能正確返回。

        當使用LDR、LDM及POP指令向PC寄存器中賦值時,寄存器CPSR中的Thumb位將被設置成PC寄存器的bit[0],這時就實現了程序狀態的切換。這種方法在子程序的返回時非常有效,同樣的指令可以根據需要返回到ARM狀態或Thumb狀態。

        連接器在對目標代碼進行連續時,將代碼中的地址標號分為3類。

        ·ARM指令地址標號。

        ·Thumb指令地址標號。

        ·數據(Data)地址標號。

        當連接器重定位Thumb代碼中的地址標號時,地址標號的bit[0]位將被自動設置為1。這就意味著跳轉指令(這些指令包括BX、BLX和LDR)可以根據目標地址正確的進行狀態切換。

        注意

        上面提到的連接器自動設置目的地址的行為,只有在ARMv5及其以上版本中支持。

        2.使用C和C++語言實現互交

        對于不同的C和C++源程序,可以有些程序中包含ARM指令,有些程序中包含Thumb指令,這些程序可以相互調用,只是在編譯這些程序時指定--apcs/interwork選項。當使用了--apcs/interwork選項,編譯器會自動進行一些相應處理;連接器在檢測到程序中存在互交工作時,會生成一些用于程序狀態切換的代碼。

        (1)代碼編譯

        可以使用下面的指令,將C或C++程序編譯為可以執行互交的目標代碼。

        armcc--c90--thumb--apcs/interwork

        armcc--c90--arm--apcs/interwork

        armcc--cpp--thumb--apcs/interwork

        armcc--cpp--arm--apcs/interwork

        注意

        --cpp是C++文件(文件后綴為.cpp)默認的編譯選項。

        使用--apcs/interwork選項對文件進行編譯時,編譯器會進行如下處理。

        ·對于葉子程序(leaffunction,即程序中沒有其他子程序調用的程序),編譯器將程序中的“MOVPC,LR”指令替換成“BXLR”指令,因為“MOVPC”指令不能進行狀態切換。

        ·對于非葉子程序,要進行一系列的指令替換,如:

        POP{r4,r5,pc}

        替換為:

        POP{r4,r5}

        POP{r3}

        BXr3

        下面的例子顯示了一段帶子程序調用的C語言程序,使用--apcs/interwork選項進行編譯時,對代碼產生的影響。

        C語言源程序。

        Voidfunc(void)

        {

        ….

        Sub()

        ..

        }

        使用armcc--apcs/interwork選項進行編譯產生結果如下。

        Func

        STMFDsp!,{r4-r7,lr}

        ….

        BLsub

        ….

        LDMFDsp!,{r4-r7,lr}

        BXlr

        使用tcc--apcs/interwork選項進行編譯產生結果如下。

        PUSH{r4-r7,lr}

        ….

        BLsub

        ….

        POP{r4-r7}

        POP{r3}

        BX

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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 建湖县| 嘉义市| 双柏县| 凉城县| 南开区| 全州县| 义乌市| 安康市| 十堰市| 边坝县| 新乡县| 宜宾市| 达日县| 元朗区| 姜堰市| 柘城县| 夏邑县| 万盛区| 郁南县| 阳朔县| 五莲县| 聊城市| 上栗县| 石城县| 文水县| 永清县| 乡城县| 樟树市| 滦南县| 雅江县| 磐石市| 昌吉市| 连平县| 皮山县| 天台县| 蓬安县| 黔南| 潞城市| 焦作市| 安阳县| 富源县|