新聞中心

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

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

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

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

        12.1的使用

        是包含在/++編譯器中的匯編器。使用它可以在/程序中實現C/語言不能完成的一些工作。例如,在下面幾種情況中必須使用

        ·程序中使用飽和算術運算(Saturatingarithmetic),如SSAT16和USAT16指令。

        ·程序中需要對協處理器進行操作。

        ·在C或程序中完成對程序狀態寄存器的操作。

        使用內聯匯編編寫的程序代碼效率也比較高。

        12.1.1內聯匯編

        1.內聯匯編語法

        內聯匯編使用“_asm”(C++)和“asm”(C和C++)關鍵字聲明,語法格式如下所示。

        ·__asm(instruction[;instruction]); //必須為單條指令

        __asm{instruction[;instruction]}

        ·__asm{

        ...

        instruction

        ...

        }

        ·asm(instruction[;instruction]); //必須為單條指令

        asm{instruction[;instruction]}

        ·asm{

        ...

        instruction

        ...

        }

        內聯匯編支持大部分的指令,但不支持帶狀態轉移的跳轉指令,如BX和BLX指令,詳見相關文檔。

        由于內聯匯編嵌入在C或C++程序中,所有在用法上有其自身的一些特點。

        ①如果同一行中包含多條指令,則用分號隔開。

        ②如果一條指令不能在一行中完成,使用反斜杠“/”將其連接。

        ③內聯匯編中的注釋語句可以使用C或C++風格的。

        中使用逗號“,”作為指令操作數的分隔符,所以如果在C語言中使用逗號必須用圓括號括起來。如,__asm{ADDx,y,(f(),z)}。

        ⑤內聯中的寄存器名被編譯器視為C或C++語言中的變量,所以內聯匯編中出現的寄存器名不一定和同名的物理寄存器相對應。這些寄存器名在使用前必須聲明,否則編譯器將提示警告信息。

        ⑥內聯匯編中的寄存器(除程序狀態寄存器CPSR和SPSR外)在讀取前必須先賦值,否則編譯器將產生錯誤信息。下面的例子顯示了內聯匯編和真正匯編的區別。

        錯誤的內聯匯編函數如下所示。

        intf(intx)

        {

        __asm

        {

        STMFDsp!,{r0} //保存r0不合法,因為在讀之前沒有對寄存器寫操作

        ADDr0,x,1

        EORx,r0,x

        LDMFDsp!,{r0} //不需要恢復寄存器

        }

        returnx;

        }

        將其進行改寫,使它符合內聯匯編的語法規則。

        intf(intx)

        {

        intr0;

        __asm

        {

        ADDr0,x,1

        EORx,r0,x

        }

        returnx;

        }

        下面通過幾個例子進一步了解內聯匯編的語法。

        ①字符串拷貝

        下面的例子使用一個循環完成了字符串的拷貝工作。

        #includestdio.h>

        voidmy_strcpy(constchar*src,char*dst)

        {

        intch;

        __asm

        {

        loop:

        LDRBch,[src],#1

        STRBch,[dst],#1

        CMPch,#0

        BNEloop

        }

        }

        intmain(void)

        {

        constchar*a=Helloworld!;

        charb[20];

        my_strcpy(a,b);

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

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

        return0;

        }

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


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



        上一頁 1 2 3 4 5 6 7 8 9 10 11 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 衡水市| 雷山县| 岫岩| 长海县| 抚州市| 大同县| 昔阳县| 许昌市| 蒲江县| 天柱县| 阿克陶县| 宁国市| 洪雅县| 社旗县| 孟津县| 赣榆县| 宜兴市| 莎车县| 达孜县| 吉首市| 淮安市| 嘉义县| 通渭县| 通城县| 滕州市| 手游| 招远市| 扎兰屯市| 渝北区| 太谷县| 安庆市| 永昌县| 无为县| 江陵县| 裕民县| 延寿县| 黎川县| 新泰市| 尼玛县| 大方县| 平凉市|