新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 混合使用C、C++和匯編語(yǔ)之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

        混合使用C、C++和匯編語(yǔ)之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

        作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò) 收藏

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

        從編譯的代碼可以看出,編譯器將“addtotal,j,i+j”分為兩步來(lái)完成,用戶(hù)在編寫(xiě)自己的應(yīng)用程序時(shí)要特別注意這一點(diǎn)。

        包含多個(gè)表達(dá)式操作數(shù)的指令,沒(méi)有指定表達(dá)式操作數(shù)求值的順序。

        ++表達(dá)式用作程序操作數(shù),如果表達(dá)式的值不能滿(mǎn)足指令中所要求的指令操作數(shù)約束條件,一條指令將被擴(kuò)展為多條指令。

        如果用作操作數(shù)的表達(dá)式創(chuàng)建需要析構(gòu)的臨時(shí)函數(shù),析構(gòu)將發(fā)生在執(zhí)行指令之后,這與++析構(gòu)臨時(shí)函數(shù)的規(guī)則相類(lèi)似。

        簡(jiǎn)單表達(dá)式操作數(shù)包含以下幾種類(lèi)型。

        ·變量值

        ·變量地址

        ·指針變量的反引用(thedereferencingofapointvarable)

        ·偽操作指定的程序常量

        非簡(jiǎn)單表達(dá)式操作數(shù)包含以下幾種類(lèi)型。

        ·隱式函數(shù)調(diào)用,如除法,或顯式函數(shù)調(diào)用

        ·臨時(shí)函數(shù)的構(gòu)造

        ·算術(shù)或邏輯操作

        (3)寄存器列表

        寄存器列表最多可包含16個(gè)操作數(shù)。這些操作數(shù)可以是虛擬寄存器或表達(dá)式操作數(shù)。在寄存器列表中指定虛擬寄存器和表達(dá)式操作數(shù)的順序非常重要。寄存器列表中操作數(shù)的讀寫(xiě)順序是從左到右。第一個(gè)操作數(shù)使用最低地址,隨后的操作數(shù)的地址依次在前一地址基礎(chǔ)上增加4。這一點(diǎn)與LDM或STM指令的普通操作(編號(hào)最低的物理寄存器總是存入最低的存儲(chǔ)器地址)是不同的。之所以存在這種區(qū)別是因?yàn)樵趦?nèi)聯(lián)匯編中使用的寄存器被編譯器虛擬化了。

        同一個(gè)表達(dá)式操作數(shù)或虛擬寄存器可以在寄存器列表中出現(xiàn)多次,重復(fù)使用。

        如果表達(dá)式操作數(shù)或虛擬寄存器被指定為指令中的基址寄存器,表達(dá)式或虛擬寄存器的值按照指令尋址方式進(jìn)行更新。更新將覆蓋原表達(dá)式或虛擬寄存器的值。

        (4)中間操作數(shù)(Intermediateoperands)

        在內(nèi)聯(lián)匯編指令中,可能將C或整型常量表達(dá)式用作立即數(shù)處理。用于指定直接移位的常量表達(dá)式的值必須在指令規(guī)定的移位操作數(shù)的范圍內(nèi);用于為存儲(chǔ)器或協(xié)處理器數(shù)據(jù)傳送指令指定直接偏移量的常量表達(dá)式,必須符合ARM體系結(jié)構(gòu)中的內(nèi)存對(duì)齊標(biāo)準(zhǔn)。

        8.函數(shù)調(diào)用和分支跳轉(zhuǎn)

        利用內(nèi)聯(lián)匯編程序的BL和SWI指令可在常規(guī)指令字段后指定3個(gè)可選列表。這些指令格式有以下幾種。

        SWI{cond}swi_num,{input_param_list},{output_value_list},{corrupt_reg_list}

        BL{cond}function,{input_param_list},{output_value_list},{corrupt_reg_list}

        其中,swi_num為SWI調(diào)用的中斷號(hào);function為被調(diào)用函數(shù)名;{input_param_list}為輸入?yún)?shù)列表;{output_value_list}為輸出參數(shù)列表;{corrupt_reg_list}為被破壞寄存器列表。

        注意

        內(nèi)聯(lián)匯編程序不支持BX、BLX和BXJ指令。不能在任何輸入、輸出或“被破壞的寄存器列表(corruptedregisterlist)”中指定lr、sp或pc寄存器;任何SWI指令或函數(shù)調(diào)用不能更改sp寄存器。

        下面分別詳細(xì)介紹語(yǔ)法格式中各參數(shù)的使用。

        (1)未指定任何列表

        如果在SWI和BL指令后沒(méi)指定任何列表,則有下面規(guī)則。

        ·r0~r3用作輸入?yún)?shù);

        ·r0用于輸出值;

        ·r12和r14的值將會(huì)被修改。

        (2)輸入?yún)?shù)列表

        指令中的輸入?yún)?shù)列表{input_param_list}列出了傳遞給被調(diào)用函數(shù)function和SWI的參數(shù)。被傳遞的參數(shù)可以是表達(dá)式、變量或包含表達(dá)式或變量的物理寄存器。

        內(nèi)聯(lián)匯編編譯器在編譯時(shí)增加一小段編譯程序負(fù)責(zé)在函數(shù)和SWI調(diào)用前

        將傳遞的參數(shù)載入特定的物理寄存器中。為確保與現(xiàn)有內(nèi)聯(lián)匯編代碼的向后兼容性,程序中指定物理寄存器名稱(chēng)而并不對(duì)其賦值,使相同名稱(chēng)虛擬寄存器中的值出現(xiàn)在物理寄存器中。

        c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


        c++相關(guān)文章:c++教程




        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 泰州市| 大田县| 博野县| 荣昌县| 安阳市| 嘉黎县| 神木县| 长岛县| 中牟县| 甘洛县| 沿河| 南丰县| 伊吾县| 大同市| 叶城县| 化德县| 阳信县| 宝丰县| 城口县| 射洪县| 安康市| 酉阳| 信阳市| 保德县| 新河县| 固原市| 永嘉县| 甘洛县| 綦江县| 来安县| 镇赉县| 白朗县| 秭归县| 晋州市| 克拉玛依市| 原阳县| 清水河县| 焉耆| 新安县| 金昌市| 凭祥市|