一、簡介
C語言調用匯編有兩種方式:1、通過內嵌匯編 2、通過編譯鏈接。
二、基礎知識
對於C和匯編語言的接口主要有兩個問題需要解決
1、調用者與被調用者的參數傳遞
正常的,定義一個函數總是希望它完成某些功能,一個毫無用處的函數將毫無意義。這些功能有常常是更大的功能的一部分,而函數完成這些功能或多或少都要與外界聯系(一個完全不與外界聯系的函數也是一個毫無意義的函數)(延時函數也要消耗時間,時間也屬於外界的一種資源),比如要傳遞一些數據給其處理,處理過後返回處理的結果。這種數據的傳遞可以形象的通過兩種方式來實現,第一種是外界直接把數據給函數,第二種是函數自己去外界取數據。
對於第一種:
這種數據傳遞通過堆棧完成,是一種隱性方式,隱含操作是:在執行調用時從調用程序參數表中的最後一個參數開始 ,自動依次壓入堆棧;將所有參數壓入堆棧後,再自動將被調用程序執行結束後的返回地址 (斷點)壓入堆棧,以使被調程序結束後能返回主調程序的正確位置而繼續執行。
對於第二種:
對於第二種模型,必須開辟一個公共的區域,調用者及被調用者都必須能訪問此區域。
2、說明和建立調用者與被調用者間的聯系
為了建立調用與被調用模塊間的連接關系,被調用的匯編程序應用global,說明其可被外部模塊調用;而調用程序則應預先說明要引用的外部模塊名。
參考:
http://blog.chinaunix.net/uid-20797642-id-2495231.html http://www.cnblogs.com/shenlian/archive/2011/05/17/2049441.html
三、實例
1、32位:Linux匯編與C互相調用
http://www.linuxidc.com/Linux/2012-07/65757.htm
四、常見問題
1、如下
Linux AT&T匯編錯誤:Error: invalid instruction suffix for `push'
解決方法:
http://www.2cto.com/os/201310/253276.html