問題タブ [calling-convention]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
11231 参照

delphi - セーフコールとは?

私は VB6 を使用して ActiveX EXE の作成に取り組んでおり、得られた唯一の例はすべて Delphi で書かれています。

サンプル コードを読んで、署名の後にsafecallキーワードが続く関数がいくつかあることに気付きました。次に例を示します。

このキーワードの目的は何ですか?

0 投票する
19 に答える
70673 参照

c++ - 奇妙なMSC8.0エラー:「ESPの値が関数呼び出し全体で適切に保存されませんでした...」

最近、一部のVisual Studioプロジェクトをライブラリに分割しようとしましたが、ライブラリプロジェクトの1つを依存関係として持つテストプロジェクトでは、すべてが正常にコンパイルおよびビルドされたようです。ただし、アプリケーションを実行しようとすると、次の厄介な実行時エラーメッセージが表示されました。

実行時チェックの失敗#0-ESPの値は、関数呼び出し全体で適切に保存されませんでした。これは通常、異なる呼び出し規約で宣言された関数ポインターを呼び出した結果です。

関数の呼び出し規約(__cdeclなど)を指定したことはなく、すべてのコンパイラスイッチをデフォルトのままにします。私がチェックしたところ、プロジェクト設定は、ライブラリとテストプロジェクト全体で規約を呼び出すために一貫しています。

更新:開発者の1人が、「BasicRuntimeChecks」プロジェクト設定を「Both(/ RTC1、equiv。to / RTCsu)」から「Default」に変更し、ランタイムが消えて、プログラムが明らかに正しく実行されたままになりました。私はこれをまったく信用していません。これは適切な解決策でしたか、それとも危険なハックでしたか?

0 投票する
1 に答える
1426 参照

com - x64でのCOM呼び出し規約

私は、COMがx64マシンでどのように動作するかに関して決定的な答えを得ようとしています。Windowsは、x64マシン上のCOMインターフェイスに呼び出しをディスパッチするときに通常のx64呼び出し規約を使用しますか(COM実装が64ビットであると想定)?具体的には、実行時に動的にロードされるアセンブリのチャンクを指すように、vtblエントリを動的に生成します。このアセンブリは、呼び出し元のユーザーからパラメータを正しく取得する方法を知っている必要があります。したがって、COMが標準のx64呼び出し規約(ほとんど高速呼び出し)を使用してアセンブリへの呼び出しを設定するかどうかを知りたいです。

0 投票する
5 に答える
81469 参照

c - ARM C 呼び出し規約で保存するレジスタは?

最後にアームアセンブラをコーディングしてからしばらく経ちましたが、詳細については少しさびています。arm から C 関数を呼び出すと、r0-r3 と lr を保存することだけを気にする必要がありますよね?

C関数が他のレジスタを使用する場合、それらをスタックに保存して復元する責任がありますか? つまり、コンパイラは、C 関数に対してこれを行うコードを生成します。

たとえば、アセンブラ関数で r10 を使用する場合、その値をスタックまたはメモリにプッシュし、C 呼び出しの後にポップ/復元する必要はありませんか?

これは arm-eabi-gcc 4.3.0 用です。

0 投票する
8 に答える
122045 参照

c - __stdcallとは何ですか?

私はWin32プログラミングについて学んでおり、WinMainプロトタイプは次のようになります。

WINAPI私はこの識別子が何のためにあるのか混乱し、見つけました:

これは何をしますか?これがリターンタイプの後に何かを持っていることに私は混乱しています。何__stdcallのために?戻り型と関数名の間に何かがあるとはどういう意味ですか?

0 投票する
3 に答える
1598 参照

c# - P/Invoke および C# のカスタム呼び出し規約

P/Invoke を使用するときに独自の呼び出し規約を指定できるようにする必要があるビジネス ケースがあります。具体的には、非標準の ABI を使用する従来の dll があり、関数ごとに呼び出し規約を指定できるようにする必要があります。

たとえば、この dll の 1 つの関数は、最初の 2 つの引数を EAX と EBX 経由で受け取り、残りはスタック経由で受け取ります。別の関数は、ECX を介して 1 つの引数を受け取り、残りはスタックに置きます。これらの関数は数百ありますが、これらの関数にアクセスするために独自の中間ブリッジ DLL を作成することは避けたいと考えています。

私のもう 1 つのオプションは、独自のカスタム P/Invoke を手動でロールすることですが、これは明らかな理由から望ましくありません。

どんな助けでも大歓迎です、ありがとう、

0 投票する
2 に答える
1016 参照

