問題タブ [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.
pointers - スタック内のアドレスを参照するESPが毎回4時間ジャンプするのはなぜですか?
拡張スタックポインタ(ESP)が各PUSHまたはPOP操作で1時間ジャンプしないのはなぜですか?
c - Mac OS X Lion の C 言語でスタック ポインタを取得する
C で (インライン ASM を使用して) 現在のスタック ポインターを取得しようとすると、奇妙な動作に遭遇しました。コードは次のようになります。
標準の gcc オプションを使用してコードをコンパイルすると、次のようになります。
次のアセンブリが生成されます。
結果のバイナリを実行すると、SIGILL (Illegal Instruction) でクラッシュします。ただし、コンパイルに少し最適化を追加すると、次のようになります。
生成されたアセンブリは、はるかに単純です。
そして、コードは正常に実行されます。それでは、質問に。Mac OS X で C コードからスタック ポインタを取得するためのより安定した方法はありますか? 同じコードは Linux では問題ありません。
assembly - __fastcallでESPが破損するのを防ぐにはどうすればよいですか?
memset()のように、メモリのブロックを指定された値に設定する関数をアセンブリで書き込もうとしていますが、スタックから3番目の引数を取得しようとすると(fastcall呼び出し規約を使用します)、レジスタECXは、文字化けした値を取得します。
インラインアセンブリを使用してコードをVisualStudioに配置すると、関数が呼び出されたときにESPが大幅に変更されることがわかります。最初の2つの引数は問題なくECXとEDXに入れられており、問題を引き起こしているのは3番目の引数にすぎません。
VSでデバッグしているときにレジスタに値を手動で設定すると、コードが機能することを知っています。メモリのブロックは正しい値で満たされます。
私はアセンブリに比較的慣れていないので、私のコードはおそらく少し危険ですが、誰かがこの問題を修正する方法を知っていますか?
コードは以下のとおりです。
assembly - ESPレジスタとSSレジスタの違いは何ですか?
私はアセンブリ言語の初心者です。私が知っているように、ESP と SS はどちらもスタック レジスタを参照しますが、それらの違いはよくわかりません。
windows - ESPの値が適切に保存されていませんでした....およびC/C++の呼び出し規約
私は、OpenCVライブラリ、Boostライブラリ、およびこのLINKからダウンロードした一連のコードを使用してアプリケーションを作成しています。Thunk32と同じソリューションでプロジェクトを作成しましたが、次のファイルがあります。
MainProject.cpp
Window.h
およびWindow.cpp
これを実行すると、ウィンドウ内でマウスを動かさなくても問題なく、コールバックがcvSetMouseCallback関数に正常に渡されます。cvSetMouseCallback関数には、1。ウィンドウの名前、2。CvMouseCallback、およびNULL文字の3つのパラメーターがあります。CvMouseCallbackは次のように定義されます
CV_CDECLは、_cdecl呼び出し規約の単なる再定義です。
これで、私のmouseHandler関数はクラスメンバー関数になりました。これは_thiscall呼び出し規約に準拠していると思います。
私の質問は、マウスをウィンドウに置いたときに、少なくとも1回はメソッドに入ることができたのに、なぜ次のエラーが発生するのかということです。マウスが窓の中で動いた瞬間に変化があると思います。誰か助けてくれませんか?
これが私がしていることの画像です:
c - スタックスイッチングのためのこのインラインasmアプローチは大丈夫ですか?
一部の関数では、元のスタックが変更されないようにスタックを切り替える必要があります。そのために、以下のように2つのマクロを作成しました。
ここで、 temp_spとsaved_spはスレッドローカル変数です。temp_spは、使用する仮のスタックを指します。元のスタックを変更しないようにしたい関数の場合、SAVE_STACKを最初に配置し、RESTORE_STACKを最後に配置します。たとえば、このように。
今私の質問は、このアプローチがうまくいくかどうかです。x86(64ビット)では、ローカル変数とパラメーターはrbpレジスターを介してアクセスされ、それに応じてrspは関数プロローグで減算され、関数エピローグで追加されて元の値に戻るまで変更されません。したがって、ここでは問題はありません。
ただし、コンテキストスイッチと信号が存在する場合にこれが正しいかどうかはわかりません。(Linuxの場合)。また、関数がインライン化されている場合、または末尾呼び出しの最適化(呼び出しの代わりにjmpが使用されている場合)が適用されている場合、これが正しいかどうかもわかりません。このアプローチに問題や副作用がありますか?
assembly - 「pushebp」がebpの値を変更するのはなぜですか?
私は簡単なコードを持っています:
func2とmainは無関係なので、実装を省略します。次に、windbgを使用してアセンブリをトレースしました。次に、「func2()」を実行したときのアセンブリコードの出力を示します。
「pushebp」が実行される前は、esp = 0012fe98、ebp = 0012ff68であることがわかりますが、「push ebp」を実行した後は、esp = 0012fdc8、ebp = 0012fe94?なので、2つの質問があります。 espにのみ影響しますが、なぜebpも変更されるのですか?2.おそらくpushebpはスタックに4バイトをプッシュするので、espの値は4減少するはずですが、ここではespの値が208バイト減少していることがわかりますか?なんで?
assembly - ベースポインタとスタックポインタ
このコードを考えると:
(これは単なるメソッドです。以前は、最初と 2 番目のパラメーターをスタックにプッシュしていました。)
私の質問は、最初のパラメーターのアドレスを取得するためにベースポインターに 8 を追加し、次に 12 を取得するのはなぜですか?
それらはdwordであるため、それぞれが4バイトであるという事実がわかりました..したがって、ebp + 8からebp + 12までは意味があります。しかし、なぜ最初のものは ebp + 8 なのですか? ESP がスタックの TOP を指す場合、mov ebp, esp は、EBP がスタックの TOP を指すことを意味するためです。次に、スタックに 4 つの値をプッシュします: eax、ebx、ecx、および edx。EBP + 8 が最初のパラメーターを指しているのはなぜですか?
assembly - PUSHまたはPOP命令の使用中にESPレジスタの使用が推奨されないのはなぜですか?
プログラムの特定のトレースで使用されるレジスタの数を把握する必要がある C コードを調べていました。コードは、プッシュまたはポップ コマンドが検出されるたびに ESP レジスタを格納することを怠っていました。X86 命令も参照しました。 「ESP、スタックポインター、使用しないでください」と書かれていました.why??
assembly - この関数のコードのプロローグでスタックポインタから0x20が減算されるのはなぜですか?
アセンブリコード:
私は16バイトで整列されていることを知っています
が、main()でint c(=4 byte) + 1(4byte) + 2(4byte) in function(1 ,2)
ステートメントを呼び出します。
したがって、これの合計は12バイトです。しかし、メモリを調整することで、16バイトを検討します。
なぜサブ0x20, %esp
?