2016-03-27 43 views
0

我有一個.asm模塊,我想在.c模塊中使用它的過程。 因爲我是用我的MASM代碼會看起來像:將變量傳遞給nasm過程

SECTION .text 

func PROC arg1: DWORD, arg2:DWORD 
... 
ret 
ENDPROC 

,並以.c模塊:

extern "C"{ 
    void func (int arg1, int arg2); 
} 

現在我使用Ubuntu,並決定嘗試NASM。 所以我有以下問題:如何將參數傳遞給nasm中的過程,因爲它只是一個標籤?我如何在我的NASM代碼中使用.c模塊中的extern「C」下描述的變量?

我也聽說,關於將參數傳遞給使用堆棧的過程有一個約定。我可以在這裏以某種方式使用嗎?請給我一些例子嗎?

+0

這一切都取決於。你是否想在Ubuntu上編寫64位代碼或32位代碼?調用約定根據您要生成的代碼而有所不同。有了_NASM_,您必須瞭解調用約定,因爲_MASM_通過PROC語句隱藏了大部分細節。 –

+0

我打算在x86和x86-64上寫一個描述GCC函數調用ABI的答案,但後來我在標籤爲'C'的後面看到了'extern「C」{...}'。育。在我看來,那些以這種錯誤觀念開始的人太過任性。 –

回答

0

有幾件事情要指出:

通過寄存器
  • 你的彙編過程傳遞參數, 堆棧或兩者的組合。檢查你的平臺ABI。
  • 你想從C調用的彙編程序函數通常有一個下劃線前綴_。你可以爲你做這個是要揭露所有的功能:

section .text global _func

_func: 
    ; Do stuff 
    ret 

,或者通過NASM編譯參數(這將做到這一點對所有的功能)--prefix _

  • 最後,如果從C++程序調用,則只需要extern "C"

玩得開心!