2014-10-18 12 views
1

我知道你可以使用ASM直接把AS​​M放在C中,但我想知道是否有可能在Assembly中編譯一個庫,編譯它,然後訪問你在C庫中聲明的函數?讓ASM中的庫在C中訪問它?

所以我知道我應該使用預先編寫的庫,但這只是爲了教育目的和樂趣!因此,舉例來說,我想用sys調用打印出屏幕,現在我寫了一些程序集來做到這一點,並命名了函數print,然後將它編譯成某種類型的lib文件.so/.lib/.a那麼我會在那個庫中引用那個函數呢?

我只寫出函數並在編譯時將其鏈接起來嗎?

謝謝:)

+1

「我會在這一點上做指在庫函數? 「 - 你聲明它,這樣編譯器就可以知道它的類型,調用約定等,然後將C源代碼生成的目標代碼和手寫程序集生成的目標代碼鏈接在一起。 – 2014-10-18 21:04:34

回答

0

是的,你只寫了功能並編譯/它組裝成的.o。然後,您可以使用.o就像編譯器中的.o一樣。如果你想把它變成一個庫,只需使用它作爲輸入arranlib

使用在x86 GCC

最簡單的例子:

將這個成test.s:

.globl some_func 
some_func: 
    ret 

編譯: 立方厘米-c test.s

這將產生一個test.o具有函數some_func定義的文件。

的更完整的例子無能爲力C函數不帶任何參數(GCC的x86-64):

.globl foo 
.type foo, @function 
foo: 
    pushq %rbp 
    movq %rsp, %rbp 
    leave 
    ret 
+0

絕對要確保你尊重C調用約定。取決於平臺,一些寄存器可能是_callee_-save! – 2014-10-23 02:53:35

+0

完整的示例確實遵守gcc調用約定,因爲它不寫入任何x86 GPR。證明 - 代碼是由gcc生成的。我剛剛刪除了一些標籤。 – 2014-10-23 04:42:41

+0

我並不是說它不是!我只是指出,雖然這個例子是正確的,但它可能並不在PowerPC上。 OP沒有指出他正在使用哪個編譯器,也沒有指出他所針對的平臺。 – 2014-10-23 04:56:28