欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ARM嵌入式開發(fā)中的GCC內(nèi)聯(lián)匯編簡(jiǎn)介

系統(tǒng) 2089 0

ARM嵌入式開發(fā)中的GCC內(nèi)聯(lián)匯編簡(jiǎn)介

嵌入式開發(fā)交流群280352802,歡迎加入!

在針對(duì)ARM體系結(jié)構(gòu)的編程中,一般很難直接使用C語言產(chǎn)生操作協(xié)處理器的相關(guān)代碼,因此使用匯編語言來實(shí)現(xiàn)就成為了唯一的選擇。但如果完全通過匯編代碼實(shí)現(xiàn),又會(huì)過于復(fù)雜、難以調(diào)試。因此,C語言內(nèi)嵌匯編的方式倒是一個(gè)不錯(cuò)的選擇。然而,使用內(nèi)聯(lián)匯編的一個(gè)主要問題是,內(nèi)聯(lián)匯編的語法格式與使用的編譯器直接相關(guān),也就是說,使用不同的C編譯器內(nèi)聯(lián)匯編代碼時(shí),它們的寫法是各不相同的。下面介紹在ARM體系結(jié)構(gòu)下GCC的內(nèi)聯(lián)匯編。 GCC內(nèi)聯(lián)匯編的一般格式:

    asm(  


     代碼列表  
     : 輸出運(yùn)算符列表  
     : 輸入運(yùn)算符列表  
     : 被更改資源列表  
);
  

在C代碼中嵌入?yún)R編需要使用asm關(guān)鍵字,在asm的修飾下,代碼列表、輸出運(yùn)算符列表、輸入運(yùn)算符列表和被更改的資源列表這4個(gè)部分被3個(gè)“:”分隔。下面,我們看一個(gè)例子:

    void test(void)
{  
    ……  
    asm(  
        "mov r1,#1\n"  
        :  
        :  
        :"r1"  
    );  
    ……  
} 
  

注:換行符和制表符的使用可以使得指令列表看起來變得美觀。你第一次看起來可能有點(diǎn)怪異,但是當(dāng)C編譯器編譯C語句的是候,它就是按照上面(換行和制表)生成匯編的。

函數(shù)test中內(nèi)嵌了一條匯編指令實(shí)現(xiàn)將立即數(shù)1賦值給寄存器R1的操作。由于沒有任何形式的輸出和輸入,因此輸出和輸入列表的位置上什么都沒有填寫。但是,在匯編代碼執(zhí)行過程中R1寄存器會(huì)被修改,因此為了通知編譯器,在被更改資源列表中,需要寫上寄存器R1。

寄存器被修改這種現(xiàn)象發(fā)生的頻率還是比較高的。例如,在調(diào)用某段匯編程序之前,寄存器R1可能已經(jīng)保存了某個(gè)重要數(shù)據(jù),當(dāng)匯編指令被調(diào)用之后,R1寄存器被賦予了新的值,原來的值就會(huì)被修改,所以,需要將會(huì)被修改的寄存器放入到被更改資源列表中,這樣編譯器會(huì)自動(dòng)幫助我們解決這個(gè)問題。也可以說,出現(xiàn)在被更改資源列表中的資源會(huì)在調(diào)用匯編代碼一開始就首先保存起來,然后在匯編代碼結(jié)束時(shí)釋放出去。所以,上面的代碼與如下代碼從語義上來說是等價(jià)的。

    void test(void)
{  
    ……  
    asm(  
        "stmfd sp!,{r1}\n"
        "mov r1,#1\n"  
        "ldmfd sp!,{r1}\n"  
    );  
    ……  
}
  

這段代碼中的內(nèi)聯(lián)匯編既無輸出又無輸入,也沒有資源被更改,只留下了匯編代碼的部分。由于程序在修改R1之前已經(jīng)將寄存器R1的值壓入了堆棧,在使用完之后,又將R1的值從堆棧中彈出,所以,通過被更改資源列表來臨時(shí)保存R1的值就沒什么必要了。

