4

コンピューター全般についてもっと学びたいと思っていたときに、逆アセンブル、x86 アセンブリ言語、および C と x86 アセンブリの関係についての章がいくつかある本に出くわしました。今、私はこのGDBコマンドを読んでいますが、完全には理解できません。

コマンドとその結果は次のとおりです。

(gdb) x/32xw $esp
0xbffff7e0:    0xb8000ce0 0x08048510 0xbffff848 0xb7eafebc
0xbffff7f0:    0x00000002 0xbffff874 0xbffff880 0xb8001898
0xbffff800:    0x00000000 0x00000001 0x00000001 0x00000000
0xbffff810:    0xb7fd6ff4 0xb8000ce0 0x00000000 0xbffff848
0xbffff820:    0x40f5f7f0 0x48e0fe81 0x00000000 0x00000000
0xbffff830:    0x00000000 0xb7ff9300 0xb7eafded 0xb8000ff4
0xbffff840:    0x00000002 0x08048350 0x00000000 0x08048371
0xbffff850:    0x08048474 0x00000002 0xbffff874 0x08048510

今、私が理解していることから、発行するコマンドはデバッガーに次のように指示します。

  • x (最初のもの): メモリを調べる
  • 32: 次の 32 を取得します。
  • x: 16 進表記を有効にする
  • w:Wordサイズ データを表示します。
  • **Note:**esp レジスターについて質問することは知っていますが、その前で $ が何をしているのか完全には理解していません。使用しないようにすると、シンボルが見つからないというエラーが表示されるので、参照/参照解除に関係があると思いますか?

私を悩ませているのは、これらすべてのバイトをどのように見つけたのですか? サイズが 32 ビットのレジスターを調べているので、32 ビットまたは 4 バイト (上記の 1 行のみ) しか得られないのでしょうか? 私の仮定が正しければ、残りのデータは見つかったでしょうか? 現在認識していない、スタックと特定のスタック フレームで何かを行う必要がありますか?

頭の中で物事を明確にすることができるように、あなたの意見をいただければ幸いです。

4

3 に答える 3

3
(gdb) help x   
Examine memory: x/FMT ADDRESS.

$esp をアドレスとして指定すると、gdb はそのレジスタにあるものをすべてフェッチし、それを x コマンドのメモリ アドレスとして使用します。そのアドレスから始まるメモリ内の次の 32 ワードが表示されます。

gdb 自体の変数は $ で始まる名前であり、gdb はすべての CPU レジスタに対して事前定義された変数を設定します。

info registers espesp レジスタを検査する場合は、例 (x/32xw $esp) でわかるように、コマンドを使用します。esp レジスタには、表示されている最初のアドレス 0xbffff7e0 が含まれています。

于 2012-08-09T19:26:58.617 に答える
2

レジスタが指している32ワードのメモリを提供していますesp(明らかに、そのレジスタにはアドレス0xbffff7e0が含まれています)。

于 2012-08-09T19:26:16.010 に答える