新聞中心

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

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

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

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

        (2)C語言的互交實例

        下面的例子顯示了一個Thumb狀態下的代碼通過互交調用子程序;而后又在子程序中調用的庫函數printf()。

        /*********************

        *thumbmain.c*

        **********************/

        #includestdio.h>

        externvoidarm_function(void);

        intmain(void)

        {

        printf(HellofromThumbWorldn);

        arm_function();

        printf(AndgoodbyefromThumbWorldn);

        return(0);

        }

        /*********************

        *armsub.c*

        **********************/

        #includestdio.h>

        voidarm_function(void)

        {

        printf(HelloandGoodbyefromworldn);

        }

        使用下面的命令對程序進行編譯連接。

        ①編譯生成帶互交的Thumb代碼。

        armcc--thumb-c-g--apcs/interwork-othumbmain.othumbmain.c

        ②編譯生成帶互交的ARM代碼。

        armcc-c-g--apcs/interwork-oarmsub.oarmsub.c

        ③連接目標文件。

        armlinkthumbmain.oarmsub.o-othumbtoarm.axf

        另外,可以使用--info選項使連接器輸出由于互交所增加的代碼大小。

        armlinkarmsub.othumbmain.o-othumbtoarm.axf--infoveneers

        輸出信息如下所示。

        Addingstotheimage

        AddingTAveneer(4bytes,Inline)forcallto'arm_function'fromthumbmain.o(.text).

        AddingATveneer(8bytes,Inline)forcallto'__0printf'fromarmsub.o(.text).

        AddingATveneer(8bytes,Inline)forcallto'__rt_lib_init'fromkernel.o(.text).

        AddingATveneer(12bytes,Long)forcallto'__rt_lib_shutdown'fromkernel.o(.text).

        AddingTAveneer(4bytes,Inline)forcallto'__rt_memclr_w'fromstdio.o(.text).

        AddingTAveneer(4bytes,Inline)forcallto'__rt_raise'fromstdio.o(.text).

        AddingTAveneer(8bytes,Short)forcallto'__rt_exit'fromexit.o(.text).

        AddingTAveneer(4bytes,Inline)forcallto'__user_libspace'fromfree.o(.text).

        AddingTAveneer(4bytes,Inline)forcallto'_fp_init'fromlib_init.o(.text).

        AddingTAveneer(4bytes,Inline)forcallto'__heap_extend'frommalloc.o(.text).

        AddingATveneer(8bytes,Inline)forcallto'__raise'fromrt_raise.o(.text).

        AddingTAveneer(4bytes,Inline)forcallto'__rt_errno_addr'fromftell.o(.text).

        12(s)(total72bytes)addedtotheimage.

        (3)Thumb狀態下的功能指針

        任何指向Thumb函數(由Thumb指令完成的功能函數并且其返回狀態也為Thumb狀態)的指針,其最低有效位(LSB)必為1。

        當重定位Thumb代碼中的地址標號時,連接器將自動設置地址的最低有效位。如果在程序中使用絕對地址,連接器將無法完成該設置。因此,如果在Thumb代碼中使用絕對地址時,必須手工設置為其地址加1。

        下面的例子顯示了Thumb代碼的功能指針的使用。

        typedefint(*FN)();

        myfunc(){

        FNfnptrs[]={

        (FN)(0x8084+1), //有效的Thumb地址

        (FN)(0x8074) //無效的Thumb地址

        };

        FN*myfunctions=fnptrs;

        myfunctions[0](); //調用成功

        myfunctions[1](); //調用失敗

        }

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



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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 冷水江市| 高州市| 稻城县| 卢龙县| 农安县| 湟源县| 株洲市| 大田县| 古丈县| 富阳市| 岳西县| 桐梓县| 象州县| 岚皋县| 鄯善县| 拉萨市| 江安县| 黑水县| 蓝山县| 甘孜县| 霍山县| 壶关县| 大邑县| 五河县| 子洲县| 田东县| 平陆县| 犍为县| 闸北区| 昭觉县| 乌拉特前旗| 丰镇市| 靖西县| 石河子市| 万宁市| 周至县| 娱乐| 敖汉旗| 苍南县| 林口县| 漳浦县|