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:启用十六进制表示
  • 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 寄存器设置预定义变量。

如果您想检查 esp 寄存器,请使用命令info registers esp,正如您将在示例中看到的 (x/32xw $esp),esp 寄存器包含显示的第一个地址,0xbffff7e0

于 2012-08-09T19:26:58.617 回答
2

它为您提供了 32 个esp寄存器指向的内存字(显然该寄存器包含地址 0xbffff7e0)。

于 2012-08-09T19:26:16.010 回答
1

(gdb) x/32xw $esp 这意味着显示 esp 指向的 32 个单词字段。

件数:32,格式:十六进制,大小:字(1 字= gdb 上的 32 位)

显示 32 个单词字段,其中 esp 指向 (hex)0xbffff7e0 - (hex)0xbffff7f0 = (dec)3221223392 - (dec)3221223408 = 16bytes=4words

于 2019-08-15T16:21:37.413 回答