C語言與彙編語言混合編程應遵守的規則

2021-01-08 電子產品世界

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

1)寄存器的使用規則 子程序之間通過寄存器r0~r3來傳遞參數,當參數個數多於4個時,使用堆棧來傳遞參數。此時r0~r3可記作A1~A4。 在子程序中,使用寄存器r4~r11保存局部變量。因此當進行子程序調用時要注意對這些寄存器的保存和恢復。此時r4~r11可記作V1~V8。 寄存器r12用於保存堆棧指針SP,當子程序返回時使用該寄存器出棧,記作IP。 寄存器r13用作堆棧指針,記作SP。寄存器r14稱為連結寄存器,記作LR。該寄存器用於保存子程序的返回地址。 寄存器r15稱為程序計數器,記作PC。

本文引用地址:http://www.eepw.com.cn/article/201611/317687.htm

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

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

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和r1,返回結果由r0帶回,並賦值給變量c。函數調用結束後,變量c的值變成3。

4、C程序中內嵌彙編語句 在C語言中內嵌彙編語句可以實現一些高級語言不能實現或者不容易實現的功能。對於時間緊迫的功能也可以通過在C語言中內嵌彙編語句來實現。內嵌的彙編器支持大部分ARM指令和Thumb指令,但是不支持諸如直接修改PC實現跳轉的底層功能,也不能直接引用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); } }


