新聞中心

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

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

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

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

        10.嵌入式匯編版本間的差異

        不同版本的編譯器對嵌入式匯編程序的語法要求會有所差異。在具體使用時請參見相關文檔。

        值得注意的是,目前的嵌入式匯編器已經完全支持v6指令集,也就是說可以在嵌入式匯編中使用v6指令集中的指令。

        12.1.3中使用SP、LR和P寄存器的遺留問題

        雖然目前的編譯器不支持在中使用SP、LR和P寄存器,但在RVTv1.2及其以前的編譯器版本中是允許的。下面的例子顯示了使用早期編譯器版本,在中使用LR寄存器的例子。

        voidfunc()

        {

        intvar;

        __asm

        {

        movvar,lr/*得到func()函數的返回地址*/

        }

        }

        如果使用RVCTv2.0編譯器編譯上面的代碼,編譯器將報告以下錯誤。

        Error:#20:identifierlrisundefined

        使用RVCTv2.0版本及其以后的編譯器,要在C或代碼中使用匯編訪問SP、LR和PC寄存器可以使用下面幾種方法。

        ①使用嵌入式匯編代碼。嵌入式匯編支持所有的ARM指令,同時允許在代碼中訪問SP、LR和PC寄存器。

        ②在內聯匯編中使用以下一些指令。

        ·__current_pc():訪問PC寄存器。

        ·__current_sp():訪問SP寄存器。

        ·__return_address():訪問LR,返回地址寄存器。

        下面給出了兩個訪問SP、LR和PC寄存器的典型實例程序。

        ①使用編譯器給定的指令。

        voidprintReg()

        {

        unsignedintspReg,lrReg,pcReg;

        __asm{

        MOVspReg,__current_sp()

        MOVpcReg,__current_pc()

        MOVlrReg,__return_address()

        }

        printf(SP=0x%Xn,spReg);

        printf(PC=0x%Xn,pcReg);

        printf(LR=0x%Xn,lrReg);

        }

        ②使用嵌入式匯編。

        __asmvoidfunc()

        {

        MOVr0,lr

        ...

        BXlr

        }

        使用嵌入式匯編可以使用調試器捕獲程序的返回地址。

        12.1.4內聯匯編代碼與嵌入式匯編代碼之間的差異

        本節總結了內聯匯編和嵌入式匯編在編譯方法上存在的差異:

        ·內聯匯編代碼使用高級處理器抽象,并在代碼生成過程中與C和代碼集成。因此,編譯程序將C和代碼與匯編代碼一起進行優化。

        ·與內聯匯編代碼不同,嵌入式匯編代碼從C和C++代碼中分離出來單獨進行匯編,產生與C和C++源代碼編譯對象相結合的編譯對象。

        ·可通過編譯程序來內聯內聯匯編代碼,但無論是顯式還是隱式,都無法內聯嵌入式匯編代碼。

        表12.1總結了內聯匯編程序與嵌入式匯編程序之間的主要差異。

        表12.1 內聯匯編程序與嵌入式匯編程序之間的主要差異

        功能

        嵌入式匯編程序

        內聯匯編程序

        指令集

        ARM和Thumb

        僅支持ARM

        ARM匯編指令偽操作

        支持

        不支持

        ARMv6指令集

        支持

        僅支持媒體指令

        C/C++表達式

        只支持常數表達式

        完全支持

        匯編代碼是否優化

        無優化

        完全優化

        能否被內聯(Inling)

        不可能

        有可能被內聯

        續表

        功能

        嵌入式匯編程序

        內聯匯編程序

        寄存器訪問

        使用指定的物理寄存器,還可以使用PC、LR和SP

        使用虛擬寄存器。不能使用PC、LR和SP寄存器

        是否自動產生返回指令

        手工添加返回指令

        指定產生(但不支持BX、BXJ和BLX指令)

        是否支持BKPT指令

        不直接支持

        不支持

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


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



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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 峨山| 万山特区| 华宁县| 海门市| 三明市| 巴青县| 洛阳市| 易门县| 哈密市| 抚宁县| 嘉禾县| 中宁县| 河北区| 武清区| 苏尼特左旗| 同心县| 南木林县| 潼关县| 康马县| 东兴市| 远安县| 鸡东县| 新建县| 江城| 临潭县| 漯河市| 葫芦岛市| 九龙城区| 自治县| 泉州市| 陇南市| 民权县| 丹凤县| 颍上县| 志丹县| 巴林右旗| 淄博市| 城固县| 高碑店市| 宁波市| 鹤壁市|