問題タブ [cdecl]
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 - cdecl 呼び出し規則で、signed char と short がパラメーターとしてどのように渡されるか
例えば
と同じですか
それとも同じですか
または、両方とも問題ありませんか (上位ビットはダーティとして扱います)。
特別なコンパイラでいくつかの実験を行うことができます.しかし、すべてが詳細に同じであるかどうかはわかりません.正式な約束が必要です.
c - VS2013 で printf は __cdecl を使用しません
今日のインタビューでそのような質問があります。
私の答えは 5.1 ですが、インタビュアーは 5.2 だと言いました。もちろん、C のデフォルトの呼び出し規約は __cdecl で、引数の受け渡し順序は右から左であることは知っていたので、そのことを彼に伝えました。しかし、彼はそれを信じませんでした。VS2013で実行するより。それは5,2を示しました!!!!!
さて、家に帰って、ideone でもう一度試してみます。答えは 5.1 です!!! http://ideone.com/sq6yRE なぜ?! 私はそれについてとても混乱しています。誰が私を助けてくれますか?
c++ - エクスポートされた関数を __stdcall に入れ、名前をマングル解除することは可能ですか?
オフライン テスト用のダミー DLL を生成するプロジェクトに取り組んでいます。互換性がないように見えますが、実際の DLL とそのヘッダー ファイルがあります。DLL 内の名前はマングルされていませんが、関数の前方宣言宣言は次のように呼び出されます__stdcall
。
たとえば .h
Dependency Walker の example.dll:
私が読んだ限りでは、__stdcall
規約で関数をエクスポートできる場合、その名前は依存関係ウォーカーで次のように読み取られる必要があります。
これは、ヘッダー ファイルがコンパイルされた DLL に対応していないことを意味しますか、それとも何か不足していますか?
最終的に、ダミー関数のエクスポートを作成して、エミュレートしている実際の DLL と同じように動作させるにはどうすればよいでしょうか?
assembly - %esp と CDECL のインクリメント
私は x86 スタックと CDECL 規則について読んでいて、私を混乱させる何かを読みました。
リストされた呼び出し元の責任の中には、パラメーターのポップ、パラメーターの使用、または単純に %esp をインクリメントしてパラメーターを削除することがありました。
その最後の部分はどのように機能しますか?
たとえば、%esp の初期値が 0x105000 で、現在のスタック フレームに対して $0x1c だけデクリメントするとします。いくつかのデータを割り当ててから、それをインクリメントして戻します。その場合、そのデータはまだメモリ内に浮かんでいませんか? メモリはどのようにクリアされますか? 0x104FF4 にアクセスするとセグメンテーション違反が発生しますか?もしそうなら、何がデータをクリアしたのでしょうか?
c - cdecl はどこに文書化されていますか?
Linux で x86 用の単純な C コンパイラを作成しています。cdecl 呼び出し規約を使用したいと考えています (gcc はそれを使用しており、かなり一般的なようです)。
ただし、公式または決定的なドキュメントは見つかりません。ウィキペディアには説明と例があります。Raymond Chen は短い要約を持っています。C11仕様にも関連するものは見つかりませんでした。
cdecl の正規のドキュメントはありますか?
assembly - cdecl 関数を作成するときにレジスタの状態を保持する方法は?
呼び出し規約を使用する関数をcdecl
作成しているため、関数を呼び出す前のレジスタの状態が保持されていることを確認する必要があります。
私の質問は、これが通常どのように実行されるかです。関数の開始時にスタック上のレジスタをプッシュし、関数の最後にそれらをレジスタにポップアウトするだけの問題ですか?
c++ - 簡易暗号化アセンブリプログラム - メモリ位置へのアクセス違反書き込み
このプログラムには、もともと標準化されていない規則を使用していた cdecl 呼び出し規則を実装する必要がありました。私が知る限り、それは正しいように見えますが、「アクセス違反の書き込み場所0x00000066。プログラムが「バイトptr [eax]ではありません」という行に到達したときにヒットするようです」という未処理の例外エラーが発生します。矢印はプログラムを中断した後のポイントです。
私のプログラムの何が問題なのか、どうすれば修正できるのか、誰か教えてもらえますか? ありがとうございました。