c - mov后正确读取gdb值

标签 c linux assembly gdb x86

这是我在 gdb 中调试的二进制文件的两行。这是 gcc 为 IA32 编译的 C 代码:

8049345:    8b 45 08                mov    0x8(%ebp),%eax
8049348:    89 04 24                mov    %eax,(%esp)

我有一个display $eax设置,以便它会在每个步骤后显示值。第一行之后,display说:6: $eax = 134527652

我可以x 134527652x $eax我看到0x804baa4 <input_strings+100>: "1 1 1 1 1 1"为什么 display 和 x 给出不同的结果?

我相信下一行是说将 eax 移动到 esp 存储的地址中?我有一个display $esp设置并显示:2: $esp = (void *) 0xffffd540 .

在第二个mov之前,我x 0xffffd540并参见:0xffffd540: "" mov之后我重复并看到:

0xffffd540:  "\244\272\004\bY\233\004\b\210\325\377\377\214\325\377\377\220\325\377\377\224\325\377\377\230\325\377\377\234\325\377\377\001"

我以为这一行会将 eax 移动到这个地址,但我显然不明白这里的东西?如果您想查看二进制文件中的任何其他行,请告诉我。

最佳答案

我认为您的困惑可能是由于 x 命令将地址 0xffffd540 处的数据作为字符串打印的事实造成的。大概在存储到该地址之前,0xffffd540 处的第一个字节是 0 字节,被视为终止字符串,因此您会看到 "",即空字符串。将值 0x804baa4 写入此地址后,您将看到其以字节为单位的表示形式:

\244\272\004\b

其中 \244(八进制转义)是 0xa4,\272 是 0xba,\004 是 0x04,\b (退格字符 U+0008 的转义)是 0x08。

在打印的字符串中,您会在它后面看到更多垃圾,因为碰巧不再有空终止符。

关于c - mov后正确读取gdb值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14533427/

相关文章:

delphi - ASM/德尔福 - 划分

c - 看门狗:设备或资源忙

Linux——如何提前设置新文件的组权限

c - C数组的打印地址

linux - 如果下一个请求适合 mmap 是否使用已分配的 block ?

Linux 文件创建时间戳竞争条件

assembly - g++使用哪种ASM风格

gcc - 从 gcc 输出中提取控制流图

bcopy() 之后客户端的核心转储

c++ - 为什么不同编译器的ascii值有差异