在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM中ADS環(huán)境下C語(yǔ)言和匯編語(yǔ)言混合編程及示例

            ARM中ADS環(huán)境下C語(yǔ)言和匯編語(yǔ)言混合編程及示例

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

              稍大規(guī)模的嵌入式程序設(shè)計(jì)中,大部分的代碼都是用C來(lái)編寫(xiě)的,主要是因?yàn)镃語(yǔ)言具有較強(qiáng)的結(jié)構(gòu)性,便于人的理解,并且具有大量的庫(kù)支持。但對(duì)于一寫(xiě)硬件上的操作,很多地方還是要用到匯編語(yǔ)言,例如硬件系統(tǒng)的初始化中的CPU 狀態(tài)的設(shè)定,中斷的使能,主頻的設(shè)定,RAM控制參數(shù)等。另外在一些對(duì)性能非常敏感的代碼塊,基于匯編與機(jī)器碼一一對(duì)應(yīng)的關(guān)系,這時(shí)不能依靠C編譯器的生成代碼,而要手工編寫(xiě)匯編,從而達(dá)到優(yōu)化的目的。匯編語(yǔ)言是和CPU的指令集緊密相連的,作為涉及底層的開(kāi)發(fā),熟練對(duì)應(yīng)匯編語(yǔ)言的使用也是必須的。這里主要討論C和匯編的混合編程,包括相互之間的函數(shù)調(diào)用。下面分四種情況來(lái)進(jìn)行討論,不涉及C++語(yǔ)言。

            本文引用地址:http://www.biyoush.com/article/201608/295298.htm

              一、在C語(yǔ)言中內(nèi)嵌匯編

              在C中內(nèi)嵌的匯編指令包含大部分的和Thumb指令,不過(guò)使用與單純的匯編程序使用的指令略有不同,存在一些限制,主要有下面幾個(gè)方面:

              a 不能直接向PC 寄存器賦值,程序跳轉(zhuǎn)要使用B或者BL指令;

              b 在使用物理寄存器時(shí),不要使用過(guò)于復(fù)雜的C表達(dá)式,避免物理寄存器沖突;

              c R12和R13可能被編譯器用來(lái)存放中間編譯結(jié)果,計(jì)算表達(dá)式值時(shí)可能把R0-R3、R12及R14用于子程序調(diào)用,因此避免直接使用這些物理寄存器;

              d 一般不要直接指定物理寄存器;

              e 讓編譯器進(jìn)行分配內(nèi)嵌匯編使用的標(biāo)記是__asm或asm關(guān)鍵字,用法如下:__asm{instruction [; instruction]}或 asm(instruction

              [; instruction])。

              下面是一個(gè)例子來(lái)說(shuō)明如何在C中內(nèi)嵌匯編語(yǔ)言

              C語(yǔ)言文件.c httphi.baidu.comprocatlaw

              #include stdio.h

              void my_strcpy(const char src, char dest){

              char ch;

              __asm{

              loop

              ldrb ch, [src], #1

              strb ch, [dest], #1

              cmp ch, #0

              bne loop }}

              int main(){

              char a=forget it and move on!;

              char b[64];

              my_strcpy(a, b);

              printf(original %s, a);

              printf(copyed %s, b);

              return 0;

              }

              在此例子中C語(yǔ)言和匯編之間的值傳遞是用C語(yǔ)言的指針來(lái)實(shí)現(xiàn)的,因?yàn)橹羔槍?duì)應(yīng)的是地址,所以匯編中也可以訪問(wèn)。

              二、在匯編中使用C定義的全局變量

              內(nèi)嵌匯編不用單獨(dú)編輯匯編語(yǔ)言文件,比較簡(jiǎn)潔,但是有很多的限制。當(dāng)匯編的代碼較多時(shí)一般放在單獨(dú)的匯編文件中,這時(shí)就需要在匯

              編文件和C文件之間進(jìn)行一些數(shù)據(jù)的傳遞,最簡(jiǎn)便的辦法就是使用全局變量。

              下面是一個(gè)C語(yǔ)言和匯編語(yǔ)言共享全局變量的例子:

              C語(yǔ)言文件.c

              #include stdio.h

              int gVar=12;

              extern asmDouble(void);

              int main(){

              printf(original value of gVar is %d, gVar_1);

              asmDouble();

              printf( modified value of gVar is %d, gVar_1);

              return 0;

              }

              ;匯編語(yǔ)言文件.S httphi.baidu.comprocatlaw

              AREA asmfile, CODE, READONLY EXPORT asmDouble

              IMPORT gVar

              asmDouble

              ldr r0, =gVar

              ldr r1, [r0]

              mov r2, #2

              mul r3, r1, r2

              str r3, [r0]

              mov pc, lr

              END

              在此例中,匯編文件與C文件之間相互傳遞了全局變量gVar和函數(shù)asmDouble,留意聲明的關(guān)鍵字extern和IMPORT

              三、在C中調(diào)用匯編的函數(shù)

              有一些對(duì)機(jī)器要求高的敏感函數(shù),通過(guò)C語(yǔ)言編寫(xiě)再通過(guò)C編譯器翻譯有時(shí)會(huì)出現(xiàn)誤差,因此這樣的函數(shù)一般采用匯編語(yǔ)言來(lái)編寫(xiě),然后供C語(yǔ)言調(diào)用。在C文件中調(diào)用匯編文件中的函數(shù),要注意的有兩點(diǎn),一是要在C文件中聲明所調(diào)用的匯編函數(shù)原型,并加入extern關(guān)鍵字作為引入函數(shù)的聲明;二是在匯編文件中對(duì)對(duì)應(yīng)的匯編代碼段標(biāo)識(shí)用EXPORT關(guān)鍵字作為導(dǎo)出函數(shù)的聲明,函數(shù)通過(guò)mov pc, lr指令返回。這樣,就可以在C文件中使用該函數(shù)了。從C語(yǔ)言的角度的角度,并不知道調(diào)用的函數(shù)的實(shí)現(xiàn)是用C語(yǔ)言還是匯編匯編語(yǔ)言,原因C語(yǔ)言的函數(shù)名起到表明函數(shù)

              代碼起始地址的作用,而這個(gè)作用和匯編語(yǔ)言的代碼段標(biāo)識(shí)符是一致的。

              下面是一個(gè)C語(yǔ)言調(diào)用匯編函數(shù)例子:

              C語(yǔ)言文件.c httphi.baidu.comprocatlaw

              #include stdio.h

              extern void asm_strcpy(const char src, char dest);

              int main(){

              const char s=seasons in the sun; char d[32];

              asm_strcpy(s, d);

              printf(source %s, s);

              printf( destination %s,d);

              return 0;

              }

              ;匯編語(yǔ)言文件.S httphi.baidu.comprocatlaw

              AREA asmfile, CODE, READONLY

              EXPORT asm_strcpy

              asm_strcpy

              loop

              ldrb r4, [r0], #1

              cmp r4, #0

              beq over

              strb r4, [r1], #1

              b loop

              over

              mov pc, lr

              END

              在此例中,C語(yǔ)言和匯編語(yǔ)言之間的參數(shù)傳遞是通過(guò)對(duì)應(yīng)的用R0-R3來(lái)進(jìn)行傳遞,即R0傳遞第一個(gè)參數(shù),R1傳遞第二個(gè)參數(shù),多于4個(gè)時(shí)借助棧完成,函數(shù)的返回值通過(guò)R0來(lái)傳遞。這個(gè)規(guī)定叫作ATPCS( Thumb Procedure Call Standard),具體見(jiàn)ATPCS規(guī)范。

              四、在匯編中調(diào)用C的函數(shù)

              在匯編語(yǔ)言中調(diào)用C語(yǔ)言的函數(shù),需要在匯編中IMPORT對(duì)應(yīng)的C函數(shù)名,然后將C的代碼放在一個(gè)獨(dú)立的C文件中進(jìn)行編譯,剩下的工作由連接器來(lái)處理。

              下面是一個(gè)匯編語(yǔ)言調(diào)用C語(yǔ)言函數(shù)例子:

              C語(yǔ)言文件.c int cFun(int a, int b, int c){ return a+b+c;}

              ;匯編語(yǔ)言文件.S AREA asmfile, CODE, READONLY

              EXPORT cFun

              start

              mov r0, #0x1

              mov r1, #0x2

              mov r2, #0x3

              bl cFun

              nop

              nop

              b start

              END

              在匯編語(yǔ)言中調(diào)用C語(yǔ)言的函數(shù),參數(shù)的傳遞也是按照ATPCS規(guī)范來(lái)實(shí)現(xiàn)的。

              在這里簡(jiǎn)單介紹一下部分ATPCS規(guī)范:子程序間通過(guò)寄存器R0~R3來(lái)傳遞參數(shù)。

              A.在子程序中,使用寄存器R4~R11來(lái)保存局部變量。

              B.寄存器R12用于子程序間scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出桟),記作IP。

              C.寄存器R13用于數(shù)據(jù)棧指針,記作SP。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。

              D.寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。

              E.寄存器R15是程序計(jì)數(shù)器,記作PC

              F.參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器R0~R3來(lái)傳遞參數(shù),當(dāng)參數(shù)超過(guò)4個(gè)時(shí),還可以使用數(shù)據(jù)棧來(lái)傳遞參數(shù)。

              G.結(jié)果為一個(gè)32位整數(shù)時(shí),可以通過(guò)寄存器R0返回

              H.結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過(guò)寄存器R0和R1返回,依次類推。



            關(guān)鍵詞: ARM 嵌入式系統(tǒng)

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