在我寻求更多地了解计算机的过程中,我偶然发现了一本书,其中有一些关于反汇编的章节,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行)?如果我对我的假设是正确的,那么我们是否找到了其余的数据?它是否必须对堆栈以及特定的堆栈框架执行某些操作,我目前还不知道它?
我很感激您的意见,以便我能在脑海中澄清一切。
答案 0 :(得分:1)
它给你32个字的内存,其中esp
寄存器指向(显然该寄存器包含地址0xbffff7e0)。
答案 1 :(得分: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
答案 2 :(得分:0)
(gdb)x / 32xw $ esp 意思是告诉我esp指向的32个单词字段。
个:32, 格式:十六进制 size:word(gdb上1个word = 32位)
告诉我esp指向的32个单词字段 (hex)0xbffff7e0-(hex)0xbffff7f0 =(dec)3221223392-(dec)3221223408 = 16bytes = 4words