在我寻求更多地了解计算机的一般过程中,我偶然发现了一本书,其中有一些章节涉及反汇编、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
现在,据我所知,我发出的命令告诉调试器:
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
关于memory - gdb 'x' 命令有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890253/