新聞中心

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

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

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

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

        例如,指令BLfoo{r0=expression1,r1=expression2,r2}生成以下偽代碼:

        MOV(physical)r0,expression1

        MOV(physical)r1,expression2

        MOV(physical)r2,(virtual)r2

        BLfoo

        (3)輸出參數列表

        輸出參數列表{output_value_list}列出了用來存放功能函數和SWI調用返回值的寄存器或表達式。列表中的值可以是物理寄存器、可修改長值表達式或單個物理寄存器名稱。

        程序從特定的物理寄存器中取值并賦值到特定的表達式中。指定物理寄存器名稱而并不賦值,導致相同名稱虛擬寄存器被物理寄存器中的值更新。

        例如,BLfoo{},{result1=r0,r1}生成以下偽碼:

        BLfoo

        MOVresult1,(physical)r0

        MOV(virtual)r1,(physical)r1

        (4)被破壞的寄存器列表(orruptedregisterlist)

        此列表指定被函數調用破壞的物理寄存器。如果條件標志被調用的函數修改,必須在被破壞的寄存器列表中指定PSR。

        BL和SWI指令總是破壞lr。

        如果指令中缺少此列表項,則r0~r3、ip、lr和PSR被破壞。

        注意

        指令BL和B的區別在于,跳轉指令B只能使程序跳轉到++程序的一個地址標號,不能用于子程序調用。

        9.內嵌匯編中的標號

        代碼中定義的標號可被用作跳轉或C和“goto”語句的目標。在代碼中,C和中定義的標號可被用作跳轉指令的目標。

        10.內嵌匯編器版本間的差異

        不同版本的編譯器對內聯匯編程序的語法要求有顯著差異。在具體使用時請參見相關文檔。

        ·如果使用的是ADSv1.2,請參閱ADS開發者指南;

        ·如果使用的是RVCTv1.2,請參閱RealView編譯工具1.2版開發者指南。

        12.1.2嵌入式匯編

        利用編譯器可將匯編代碼包括到一個或多個C或函數定義中去。嵌入式匯編器提供對目標處理器不受限制的低級別訪問,利用它可以使用C和C++預處理程序偽操作(preprocessordirective)并可以方便的使用偏移量訪問結構成員。

        本小節將介紹以下內容:

        ·嵌入式匯編程序語法;

        ·嵌入式匯編語句的限制;

        ·嵌入式匯編程序表達式和C或C++表達式之間的差異;

        ·嵌入式匯編函數的生成;

        ·__cpp關鍵字;

        ·手動重復解決方案;

        ·相關基類的關鍵字;

        ·成員函數類的關鍵字;

        ·調用非靜態成員函數。

        有關為處理器編寫的詳細信息,請參閱ADS或RealView編譯工具的匯編程序指南。

        1.嵌入式語法

        嵌入式匯編函數定義由--asm(C和C++)或asm(C++)函數限定符標記,可用于:

        ·成員函數;

        ·非成員函數;

        ·模板函數;

        ·模板類成員函數。

        用__asm或asm聲明的函數可以有調用參數和返回類型。它們從C和C++中調用的方式與普通C和C++函數調用方式相同。嵌入式匯編函數語法是:

        __asmreturn-typefunction-name(parameter-list)

        {

        //ARM/Thumb/Thumb-2assemblercode

        instruction[;instruction]

        ...

        [instruction]

        }

        嵌入式匯編的初始執行狀態是在編譯程序時由編譯選項決定的。這些編譯選項如下所示:

        ·如果初始狀態為ARM狀態,則內嵌匯編器使用--arm選項;

        ·如果初始狀態為Thumb狀態,則內嵌匯編器使用--thumb選項。

        注意

        嵌入式匯編的初始狀態由編譯器的編譯選項確定,與程序中的#pragmaarm和#pragmathumb偽操作無關。

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


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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 西丰县| 两当县| 浦江县| 丘北县| 安义县| 东方市| 克拉玛依市| 巴南区| 镇康县| 海兴县| 通化县| 梁山县| 含山县| 桃源县| 洛川县| 泸州市| 增城市| 资阳市| 河池市| 即墨市| 绥滨县| 文安县| 航空| 读书| 乌兰察布市| 乌拉特后旗| 兴文县| 胶州市| 西盟| 济阳县| 双柏县| 库伦旗| 夏津县| 崇州市| 葫芦岛市| 固始县| 自贡市| 眉山市| 蓝田县| 鄂温| 客服|