在我寻求更多地了解计算机的一般知识时,我偶然发现了一本书,其中有一些关于反汇编、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 行)吗?如果我的假设是正确的,那么我们找到了其余的数据吗?它是否必须对堆栈和特定的堆栈框架执行某些操作,而我目前不知道?
我非常感谢您的意见,以便我能够澄清我的想法。
(gdb) help x
Examine memory: x/FMT ADDRESS.
指定 $esp 作为地址将使 gdb 获取该寄存器中的所有内容,并将其用作 x 命令的内存地址 - 并将显示内存中从该地址开始的以下 32 个字。
gdb 本身内的变量名称以 $ 为前缀,gdb 为所有 cpu 寄存器设置预定义变量。
如果你想检查 esp 寄存器,请使用命令info registers esp
,正如您将在示例 (x/32xw $esp) 中看到的那样,esp 寄存器包含显示的第一个地址 0xbffff7e0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)