新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 混合使用C、C++和匯編語之:內聯匯編和嵌入型匯編的使用

        混合使用C、C++和匯編語之:內聯匯編和嵌入型匯編的使用

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

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

        可以顯示地使用、THUMB和ODE16偽操作改變嵌入式匯編的執行狀態。關于偽操作的詳細信息請參加指令偽操作一節。如果使用的處理器支持Thumb-2指令,則可以在Thumb狀態下,在嵌入式匯編中使用Thumb-2指令。

        參數名允許用在參數列表中,但不能用在嵌入式匯編函數體內。例如,以下函數在函數體內使用整數i,但在匯編中無效:

        __asmintf(inti){

        ADDi,i,#1//編譯器報錯

        }

        可以使用r0代替i。

        下面通過嵌入式匯編的例子,來進一步熟悉嵌入式匯編的使用。

        下面的例子實現了字符串的拷貝,注意和上一節中中字符串拷貝的例子相比較,分析其中的區別。

        #includestdio.h>

        __asmvoidmy_strcpy(constchar*src,constchar*dst){

        loop

        LDRBr3,[r0],#1

        STRBr3,[r1],#1

        MPr3,#0

        BNEloop

        MOVpc,lr

        }

        voidmain()

        {

        constchar*a=Helloworld!;

        charb[20];

        my_strcpy(a,b);

        printf(Originalstring:'%s'n,a);

        printf(opiedstring:'%s'n,b);

        }

        2.嵌入式的使用限制

        嵌入式匯編的使用有下面一些限制。

        ①在預處理之后,__asm函數只能包含匯編代碼,但以下標識符除外:

        ·__cpp(expr);

        ·__offsetof_base(D,B);

        ·__mcall_is_virtual(D,f);

        ·__mcall_is_in_vbase(D,f);

        ·__mcall_this_offset(D,f);

        ·__vcall_offsetof_vfunc(D,f);

        ②編譯程序不為__asm函數生成返回指令。如果要從__asm函數返回,必須將用匯編代碼編寫的返回指令包含到函數體內。由于嵌入式匯編執行__asm函數的順序是在編譯時定義好的,所有從一個內嵌匯編跳轉到一個內嵌匯編程序是運行的,但在中卻不能實現。

        ③__asm函數調用遵循AAPCS規則。所以,即使在__asm函數體內可用的匯編代碼(例如,更改狀態),在__asm函數和普通C或函數相互調用時,未必可用,因為此調用也必須遵循AAPCS規則。

        c語言相關文章:c語言教程


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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 中超| 和林格尔县| 肃南| 措勤县| 宜良县| 准格尔旗| 朝阳区| 饶河县| 漳州市| 邢台县| 彰化县| 穆棱市| 汨罗市| 惠来县| 娄底市| 得荣县| 驻马店市| 定陶县| 延津县| 和林格尔县| 道孚县| 绍兴市| 承德县| 益阳市| 当阳市| 榆中县| 南漳县| 葵青区| 阿勒泰市| 乃东县| 太仆寺旗| 镇宁| 荣成市| 洛浦县| 长汀县| 安庆市| 武宁县| 许昌市| 汝阳县| 龙海市| 柳林县|