問題タブ [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 に答える
22354 参照

assembly - リターンアドレスはスタックでどのように指定されますか?

これは、ステートメントの逆アセンブルによって私が見るものですfunction(1,2,3);:

ret アドレスがまったくスタックにプッシュされていないようですが、どのように機能しますretか?

0 投票する
6 に答える
3018 参照

c++ - __thiscall メソッドを持つクラスを期待する C++ 関数/メソッドに Delphi クラスを渡します。

COM に似た (lite) インターフェイス (抽象 Delphi クラス) を作成した MSVC++ コンパイル済み DLL がいくつかあります。これらのクラスの一部には、オブジェクトへのポインターを必要とするメソッドがあります。これらの C++ メソッドは、__thiscall呼び出し規約 (私は変更できません) で宣言されます。これは、 thisポインターが ECX レジスターで渡されることを除いて、__stdcall と同じです。

Delphi でクラス インスタンスを作成し、それを C++ メソッドに渡します。Delphi でブレークポイントを設定し、Delphi クラスで公開されている __stdcall メソッドにヒットするのを確認できますが、すぐに STATUS_STACK_BUFFER_OVERRUN が発生し、アプリを終了する必要があります。Delphi 側で __thiscall をエミュレート/処理することは可能ですか? C++ システムによってインスタンス化されたオブジェクトを渡すと、すべて問題なく、そのオブジェクトのメソッドが (予想どおり) 呼び出されますが、これは役に立ちません。Delphi オブジェクトを渡す必要があります。

Edit 2010-04-19 18:12これは、より詳細に何が起こるかです: (setLabel) と呼ばれる最初のメソッドは、エラーなしで終了します (ただし、スタブ メソッド)。(init) と呼ばれる 2 番目のメソッドは、 volパラメータを読み込もうとしたときに終了し ます。

C++ 側

デルファイ側

私は stdcall だけを使用して動作することを半分期待していましたが、何かが混乱しています。おそらく、使用されている ECX レジスタと関係があるのでしょうか? 助けていただければ幸いです。

Edit 2010-04-19 17:42 ECX レジスタをエントリ時に保存し、関数が終了したら復元する必要があるのでしょうか? thisポインターは C++ で必要ですか? 私はおそらく、いくつかの激しいGoogle検索に基づいて、現時点でたどり着いています. 関連するものを見つけましたが、この問題の逆を扱っているようです。

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

visual-studio-2010 - __cdecl 呼び出し規約を使用して boost をコンパイルするにはどうすればよいですか?

__cdecl呼び出し規約 (msvc2010) を使用してコンパイルされたプロジェクトがあり、デフォルト設定を使用して同じコンパイラを使用してブーストをコンパイルしました。

プロジェクトはブーストにリンクされていましたが、実行時に次のようなアサート メッセージが表示されました: ファイル: ...\boost\boost\program_options\detail\parsers.hpp 行: 79

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

次の質問があります。

  • Windows (msvc2010) でデフォルトでビルドをブーストする呼び出し規約
  • __cdecl 呼び出し規約でブーストをコンパイルする方法
  • なぜブーストは異なる呼び出し規約を持つコードとのリンクを防ぐことができなかったのですか? ブーストには本当にスマートなライブラリ自動インクルージョン コードがあることを理解しました。

更新 #1

ブーストは適切な呼び出し規約でコンパイルおよびリンクしているように見えますが、実行時に上記の問題が発生します。同じコードを使用してサンプル アプリケーションを実行しましたが、動作しますが、私のアプリケーションでは失敗します。唯一の違いは、プロジェクト構成または includes/stdafx.h によるものです。

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

macos - 従来のMacOSがプログラムに入るとき、68000スタックには何がありますか?

古いクラシックMacアプリケーションのエントリポイントを理解しようとしています。最初のCODEリソースを分解しました(ジャンプテーブルであるCODE#0ではありません)。コードはスタックからいくつかの変数を参照します:0004(A7)の単語、長さが0004(A7)の値である000C(A7)で始まる長い単語の配列、およびその配列を超える最後の長い単語文字列へのポインタのようです。

長い単語の配列は一見文字列のように見えるため、「argv」配列がスタックフレームにインラインである点を除いて、表面的には(int argc、char ** argv)の状況を処理しているように見えます。

プログラムがMacOSによって最初に呼び出されたときに、プログラムがスタック/レジスタに何を期待する必要がありますか?

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

iphone - iPhone/ARM 呼び出し規約

iPhone/ARM では、どの CPU レジスタが保存されるはずの関数ですか?

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

c++ - 名前のない名前空間で定義されたCコールバック関数?

Cバイソンパーサーを使用するC++プロジェクトがあります。Cパーサーは、関数ポインターの構造体を使用して、生成がbisonによって削減されたときに適切なASTノードを作成する関数を呼び出します。

さて、プロジェクトのC ++部分で、私はそれらのポインターを埋めます

今、私がそれらを入れる唯一の理由extern "C"は、Cの呼び出し規約を持たせたいからです。しかし、最適には、私は彼らの名前がまだ壊れていることを望みます。これらはCコードから名前で呼び出されることはないため、名前のマングリングは問題になりません。一部のアクションはのようerrorに呼び出され、C ++コールバック関数は他のモジュールとの名前の衝突を避けるために、次のような醜い名前を持っているため、それらをマングルすることで名前の競合を回避できます。

関数型Cのリンケージを与えるだけで可能かどうか疑問に思いました

何か案は?Standard-C++ソリューションを探しています。

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

visual-c++ - タイプライブラリから関数の呼び出し収束を取得するにはどうすればよいですか?

stdcall、cdecl、winapi、またはその他を使用しているかどうかにかかわらず、タイプライブラリを使用して実行時に呼び出し規約を取得するにはどうすればよいですか?

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

c++ - 呼び出し規約fastcallを使用する実際のユースケースはありますか?

呼び出し規約fastcallを使用する実際のユースケースはありますか?

ありがとう。

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

c - 誰かが__declspec(naked)を説明してもらえますか?

Windows用に作成されたスクリプトエンジンをLinuxに移植することを検討しています。Winampの視覚化プラットフォームAVS用です。現時点でそれが可能かどうかはわかりません。私が知る限り、コードはC関数のアドレスを取得し、コードの実行中に参照できるテーブル内にそれらを格納していますnseel_asm_atannseel_asm_atan_end

MSのドキュメントを見てきましたが、実際に何が行われているのかわかり__declspec(naked)ません。ドキュメントに記載されているプロローグおよびエピローグコードとは何ですか?これはWindowsの呼び出し規約に関連していますか?これは持ち運び可能ですか?同様の手法を使用したLinuxベースの例を知っていますか?

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

assembly - Linux でのアセンブリ コードからの SDL/OpenGL の呼び出し

学習目的で、アセンブリで単純なグラフィックベースのプログラムを作成しています。このために、OpenGL または SDL のいずれかを使用するつもりでした。アセンブリから OpenGL/SDL の関数を呼び出そうとしています。

問題は、インターネットで見つけた多くのアセンブリや OpenGL/SDL チュートリアルとは異なり、私のマシンの OpenGL/SDL は明らかに C 呼び出し規則を使用していないことです。私は C で簡単なプログラムを書き、アセンブリにコンパイルしました (-S スイッチを使用)。GCC によって生成されたアセンブリ コードは、スタックにプッシュされるのではなく、レジスタにパラメータを渡すことによって OpenGL/SDL 関数を呼び出すようです。

さて、問題は、これらの OpenGL/SDL 関数に引数を渡す方法をどのように決定するかということです。つまり、どの引数がどのレジスタに対応するかをどのように把握するのでしょうか?

明らかに、GCC は C コードをコンパイルして OpenGL/SDL を呼び出すことができるため、関数の引数とレジスタ間の対応を把握する方法が必要です。C 呼び出し規則では、ルールは簡単です。パラメーターを後方にプッシュし、eax/rax で値を返します。C のドキュメントを読むだけで、パラメーターを渡す方法を簡単に理解できます。しかし、これらはどうですか?

C 呼び出し規約を使用して OpenGL/SDL を呼び出す方法はありますか?

ところで、Gentoo Linux amd64 のリンカとして gcc/ld を使用して、yasm を使用しています。