4

C 関数によって呼び出され、C 関数から引数を取るアセンブリ ルーチンがいくつかあります。現時点では、これらの引数が cdecl の順序でスタックに渡されると想定しています。それは公正な仮定ですか?

コンパイラ (GCC) はこれを検出し、引数が正しく渡されていることを確認しますか、それとも手動で cdecl を宣言する必要がありますか? その場合、より高い最適化レベルを指定しても、その属性は保持されますか?

4

3 に答える 3

2

呼び出し規約は、引数の順序付けだけではありません。Agner Fog によって書かれた、すべての詳細を説明する優れた pdf があります: Calling Conventions for different C++ compilers and operating systems

于 2012-02-18T22:38:51.567 に答える
1

これは、コードを書いているプラ​​ットフォームの ABI の問題です。ほぼすべてのプラットフォームは、Unix System V ABI for C 呼び出し規則およびその他の ABI の問題に従います。これには、すべての CPU アーキテクチャに共通の ABI 特性を詳述する一般的な ABI (gABI) ドキュメントと、プロセッサ固有の ABI (psABI) ドキュメントの両方が含まれます。特定の CPU アーキテクチャ/ファミリ。x86に関しては、これは「cdecl」と呼ばれるものと一致します。したがって、実用的な観点から、C から呼び出されることを意図した x86 アセンブリは、"cdecl" を想定して記述する必要があります。基本的に、この呼び出し規約の普遍性に対する唯一の例外は、従来の Win16 dll サンクの互換性の問題により、独自の非標準の "stdcall" 呼び出し規約を使用する Windows API 関数です。それでも、「デフォルト」

C から呼び出される asm を作成する際のより重要な問題は、シンボル名の前にアンダースコアを付ける必要があるかどうかです。これはプラットフォームによって大きく異なります。一般的な傾向として、ELF ベースのプラットフォームではプレフィックスを使用せず、他のほとんどのプラットフォームでは使用しています...

于 2012-02-19T02:29:18.613 に答える
0

これを行う手っ取り早い方法は、実装する asm 関数に一致するダミーの C 関数を作成し、渡されたパラメーターを使用してダミーの C 関数でいくつかのことを行い、それらを区別できるようにし、コンパイルしてから逆アセンブルすることです。誰にでもできるわけではありませんが、頻繁に機能します。

于 2012-02-18T23:56:46.117 に答える