1

完全なソース コードはありませんが、シンボルを含むオブジェクト ファイルがあります。読み取り行があります:

=> 0x080489cd <+169>:   call   0x8049275 <read_line>
   0x080489d2 <+174>:   mov    %eax,(%esp)
   0x080489d5 <+177>:   call   0x8048d59 <phase_1>

in the function:
 8048d59:   55                      push   %ebp
 8048d5a:   89 e5                   mov    %esp,%ebp
 8048d5c:   83 ec 08                sub    $0x8,%esp

最初の行に ab を入力し、念のため関数名にも 1 つ追加しました。「1」を入力してみたところp *(char**)$esp、次のようになりました。

0x80489da "\350\355\006"

これは私が期待していたものではありません。「1」が見られると思っていました。私も試しました:

gdb x $esp
0xbffff0cc: 0x080489da

gdb x *0xbffff0cc

0x80489da <main+182>: 0x0006ede8
4

1 に答える 1

4

関数の最初のようなものを壊している場合 (「最初の行に ab を入れる」という意味だと思います)、表示されているのは戻りアドレスです。phase_1 の呼び出しから実際にリターン アドレスが表示されているようです。

探しているものが最初のパラメーターである場合は、次を試してください。

p *(char**)($esp+4);
于 2012-10-06T19:37:10.090 に答える