2016-03-27 9 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を記述する答えを書こうとしていましたが、その後、POSTタグの 'C'で' extern "C" {...} 'を見ました。 Yuk。そのような誤解から始まる人々は、私の意見ではあまりにも道を逸しています。 –

答えて

0

指摘すべき点がいくつかあります:

  • あなたのアセンブラ手順は、レジスタ、 スタックまたはその両方の組み合わせによって引数が渡されます。プラットフォームABIを確認してください。
  • Cから呼び出すアセンブラ関数のアンダースコアは、通常、プレフィックス_です。あなたが公開しようとしているすべての機能のためにこれを行うことができ、次のいずれか
    _func: 
        ; Do stuff 
        ret 
    

    または(すべての機能のためにそれを行います)のnasmのコンパイル引数--prefix _

    • 経由

    section .text global _func

    最後に、C++プログラムからの呼び出しの場合は、extern "C"が必要です。

楽しくお楽しみください!

関連する問題