問題タブ [stack-pointer]
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++ - 関数呼び出しが間違った関数にジャンプする
vs2008 で C++ スタティック ライブラリをコンパイルしています。ソリューションには、lib を使用するスタートアップ プロジェクトもあり、正常に動作します。
しかし、別のソリューションでライブラリを使用すると、実行時チェックに失敗します。「関数呼び出し全体で ESP の値が適切に保存されませんでした」 コードをステップ実行すると、関数 foo() がクラッシュの直前に代わりに bar() にジャンプしていることに気付きました。問題の関数は通常の関数であり、関数ポインターはありません。
何が起こっているのか、同じソリューションのライブラリを使用するとなぜ機能するのか、誰にも手がかりがありますか?
編集:それが役立つ場合、関数(メソッド)はクラスの一部です。
c - プロセッサスタックを変更する方法は?
このコードが「テスト」を出力しないのはなぜですか?
c - ベースポインタとスタックポインタとは正確には何ですか? 彼らは何を指していますか?
DrawSquare() が DrawLine() を呼び出すウィキペディアからのこの例を使用すると、
(この図では、下部に上位アドレスがあり、上部に下位アドレスがあることに注意してください。)
誰かが私にこの文脈で何ebp
を説明できますか?esp
私が見たところ、スタック ポインターは常にスタックの一番上を指し、ベース ポインターは現在の関数の先頭を指していると思いますか? または何?
編集:これは、Windowsプログラムのコンテキストで意味します
edit2: また、どのように機能しeip
ますか?
edit3: MSVC++ の次のコードがあります。
それらはすべて dword のように見えるため、それぞれ 4 バイトを使用します。したがって、hInstance から var_4 までに 4 バイトのギャップがあることがわかります。彼らは何ですか?ウィキペディアの写真に見られるように、それは返送先住所だと思いますか?
(編集者注:質問に属さないマイケルの回答から長い引用を削除しましたが、フォローアップの質問が編集されました):
これは、関数呼び出しの流れが次のとおりであるためです。
私の質問 (最後、願っています!) では、呼び出したい関数の引数をポップした瞬間からプロローグの最後まで、正確には何が起こるのでしょうか? それらの瞬間にebp、espがどのように進化するかを知りたいです(プロローグがどのように機能するかはすでに理解しています。引数をスタックにプッシュした後、プロローグの前に何が起こっているかを知りたいだけです)。
c++ - C ++で多重継承を使用する場合の無効なESP(VS2005)
Box2D物理エンジンを使用するゲームを作成してきましたが、スタックポインター(ESP)と多重継承で奇妙なことに遭遇しました。最小限のコードで再現できましたが、多重継承で使用するクラスを宣言する順序によって、プログラムがクラッシュするかどうかが決まるようです。
これをデバッグモードで実行すると、次のエラーが発生します
実行時チェックの失敗#0-ESPの値は、関数呼び出し全体で適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。
次のコード行にステップインすると、次のようになります。
CScoreZone::CollideではなくCScoreZone::OnAttachに入っていることに気づきました。どうしてこれなの?CScoreZoneの継承の順序を変更すると、正常に機能します
WindowsXPのVS2005SP2(8.0.50727.768)で実行しています。何か案は?
assembly - ret 命令は esp レジスタに 4 を追加しますか?
このret
命令により、「esp」レジスタが 4 増加しますか?
assembly - x86アセンブリのレジスタで使用されるプッシュ/ポップ命令の機能は何ですか?
アセンブラについて読んでいると、プロセッサの特定のレジスタをプッシュし、後で再度ポップして以前の状態に戻すと書いている人によく出くわします。
- どうすればレジスターをプッシュできますか? それはどこに押し付けられていますか?なぜこれが必要なのですか?
- これは単一のプロセッサ命令に要約されますか、それともより複雑ですか?
c++ - 埋め込まれたasmコードのランタイムチェック失敗#0
私はアセンブラーに少し慣れていませんが、esp
埋め込まれたアセンブラーコードを使用して、スタック内のC++メソッドからパラメーターを検索しようとしています。esp
これまでのところ、ポインタをにコピーすることすらできなかったebp
ので、スタックを保持することができます(スタックが変更された場合に備えて)。この小さなコードでさえ私に失敗を与えます:
これを実行すると、次のようになります。
実行時チェックの失敗#0-ESPの値は、関数呼び出し全体で適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。
何をすべきかわからない。助けてください、そして事前に感謝します。
assembly - ポップするか、esp、4を追加しますか?違いはなんですか?
この質問を見ましたが、答えが見つかりませんでした..
では、 1 回または 2 回使用する代わりに、add esp, 4
またはを使用することを好むのはなぜでしょうか。違い(パフォーマンス、安全性など)はまったくありますか、それとも個人的な選択の問題ですか?add esp, 8
pop
x86-16 - 8086 アセンブリで FP (Frame Pointer) の代わりに使用されるレジスタは何ですか?
FP の代わりに 8086 アセンブリで使用されるレジスタは何ですか? SPかESPだと思います。私は正しいですか?
c++ - ESP呼び出し規約はC++を発行します
宿題のために、私はファイルを読んで文字列をソートすることになっています。このために私は選択ソートを使用していて、それは機能します。これで、selSort関数を呼び出した直後にクラッシュします。私はこの問題を解決するためのアイデアを使い果たしました。誰かが私に手を差し伸べることができますか?