C語言與匯編語言混合編程應遵循的規則

電腦雜談  發布時間:2020-01-29 05:06:37  來源:網絡整理

c語言對應匯編語句_匯編語言和c語言哪個難_c語言程序設計試題匯編

ARM編程中使用的C語言是標準C語言,ARM的研發環境實際上就是嵌入了一個C語言的集成開發環境,只不過這個研發環境與ARM的硬件緊密相關。 在使用C語言時,要用到和匯編語言的混合編程。若匯編代碼較為簡潔,則能使用直接內置匯編的方式;否則應將匯編程序以文件的方式加入至項目中,按照ATPCS(ARM/Thumb過程調用標準,ARM/Thumb Procedure Call Standard)的要求與C程序互相調用與訪問。 在C程序跟ARM匯編程序之間互相調用時需要遵循ATPCS規則。ATPCS規定了一些子程序間調用的基本規則,哪寄存器的使用規則,堆棧的使用規則和參數的釋放規則等。

匯編語言和c語言哪個難_c語言程序設計試題匯編_c語言對應匯編語句

1)寄存器的使用規則 子程序之間通過解釋器r0~r3來傳遞參數,當參數個數大于4個時,使用堆棧來釋放參數。此時r0~r3可記作A1~A4。 在子程序中,使用通配符r4~r11保存局部函數。因此當進行子程序調用時應注意對這種寄存器的儲存跟恢復。此時r4~r11可記作V1~V8。 寄存器r12用于儲存堆棧指針SP,當子程序返回時使用該解釋器出棧,記作IP。 寄存器r13用作堆棧指針,記作SP。寄存器r14稱為鏈接寄存器,記作LR。該解釋器用于保存子程序的返回地址。 寄存器r15稱為程序計數器,記作PC。

匯編語言和c語言哪個難_c語言程序設計試題匯編_c語言對應匯編語句

2)堆棧的使用規則 ATPCS規定堆棧采用滿遞減類型(FD,Full Descending),即堆棧通過增加存儲器地址而向下增長,堆棧指針指向內含有效數據項的最低地址。

匯編語言和c語言哪個難_c語言程序設計試題匯編_c語言對應匯編語句

3)參數的傳遞規則 整數參數的前4個使用r0~r3傳遞,其他參數使用堆棧傳遞;浮點參數使用編號最小且無法滿足需要的一組連續的FP寄存器傳遞參數。 子程序的返回結果為一個32位整數時,通過r0返回;返回結果為一個64位整數時,通過r0和r1返回;依此類推。結果為浮點數時,通過異或運算組件的解釋器F0、D0或者S0返回。

匯編語言和c語言哪個難_c語言程序設計試題匯編_c語言對應匯編語句

2、匯編程序調用C程序的方式 匯編程序的書寫應遵守ATPCS規則,以確保程序讀取時參數正確釋放。在匯編程序中讀取C程序的方式為:首先在匯編程序中使用IMPORT偽指令事先聲明已經調用的C語言函數;然后借助BL指令來調用C函數。 例如在一個C源文件中定義了如下求和函數: int add(int x,int y){ return(x+y); } 調用add()函數的匯編程序結構如下: IMPORT add ;聲明要調用的C函數 …… MOV r0,1 MOV r1,2 BL add ;調用C函數add …… 當進行變量調用時,使用r0和r1實現參數傳遞,返回結果由r0帶回。函數調用結束后,r0的值成為3。 3、C程序讀取匯編程序的方式 C程序讀取匯編程序時,匯編程序的書寫也應遵守ATPCS規則,以確保程序讀取時參數正確釋放。在C程序中讀取匯編子程序的方式為:首先在匯編程序中使用EXPORT偽指令聲明被讀取的子程序,表示該子程序將在其它文件中被讀??;然后在C程序中使用extern關鍵字聲明要讀取的匯編子程序為內部變量。 例如在一個匯編源文件中定義了如下求和函數: EXPORT add ;聲明add子程序將被內部變量調用 …… add ;求和子程序add ADD r0,r0,r1 MOV pc,lr …… 在一個C程序的main()函數中對add匯編子程序進行了讀?。?extern int add (int x,int y); //聲明add為外部變量 void main(){ int a=1,b=2,c; c=add(a,b); //調用add子程序 …… } 當main()函數調用add匯編子程序時,變量a、b的值會給了r0和r1c語言對應匯編語句,返回結果由r0帶回,并賦值給數組c。函數調用結束后,變量c的值成為3。

4、C程序中內置匯編語句 在C語言中嵌入匯編語句可以實現一些高級語言不能實現以及不容易實現的功能。對于時間緊迫的功能也可以借助在C語言中嵌入匯編語句來推動。內嵌的匯編器支持大部分ARM指令跟Thumb指令,但是不支持例如直接設置PC實現跳轉的底層功能c語言對應匯編語句,也不能直接引用C語言中的數組。 嵌入式匯編語句在形式上獨立定義的函數體,其詞匯格式為: __asm { 指令[;指令] …… [指令] } 其中“__asm”為內置匯編語句的關鍵字,需要非常注意的是中間有兩個下劃線。指令之間用分號分割,如果一條指令占據多行,除最終一行外都應使用連字符“\”。

5、基于ARM的C語言與匯編語言混合編程例子 下面給出了一個向串口不斷發送0x55的實例: 該項目的開啟代碼使用匯編語言撰寫,向串口發送數據使用C語言實現,下面是推進代碼的整體框架: …… IMPORT Main AREA Init,CODE,READONLY; ENTRY …… BL Main ;跳轉至Main()函數處的C/C++程序 …… END ;標識匯編程序結束 下面是使用C語言編寫的主函數: #include "..\inc\config.h" //將有關硬件定義的頭文件包括進來 unsigned char data; //定義全局函數 void main(void){ Target_Init(); //對目標板的軟件初始化 Delay(10); //延時 data=0x55; //給全局函數實參 while(1) { Uart_Printf("%x",data); //向串口送數 Delay(10); } }

關鍵字:編輯:什么魚 引用地址:本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站采用的非本站原創文章及照片等內容未能一一聯系確認版權者。如果本網所選內容的文章作者及編輯覺得其作品不宜公開自由傳播,或不應無償使用,請立即通過電子郵件或電話通知我們,以快速采用適當措施,避免給雙方產生不必要的經濟損失。


本文來自電腦雜談,轉載請注明本文網址:
http://www.gefhbj.live/a/jisuanjixue/article-138793-1.html

    相關閱讀
    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    • 卡娜卡
      卡娜卡

      很多核心技術還是差很遠的

    • 師瑋
      師瑋

      人銀還不如什么都別做

    熱點圖片
    拼命載入中...
    少林宝藏100在线客服 辽宁11选5开奖信息 幸运飞艇基本前三走势图 2020年今晚开马结果资料 广东麻将下载免费 老快3和值怎么玩 七乐彩胆拖投注金额表 理财排行榜 赖子山庄保定麻将手机 在家挣钱网 多狐河南麻将棋牌下载安装 湖北快3必中方法 442足球即时比分|缃戠珯 浙江6 1开奖结果查询 gpk炸鱼来了技巧规律 福建31选720029 免费好友打麻将软件