2012-03-25 5 views
1

私はNASMでWindowsでいくつかのx86プログラミングを行ってきましたが、私は混乱しました。私はこれを行う必要があります理由として混乱しています:NASMでDLLを使用

extern [email protected] 

具体的に私は「_」と「@ 4」について混乱しています。私は '@ 4'がスタックのサイズだが、なぜそれが必要なのか知っていますか?私が16進エディタでkernel32.dllを見たとき、私は 'ExitProcess'が '_ExitProcess @ 4'ではないことがわかりました。

私はCの関数は、アンダースコアとこのようなスタックサイズ必要としない理由としても混乱しています:C関数は装飾を必要としないのはなぜ

extern printf 

を?

私の3番目の質問は、「これは私がこれらの機能を使用する方法ですか?」です。今、私は実際のdllファイル自体にリンクしています。

答えて

1

「@ 4」はスタックのサイズですが、なぜそれが必要なのですか? (これはあなたがCのヘッダファイルをインクルードするのを忘れた場合に発生し、すべてのコンパイラの警告を無視するか、宣言がdoesnの場合はすることができますあなたのコンパイラは、関数の間違った呼び出し規約を想定した場合、致命的なエラーを報告し、リンカを有効にするには

共有ライブラリ内の関数と正確に一致しません)。

なぜ機能には装飾が必要ですか?

cdecl呼び出し規約を使用する関数は、(それが実際に_printfだろう)をリードシングルで飾られています。

パラメータサイズが装飾された名前にエンコードされるのは、呼び出し元がスタックの設定と破棄の両方を担当するため、引数の数が一致してもスタックの設定が致命的になることはありませんもちろん正しい引数が与えられていなければクラッシュする可能性があります)。 printfのように、引数の数が可変である可能性もあります。

16進エディタでkernel32.dllを調べたところ、ExitProcess[email protected]ではありませんでした。

マングルされた名前は、通常、あなたのリンカの呼び出しに使用することができます*.libインポートライブラリファイルにコンパイルさの定義ファイルを使用してDLLの実際のエクスポート名(*.def)にマッピングされています。このようなkernel32.dllの定義ファイルの例は、this oneです。次の行はExitProcessのマッピングを定義します。

[email protected] = ExitProcess 

は、これは私がこれらの機能を使用しなければならない道ですか?

NASMはよくわかりませんが、これまで見たコードでは、通常、あなたの例のように装飾された名前を指定しています。

詳細はon this excellent page about Win32 calling conventionsです。

+0

'extern _printf'のように 'printf'の前にアンダースコアを入れようとしましたが、コンパイルしませんでした。理由は何ですか?私はprintfへのすべての呼び出しを 'call _printf'に変更しました。 –

+0

@Hudson: 'extern printf/call printf'と動作しますか?私は驚いています、これは私のNASMのインストールでは当てはまりません。あなたのNASMは実際に呼び出し規約を知っているのでしょうか? '-fwin32'フラグを使いましたか? –

+0

はい、それは私が考えていることです。答えを見つけるためにNASMの文書を見に行きます。 –

関連する問題