2

現在、コールスタックにいくつかの値を出力する必要があるという問題に取り組んでいます。これが私がしたことです:

int funcA() 
{ 
    int a = 1;
    int b = 2;
    char c = '3';
    asm("mov %ebp, ebp");
    asm("mov %esp, esp");
    printf("&a = %x\n", &a);
    printf("&b = %x\n", &b);
    printf("&c = %x\n", &c);
    printf("esp = %X  ebp = %X\n", esp, ebp);
}

espとebpは事前に宣言されています。上記のコードの出力は次のとおりです。

&a = ff7f7c
&b = ff7f78
&c = ff7f77
esp = FF7F68  ebp = FF7F88
  1. なぜ&c = ff7f77?スタックでは、タイプに関係なく、すべてのチャンクは4バイトに等しいはずですよね?
  2. なぜesp=ff7f68?&c-4に等しいはずだと思います
  3. 別の質問は、私がこれをした場合:

    printf("%x", ebp-4);
    

アウトパスは

ff7f78

出力がff7f84ではない理由を誰かが説明できますか?

よろしくお願いします!

4

1 に答える 1

1
  1. いいえ、コンパイラは何でもできます。

  2. いいえ、コンパイラは何でもできます。

  3. ebpおそらく、 以外のものとして宣言しましたchar *。ポインター演算の結果が表示されています。この場合、4 バイト型へのポインターのように見えます。%xとにかくポインタを印刷するために使用すべきではありません。それ%pがそのためです。

于 2013-02-09T20:59:44.917 に答える