0

インライン アセンブリで int 値をプッシュしています。

_asm
  {
  mov eax,i3  
  push eax
  mov eax,ii  
  }  

後で pop を実行してこの値を取得します。

_asm
  {
  pop eax
  mov ii,eax  
  pop eax
  mov i3,eax  
  }  

ポップを行わずにスタックを検査したい。いくつかの値を再配置または再計算する必要があります。完了したら、スタックを復元できます。

私はasmで非常に錆びています。次のようなものがありますか:

mov ii,esp+4 

次の(現在ではない)スタック要素を移動しますか?私はちょうど推測しています。このコードを 32 ビット Windows と 64 Windows 環境の両方で実行する必要があります。

4

1 に答える 1

0

ポップを行わずにスタックを検査したい。いくつかの値を再配置または再計算する必要があります。

これは、スタックに割り当てられた変数が関数内でどのように機能するかです。したがって、関数のプロローグの後に通常、割り当てられるスペースの量がsub esp, x続く理由です。x

したがって、C (および C++) での変数アクセスは、スタックの検査です。または、コンパイラが変数を割り当てた方法がわかっている場合は、インライン ASM から変数を読み取ることができます。

あなたがしようとしていることを達成する 1 つの方法は、入力変数と出力変数の両方をインライン asm のオペランドとしてリストすることです。このosdev article はそれをうまく説明しています。このように、コンパイラがコーディングの変更と最適化フラグの間でスタックを再順序付けする方法に関係なく、アセンブラは引き続き機能します。

または、関数全体を自分で作成する場合は、次のように特定のアドレスにスタックの値をロードできます。

mov eax, DWORD PTR [ebp-8]

eaxこれにより、 にあるメモリ アドレスの値が読み込まれebp-8ます。

于 2012-10-21T14:21:43.463 に答える