關於c與彙編混合編程的一點總結

來源:互聯網
上載者:User

在C和彙編混合編程的時候,存在C語言和組合語言的變數以及函數的介面問題。在C程式中定義的變數,編譯為.asm檔案後,都被放進了.bss區,而且變數名的前面都帶了一個底線。在C程式中定義的函數,編譯後在函數名前也帶了一個底線。例如:

extern int num就會變成 .bss _num, 1
extern float nums[5]就會變成.bss _nums, 5
extern void func ( )就會變成 _func,

一 彙編和C的相互調用可以分以下幾種情況:

(1) 組譯工具中訪問c程式中的變數和函數。
在組譯工具中,用_XX就可以訪問C中的變數XX了。訪問數組時,可以用_XX+位移量來訪問,如_XX+3訪問了數組中的XX[3]。

    在組譯工具調用C函數時,如果沒有參數傳遞,直接用_funcname 就可以了。如果有參數傳遞, 則函數中最左邊的一個參數由寄存器A給出,其他的參數按順序由堆棧給出。傳回值是返回到A寄存器或者由A寄存器給出的地址。同時注意,為了能夠讓組合語言能訪問到C語言中定義的變數和函數,他們必須聲明為外部變數,即加extern 首碼。

(2) c程式中訪問組譯工具中的變數

    如果需要在c程式中訪問組譯工具中的變數,則組譯工具中的變數名必須以底線為首字元,並用global使之成為全域變數。

    如果需要在c程式中調用組譯工具中的過程,則過程名必須以底線為首字元,並且,要根據c程式編譯時間使用的模式是stack-based model還是register argument model來正確地編寫該過程,使之能正確地取得調用參數。

(3) 線上彙編

    在C程式中直接插入 asm(“ *** ”),內嵌彙編語句,需要注意的是這種用法要慎用,線上彙編提供了能直接讀寫硬體的能力,如讀寫中斷控制允許寄存器等,但編譯器並不檢查和分析線上組合語言,插入線上組合語言改變彙編環境或可能改變C變數的值可能導致嚴重的錯誤。

二 彙編和C介面中定址方式的改變:

    需要注意的是,在C語言中,對於局部變數的建立和訪問,是通過堆棧實現的,它的定址是通過堆棧寄存器SP實現的。而在組合語言中,為了使程式碼變得更為精簡,TI在直接定址方式中,地址的低7位直接包含在指令中,這低7位所能定址的具體位置可由DP寄存器或SP寄存器決定。具體實現可通過設定ST1寄存器的CPL位實現,CPL=0,DP定址,CPL=1,SP定址。在DP定址的時候,由DP提供高9位地址,與低7位組成16位地址;在SP定址的時候,16位地址是由SP(16位)與低7位直接相加得來。

    由於在C語言的環境下,局部變數的定址必須通過SP寄存器實現,在混合編程的時候,為了使組合語言不影響堆棧寄存器SP,通常的方式是在彙編環境中使用DP方式定址,這樣可以使二者互不干擾。編程中只要注意對CPL位正確設定即可。

不會的東西太多,好好學習學習。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.