calling-convention - 名前付きパラメーターのさまざまなセットで__arglistを使用する

私のアプリケーションでは、2つのレイヤーがあります。最初のレイヤーは、さまざまなパラメーターリストに「...」構文を使用するcdecl関数を公開するCレガシーです。.Netレイヤー(2番目のレイヤー)からこれらの関数を呼び出す唯一の方法は、DllImportテクニックを使用することです。たとえば、以下のC関数:

C#では次のようになります。

私の問題は、2つの追加パラメーターを使用してこの関数を呼び出したい場合がありますが、そのうちの1つがNULLの場合、引数リストに含まれません(私のレガシーコードはNULL値で失敗します)。たとえば、私はこの呼び出しが必要です:

Cによって次のように解釈されます

残念ながら、そのようなことをしています:

Cによって次のように解釈されます。

ではなく:

誰かが何か考えを持っていますか?

0 投票する
9 に答える
370 参照

.net - inout パラメータの適切な使用法はありますか?

.NET の inout (C# の ref、vb.net の byref (out パラメータのような)) パラメータの適切な使用法はありますか?
入力と戻り値の両方に使用されるパラメーターによる混乱は、out パラメーターのパラメーターの数の増加、または配列を返すか、カスタム クラスを返すことよりも悪いと感じています。

0 投票する
10 に答える
7397 参照

macos - Mac ABI が x86-32 に対して 16 バイトのスタック アラインメントを必要とするのはなぜですか?

古い PPC RISC システムや x86-64 の場合でも、この要件は理解できますが、実証済みの古い x86 の場合は? この場合、スタックは 4 バイト境界のみで整列する必要があります。はい、一部の MMX/SSE 命令では 16 バイトのアラインメントが必要ですが、それが呼び出し先の要件である場合は、アラインメントが正しいことを確認する必要があります。この追加の要件をすべての発信者に負担させるのはなぜですか? すべての呼び出しサイトがこの要件を管理する必要があるため、実際にはパフォーマンスが低下する可能性があります。何か不足していますか?

更新:これについてさらに調査し、社内の同僚と相談した結果、私はこれについていくつかの仮説を立てました。

  1. OS の PPC、x86、および x64 バージョン間の一貫性
  2. GCC codegen は、単純に「プッシュ」命令を実行するのではなく、sub esp,xxx を一貫して実行し、データをスタックに「移動」するようになりました。これは、一部のハードウェアでは実際に高速になる可能性があります。
  3. これは呼び出しサイトを少し複雑にしますが、呼び出し元がスタックをクリーンアップするデフォルトの "cdecl" 規則を使用する場合、余分なオーバーヘッドはほとんどありません。

最後の項目で私が抱えている問題は、呼び出し先がスタックをクリーニングすることに依存する呼び出し規則の場合、上記の要件がコード生成を実際に「醜く」することです。たとえば、一部のコンパイラが内部使用 (つまり、他の言語やソースからの呼び出しを意図していないコード) のために、より高速なレジスタ ベースの呼び出しスタイルを実装することを決定したものは何ですか? このスタックアライメントの問題は、いくつかのパラメーターをレジスターに渡すことによって達成されるパフォーマンスの向上の一部を無効にする可能性があります。

更新:これまでのところ、唯一の本当の答えは一貫性でしたが、私にはそれは少し簡単すぎる答えです。私は x86 アーキテクチャに関して 20 年以上の経験がありますが、パフォーマンスやその他の具体的なものではなく、一貫性が本当に理由である場合、開発者がそれを必要とするのは少しナイーブであることを丁重に提案します。彼らは、30 年近くにわたるツールとサポートを無視しています。特に、ツール ベンダーがツールを自社のプラットフォームにすばやく簡単に適応させることを期待している場合 (おそらくそうではないかもしれません... それApple です...)

このトピックは別の日かそこらにあげて、閉じます...

関連している

0 投票する
7 に答える
79873 参照

c# - メソッド内から呼び出しメソッド名を取得する

オブジェクト内のさまざまな場所から呼び出されるオブジェクト内のメソッドがあります。この人気のあるメソッドを呼び出したメソッドの名前をすばやく簡単に取得する方法はありますか?

疑似コードの例:

から呼び出された場合PopularMethod()の値を確認したい ... から呼び出された場合の" " を確認したいMainMainButtonClickPopularMethod()ButtonClick

を見ていましたSystem.Reflection.MethodBase.GetCurrentMethod()が、呼び出し方法がわかりません。私はStackTraceクラスを見てきましたが、そのメソッドが呼び出されるたびにスタックトレース全体を実行するのは本当に好きではありませんでした.