为什么 gdb 中的 "info register ebp" 不显示十进制数?

Why is "info register ebp" in gdb not displaying a decimal number?

我正在用 gdb 调试一个非常简单的代码:

mov ebp,eax     ; Save # of bytes read from file for later

这是我的输出:

Breakpoint 2, Read () at hexdump1.asm:44
(gdb) info register eax
eax   0xd      13
(gdb) step
Read () at hexdump1.asm:45
(gdb) info register ebp
ebp   0xd      0xd

为什么 gdb 显示 eax 为 0xd 13 而 ebp 为 0xd 0xd?

你的问题是为什么(gdb) info register eax用十六进制数和十进制数显示EAX的内容,而(gdb) info register ebx只用十六进制数表示EBP,对吗?

不仅EBP如此,ESP、EFLAGS和EIP也是如此。我想,那没有什么特别的意义。 gdb 只是试图以一种有用的方式显示它。例如,对于 EFLAGS,您希望查看标志的状态而不是十进制数(在下面的示例中设置了 IF)。在 EBP 和 ESP 的情况下,我们谈论的寄存器通常用于指向 stack/memory 中的地址。因此通常,您不想知道十进制值。好吧,在这种情况下,两次显示十六进制是没有用的。

这里是一个例子,用info registers命令显示所有寄存器的内容(i r是简写形式,我刚发现:P)。

    (gdb) i r
    eax            0x0  0
    ecx            0x0  0
    edx            0x0  0
    ebx            0x0  0
    esp            0xbffff234   0xbffff234
    ebp            0x0  0x0
    esi            0x0  0
    edi            0x0  0
    eip            0x804822d    0x804822d 
    eflags         0x202    [ IF ]
    cs             0x73 115
    ss             0x7b 123
    ds             0x7b 123
    es             0x7b 123
    fs             0x0  0
    gs             0x0  0

更多信息:https://sourceware.org/gdb/onlinedocs/gdb/Registers.html

info registers 命令以 raw 格式(十六进制)和 natural 格式打印寄存器。自然格式基于寄存器的 type,在 gdb 源代码的 xml 文件中声明。例如,i386/32bit-core.xml 包含:

<reg name="eax" bitsize="32" type="int32"/>
<reg name="ecx" bitsize="32" type="int32"/>
<reg name="edx" bitsize="32" type="int32"/>
<reg name="ebx" bitsize="32" type="int32"/>
<reg name="esp" bitsize="32" type="data_ptr"/>
<reg name="ebp" bitsize="32" type="data_ptr"/>
<reg name="esi" bitsize="32" type="int32"/>
<reg name="edi" bitsize="32" type="int32"/>

<reg name="eip" bitsize="32" type="code_ptr"/>
<reg name="eflags" bitsize="32" type="i386_eflags"/>
<reg name="cs" bitsize="32" type="int32"/>
<reg name="ss" bitsize="32" type="int32"/>
<reg name="ds" bitsize="32" type="int32"/>
<reg name="es" bitsize="32" type="int32"/>
<reg name="fs" bitsize="32" type="int32"/>
<reg name="gs" bitsize="32" type="int32"/>

在 gdb 中,您可以查看寄存器的类型:

(gdb) whatis $eax
type = int32_t
(gdb) whatis $ebp
type = void *