为了进一步了解计算机,我偶然发现了一本书,其中有一些关于反汇编、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 行)吗?如果我的假设是正确的,那么我们是否找到了其余的数据?它是否必须与堆栈以及我目前不知道的特定堆栈框架有关?
我会很感激你的意见,这样我就可以澄清我的想法。