相關焦點

  • 單片機程序C語言與彙編語言混合編程
    與彙編語言混合編程本文引用地址:http://www.eepw.com.cn/article/201611/322505.htm1.C語言函數和彙編語言函數相互調用在這個示例中C語言函數main()調用彙編語言函數get_rand()以得到一個隨機數;彙編語言函數get_rand()首先調用C語言的標準庫函數rand()得到一個整型隨機值,然後用調用C語言函數mult()的方法把這個隨機值乘以main()函數傳遞給自己的實參,並把乘積值返回給
  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    另外在一些對性能非常敏感的代碼塊,基於彙編與機器碼一一對應的關係,這時不能依靠C編譯器的生成代碼,而要手工編寫彙編,從而達到優化的目的。彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。這裡主要討論C和彙編的混合編程,包括相互之間的函數調用。下面分四種情況來進行討論,不涉及C++語言。
  • ARM中C和彙編混合編程及示例ARM中C和彙編混合編程及示
    本文引用地址:http://www.eepw.com.cn/article/201611/317675.htm單純的C或者彙編編程請參考相關的書籍或者手冊,這裡主要討論C和彙編的混合編程,包括相互之間的函數調用。下面分四種情況來進行討論,暫不涉及C++。
  • 單片機編程用C語言還是彙編?
    單片機是一種可編程器件,單片機的出現使硬體設計變得更為簡單,產品的功能也更強大,而程序就是單片機的靈魂。目前功能稍微複雜一點的電子產品,都是以單片機為核心,再加以不通的外設電路實現不通的功能需求。單片機的編程可以通過彙編語言和C語言來實現。
  • C語言和彙編語言是什麼?他們之間可以有怎樣的合作?為你解析
    什麼是彙編語言:彙編語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。許多彙編程序為程序開發、彙編控制、輔助調試提供了額外的支持機制。有的彙編語言編程工具經常會提供宏,它們也被稱為宏彙編器。彙編語言不像其他大多數的程序設計語言一樣被廣泛用於程序設計。在今天的實際應用中,它通常被應用在底層,硬體操作和高要求的程序優化的場合。
  • 自學編程第1節:程式語言有哪些,什麼關係?彙編C/C++,JAVA簡介
    首先,謝謝大家點擊閱讀獵奇哥的編程系列教程,後期慢慢補充,詳細介紹C語言,C++語言編程的方方面面,儘量幫助大家能夠儘量簡單的學會C++編程核心入門知識。總章節數待定,視內容的更新情況。說起編程,最早的是彙編語言,這種語言大家通常叫做低級語言,做一個程序,需要非常多的指令和代碼,完成的卻是一個非常簡單的功能,程式設計師的工作量非常大,當然,那個時期,電腦的功能也沒有現在的這麼強大,彙編對於當時來說,也是夠用。
  • 編程是什麼——彙編語言的出現
    但由於機器語言具有特定性,完美適配特定型號的計算機,所以運行效率遠遠高過其他語言。第二代程式語言:彙編語言彙編語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。
  • DSP編程技巧之24---C/C++與彙編語言的交互之-(2)從C/C++代碼調用...
    在C/C++與彙編語言混合編程的情況下,一般我們都會選擇C/C++來實現所期待的大部分功能,對於少數和硬體關聯度高(例如操作某些CPU寄存器)以及對運算的實時性要求高(例如高速、多點的FFT)的功能才使用彙編來實現,這就使得大多數情況下,C/C++與彙編的交互都是從C/C++代碼調用彙編代碼中的函數與變量,所以在此我們就來看一下這種調用的規則。
  • 程式語言那些事
    提起編程,一定離不開程式語言,有些軟體既可以用A語言來編寫,也可以用B語言來編寫,為什麼會有這麼多程式語言,面對這麼多程式語言該如何選擇。特定的彙編語言和特定的機器語言指令集是一一對應的,不同平臺之間不可直接移植。C語言c語言被稱作高級語言,相比於彙編語言,它有著豐富的靈活性和可編程性,作業系統底層大部分就是使用c語言編寫的,因為它更接近底層,因此它有著非常優秀的效率。c語言經常被稱作高級語言鼻祖,因為很多其它語言都是由c語言編寫的。
  • python語言基礎-6:程式語言是萬能的麼?
    正在學習編程的朋友,會不會有這樣的疑惑:程式語言,是萬能的麼?由於計算機不是萬能的,所以在計算機上運行的程式語言肯定也不是萬能的。如果一個語言能夠進行任何可能的計算,它就能發揮計算機的全部潛力。我們包括python在內的大多數程式語言,都可以做到這一點,因為它們都是圖靈完備語言。所謂圖靈完備,是指這種語言都可以模擬圖靈機的工作。而圖靈機已經被數學家們證實可以進行任何一種可能的有限步數的計算。
  • 【愛找茬】都是C語言,單片機C語言和普通的C語言究竟有什麼差異呢?
    C語言是一門面向過程的計算機程式語言,與C++,Java等面向對象的程式語言有所不同。 其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
  • 世界上第一個C語言編譯器是怎麼編寫的?它為什麼能夠用C語言編寫?
    所謂C語言編譯器,就是把編程得到的文件,比如.c,.h的文件,進行讀取,並對內容進行分析,按照C語言的規則,將其轉換成cpu可以執行的二進位文件。 在C語言被用作系統程式語言之前,Tomphson已經使用B語言編寫過作業系統。可見在C語言實現以前,B語言已經可以投使用了。 因此第一個C語言編譯器的原型完全可能是用B語言或者混合B語言與PDP彙編語言編寫的。
  • 7月程式語言排行 彙編語言再進前10
    TIOBE更新了2016年7月的程式語言排行,本月的最大亮點就是面向底層的彙編語言再次衝進排行榜前10。相對於其它高級語言來講,彙編語言能取得如此成績唯一合理的解釋就是日益增長的眾多小型設備,因其只能運行彙編語言。
  • 計算機彙編語言
    彙編語言雖然用機器語言編寫程序有很高的要求和許多不便,但編寫出來的程序執 行效率高,CPU嚴格按照程式設計師的要求去做,沒有多餘的額外操作。所以, 在保留「程序執行效率高」的前提下,人們就開始著手研究一種能大大改善 程序可讀性的編程方法。 為了改善機器指令的可讀性,選用了一些能反映機器指令功能的單詞或詞 組來代表該機器指令,而不再關心機器指令的具體二進位編碼。
  • 機器人世界,彙編、C和Python,先學哪一種程式語言合適
    適應機器人時代,又適合我們一些初學者的程式語言,可用Python,但未必就是Python。所以這裡我們舉出三種語言:彙編語言、C語言和Python語言,當然現實中不止這三種,之所以拿這三種語言來解釋,是因為它們比較有代表性。關於彙編語言等程式語言的學習,這也是一人客回復別人問題的回答。
  • PIC單片機asm與C混合編程
    另外,PICC 的彙編編譯器要求輸入原程序文件的擴展名是「*.as」,而MPASM 預設認定的原程序以「*.asm」為擴展名。在基於PICC 編譯環境下開發PIC 單片機的C 語言應用程式時基本無需關心其彙編編譯器,除非是在混合語言編程時用彙編語言編寫完整的彙編原程序模塊文件。
  • ARM裸機開發bootloader彙編語言
    一、彙編語言概述1、為什麼要使用彙編本文引用地址:http://www.eepw.com.cn/article/201611/318213.htm一般情況下我們不會用到彙編,但有兩種情況下,我們要用到彙編。1、啟動代碼。
  • C語言編程習慣心得
    從編程菜鳥一路走來,慢慢對編程習慣有了一個新的認識。因為曾經我寫的代碼的可讀性令自己也感到哭啼皆非,搞得自己暈頭轉向。今天特意來分享一下自己的一些關於編程習慣的心得。很多人以為代碼一敲完,能得到預期的結果,就萬事ok,其實不然。後面的程序調試、維護和升級是一個項目中很重要的一部分,這就要求我們必須規範編程習慣。
  • 編程是什麼——高級程式語言FORTRAN的問世
    而程式語言經歷了機器語言到彙編語言的更新之後,人們發現了限制程序推廣的關鍵因素——程序的可移植性。需要設計一個能夠不依賴於計算機硬體,能夠在不同機器上運行的程序。雖然,高級程式語言編寫的程序需要一些時間去翻譯代碼,從而降低了計算機的執行效率,但是實踐證明,高級程式語言為工程師帶來的便利遠遠大於降低的執行效率舉個例子,同樣我們需要計算一個數,1+2等於幾?使用高級程式語言,就是這樣寫的:第一步:c=1+2第二步:顯示c的值。
  • 2017年,增長最多的程式語言是C語言!
    【IT168 資訊】面對競爭,程式語言的戰場可不分成年組和少年組。又到了TIOBE揭曉年度程式語言的時候,今年又會是誰問鼎冠軍呢?  TIOBE的評選規則很簡單:看分差!說白了就是2018年1月的得分減去2017年1月的得分產生的分差,按照分差對程式語言進行排行,增長最多的程式語言即為TIOBE年度程式語言。由於TIOBE指數的變化規則,年度程式語言同樣意味著是過去一年在社區或者搜尋引擎中被搜索最多的、需求最旺盛的程式語言。  結局:一雪前恥,C語言默默前行問鼎冠軍!