在以上兩段代碼中,匯編指令都是獨(dú)立運(yùn)行的。但更多的時(shí)候,C和內(nèi)聯(lián)匯編之間會(huì)存在一種交互。C程序需要把某些值傳遞給內(nèi)聯(lián)匯編運(yùn)算,內(nèi)聯(lián)匯編也會(huì)把運(yùn)算結(jié)果輸出給C代碼。此時(shí)就可以通過將適當(dāng)?shù)闹盗性谳斎脒\(yùn)算符列表和輸出運(yùn)算符列表中來實(shí)現(xiàn)這一要求。請(qǐng)看下面的例子:

    void test(void)
{  
    int tmp=5;  
    asm(  
        "mov r4,%0\n"  
        :  
        :"r"(tmp)  
        :"r4"  
    );  
} 
  

上面的代碼中有一條mov指令,該指令將%0賦值給R4。這里,符號(hào)%0代表出現(xiàn)在輸入運(yùn)算符列表和輸出運(yùn)算符列表中的第一個(gè)值。如果%1存在的話,那么它就代表出現(xiàn)在列表中的第二個(gè)值,依此類推。所以,在該段代碼中,%0代表的就是“r”(tmp)這個(gè)表達(dá)式的值了。
那么這個(gè)新的表達(dá)式又該怎樣解釋呢?原來,在“r”(tmp)這個(gè)表達(dá)式中,tmp代表的正是C語言向內(nèi)聯(lián)匯編輸入的變量,操作符“r”則代表tmp的值會(huì)通過某一個(gè)寄存器來傳遞。在GCC4中與之相類似的操作符還包括“m”、“I”,等等,其含義見下表:


與輸入運(yùn)算符列表的應(yīng)用方法一致,當(dāng)C語言需要利用內(nèi)聯(lián)匯編輸出結(jié)果時(shí),可以使用輸出運(yùn)算符列表來實(shí)現(xiàn),其格式應(yīng)該是下面這樣的。

    void test(void)
{  
    int tmp;  
    asm(  
        "mov %0,#1\n"  
        :"=r"(tmp)  
        :  
    );  
} 
  

在上面的代碼中,原本應(yīng)出現(xiàn)在輸入運(yùn)算符列表中的運(yùn)算符,現(xiàn)在出現(xiàn)在了輸出運(yùn)算符列表中,同時(shí)變量tmp將會(huì)存儲(chǔ)內(nèi)聯(lián)匯編的輸出結(jié)果。這里有一點(diǎn)可能已經(jīng)引起大家的注意了,上面的代碼中操作符r的前面多了一個(gè)“=”。這個(gè)等號(hào)被稱為約束修飾符,其作用是對(duì)內(nèi)聯(lián)匯編的操作符進(jìn)行修飾。幾種修飾符的含義如下表所示:

當(dāng)一個(gè)操作符沒有修飾符對(duì)其進(jìn)行修飾時(shí),代表這個(gè)操作符是只讀的。當(dāng)我們需要將內(nèi)聯(lián)匯編的結(jié)果輸出出來,那么至少要保證該操作符是可寫的。因此,“=”或者“+”也就必不可少了。

ARM嵌入式開發(fā)中的GCC內(nèi)聯(lián)匯編簡(jiǎn)介


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!??!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品免费久久久久久成人影院 | 久久中文字幕一区二区三区 | 精品免费视频 | 日韩黄色影视 | 人人搞人人干 | 亚洲黄色免费观看 | 久久精品一区二区免费播放 | 日韩 欧美 国产 亚洲 中文 | 青草青草久热精品视频在线网站 | 东京不太热在线新视频 | 天天色天天综合 | av在线国产精品 | 免费一级在线 | 欧美精品午夜 | 日韩欧美一区二区三区四区 | 亚洲最大福利视频 | 国产日韩欧美自拍 | 黄页网站免费高清在线观看 | 五月婷婷 六月丁香 | 九九热色 | 奇米影视在线 | 亚洲一区二区三区视频 | 久久com | 日韩欧美国产精品第一页不卡 | 丁香花成人另类小说 | 国产在线精品一区二区三区 | 久久综合九色综合欧美9v777 | 久草app下载 | 影音先锋中文字幕在线 | 国产精品国产精品国产专区不卡 | 欧美精品二区三区 | 国产乱人乱精一区二区视频密 | 免费能直接在线观看黄的视频 | 久久中文字幕视频 | 国产精品久久久久久久久免费相片 | 亚洲欧美日韩中文字幕在线一区 | 台湾一级毛片永久免费 | 人人九九精品 | 久久中文字幕网站篠田优 | 亚洲www在线 | 国产亚洲精品一品区99热 |