Debugging 为什么gdb中的“信息寄存器ebp”不显示十进制数?

Debugging 为什么gdb中的“信息寄存器ebp”不显示十进制数?,debugging,assembly,x86,gdb,Debugging,Assembly,X86,Gdb,我正在用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 0

我正在用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信息寄存器eax用十六进制和十进制数字显示eax的内容,而gdb信息寄存器ebx只对EBP使用十六进制数字,对吗

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

下面是一个示例,它显示了所有寄存器的内容,其中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 更多信息:

您的问题是,为什么gdb信息寄存器eax用十六进制和十进制数字显示eax的内容,而gdb信息寄存器ebx只对EBP使用十六进制数字,对吗

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

下面是一个示例,它显示了所有寄存器的内容,其中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 更多信息:

info registers命令以原始格式十六进制和自然格式打印寄存器。自然格式基于寄存器的类型,在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"/>
info registers命令以原始十六进制格式和自然格式打印出寄存器。自然格式基于寄存器的类型,在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"/>

如果你停在那一行,它还没有被执行。另外,除非你知道自己在做什么,否则不要搞EBP。@SevaAlekseyev我已经越过了这条线。正如您所看到的,0xd已经是十进制13。如果您停在该行,它还没有被执行。另外,除非你知道自己在做什么,否则不要搞EBP。@SevaAlekseyev我已经越过了这条线。正如您所看到的,0xd已经是十进制13。我认为为添加链接也有助于直接查看整个代码。虽然主要部分已经包含在您的答案中。我认为添加的链接也将有助于直接查看整个代码。虽然你的答案中包含了主要部分。