問題タブ [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.
c# - 管理されていない関数のフック、呼び出し規約のスタック/レジスタの問題?
これは EasyHook に関する特定の機能ではなく、一般的なフックに関する機能です。この署名で関数をフックしたい:
これは明らかに管理されていないコードであり、EasyHook を使用して管理されている C# コードでフックしようとしています
。
しかし、フックを挿入するとすぐに、フックされたプログラムがクラッシュし続けます-大きな驚きではありません。それは呼び出し規約の問題であり、フック関数がフックされたプログラムのスタックに何らかの形で干渉していると思います。
そこで、同じ関数をフックする別のプロジェクトを見てみましたが、c++ で回り道があります (フック部分):
そして、呼び出された関数:
(ターゲット アセンブリと C++ の例は、どちらも Visual C++ でコンパイルされています)。元の関数を呼び出す前に、いくつかのレジスタを保存してスタックを修復する必要があると思いますか? または、私がここで間違っていることは何か他の考えはありますか?
c - 引数の受け渡しはどのように機能しますか?
Cの関数に引数を渡すことがどのように機能するのか知りたいです。値はどこに保存され、どのように取得されますか?可変引数の受け渡しはどのように機能しますか?また、関連しているので、戻り値はどうですか?
私はCPUレジスタとアセンブラの基本的な知識を持っていますが、GCCが私に吐き出すASMを完全に理解するには十分ではありません。いくつかの簡単な注釈付きの例をいただければ幸いです。
assembly - フレーム ポインタ、epb、およびリターン アドレス
次の画像は、コール スタックに関するウィキペディアのエントリからのもので、完全には理解できないものがあります。
ebpレジスタに格納されているフレームポインタは、プロローグでそのように初期化されていると思いました*:
もしそうなら、画像のフレームポインタはリターンアドレスの後、その前に前のフレームポインタアドレス、そしてその前にリターンアドレスを指すべきではありませんか?私は何が欠けていますか?
ありがとう!
windows - Windows64 が x86-64 上の他のすべての OS とは異なる呼び出し規約を使用するのはなぜですか?
AMD には、x86-64 で使用する呼び出し規約を記述した ABI 仕様があります。独自の x86-64 呼び出し規約を持つ Windows を除いて、すべての OS がこれに従います。なんで?
この違いの技術的、歴史的、または政治的な理由を知っている人はいますか、それとも純粋にNIH症候群の問題ですか?
OSが異なれば、より高いレベルのものに対するニーズも異なる可能性があることは理解していますが、たとえば、Windowsでレジスタパラメーターを渡す順序がrcx - rdx - r8 - r9 - rest on stack
他の人が使用している理由を説明していませんrdi - rsi - rdx - rcx - r8 - r9 - rest on stack
。
PS私は、これらの呼び出し規約が一般的にどのように異なるかを認識しており、必要に応じて詳細をどこで見つけることができるかを知っています. 私が知りたいのはその理由です。
編集: 方法については、たとえばウィキペディアのエントリとそこからのリンクを参照してください。
c++ - thiscall 規則を使用した C++ メンバー関数の呼び出し
Delphi で記述された DLL をロードする C++ で記述されたアプリケーションがあります。アプリケーションは、DLL のエクスポートされた関数を呼び出し、Delphi DLL から呼び出したいいくつかのメンバ関数を持つクラスのオブジェクトへのポインタを渡します。C++ クラスに相当する Delphi クラスを作成しました。
C++クラスは同じように見えます
メンバ関数は、Delphi に相当するものがない thiscall 呼び出し規約を使用します。これはおそらく、アセンブリを使用する必要があることを意味します。私が試してみました:
しかし、アプリケーションがこの関数を呼び出すと、セグメンテーション違反が発生します。メンバー関数を正しく呼び出すにはどうすればよいですか?
winapi - NASM で LONGLONG RtlLargeIntegerDivide(LONGLONG, LONGLONG, LONGLONG*) を呼び出す (stdcall)
次の関数を呼び出そうとしています:
アセンブリ コード (NASM) で。stdcall 呼び出し規約を使用し、商を返します。仕様は次のとおりです。
入力: [EDX,EAX] (被除数)、[ECX,EBX] (除数)
出力: [EDX,EAX] (商)、[ECX,EBX] (剰余)
どうすればこれを行うことができますか?(私の主な問題は、EBP と ESP を正確に理解しているわけではなく、それらがローカル変数とどのように関係しているかということです。)
(いいえ、これは宿題ではありません。ラッパー C ランタイム ライブラリを実装しようとしています。)
ありがとうございました!
c - 関数の引数を渡すために、gcc が push ではなく movl を使用するのはなぜですか?
このコードに注意してください:
その後 :
そのコマンドは、アセンブリ内のソース コードを表示します。
メイン関数で確認できるようになりました。「push」コマンドを使用して関数の引数をスタックにプッシュすることはありません。その代わりに「move」を使用しました
なぜそれが起こるのですか?それらの違いは何ですか?
c++ - MS Visual C++: 呼び出し規約の使用を気にする必要があるのはいつですか?
C/C++ (具体的には、私は MSVS を使用しています) では、どのような状況で、関数定義の呼び出し規約の指定について心配する必要があるでしょうか? それらは重要ですか?必要に応じて最適な規則を選択できる準拠していませんか (つまり、fastcall など)。
私の理解が不足しているかもしれませんが、引数がスタックに配置される順序などをプログラマーが気にする必要がある場合がいつになるかわかりません。また、コンパイラの最適化が、その特定の関数に最適なスキームを選択できない理由もわかりません。誰かが私に提供できる知識は素晴らしいでしょう。ありがとう!
scala - Scala は参照によって呼び出すことができますか?
Scala が ALGOL からの名前による呼び出しをサポートしていることは知っています。それが何を意味するかは理解できると思いますが、Scala は C#、VB.NET、および C++ のように参照による呼び出しを行うことができますか? Java が call-by-reference を実行できないことは知っていますが、この制限が言語だけによるものなのか、それとも JVM によるものなのかはわかりません。
これは、巨大なデータ構造をメソッドに渡したいが、そのコピーを作成したくない場合に便利です。この場合、参照渡しは完璧に思えます。