8

次のコードで、EBP、ESP、スタックフレームについていくつか質問があります。

  1. なぜespから28を引いたのですか?mainに2つのローカル変数xとyがあります。では、なぜ8を減算しなかったのでしょうか。

  2. そして、値を右(または上)から左(または下)にスタックするように配置しませんか?では、なぜ[eax+4]ではなく[eax+8]に1を追加したのでしょうか。


func(int a, int b, int c)
{
  return a+b+c;
}
main()
{
 int x, y=3;
 x=func(y,2,1);
}

アセンブリでパラメータを渡す

4

1 に答える 1

9
  1. 2つのローカル変数に8バイト、funcのパラメーターに12バイトが必要なため、スタックポインターは28で減算されます。余分な8バイトは、コンパイラがメインのスタックを16バイト境界に揃えようとしたことが原因である可能性があります(メインのリターンアドレス用のスタックにはすでに4バイトがあり、メインの最初の命令でスタックフレームを確立するためにEBPがプッシュされたときにさらに4バイトあります) )。GCCを使用している場合は、-mpreferred-stack-boundaryを参照してください。

  2. パラメータは右から左に渡されます。スタックポインタから差し引かれたときにスタックスペースが3つのパラメータにすでに割り当てられているため、1は現在のスタックポインタ(+8)に対して「最高」の位置に移動し、2は中央(+4)に移動します。 、およびyの値は、スタックポインタ自体に移動されます。これは、スタックで1を押し、スタックで2を押してから、スタックでyを押すのと同じです。最後のプッシュ命令では、1はESPから+8、2はESPから+4、yはESPから+0です。funcの内部では、リターンアドレスが呼び出し命令からスタックにプッシュされ、funcがEBPをプッシュしてスタックフレームを確立するため、これらのオフセットに8を追加する必要があることに注意してください。

  3. どの構造について混乱していますか?

于 2013-01-06T19:11:46.287 に答える