Debugging 为什么gdb中的“信息寄存器ebp”不显示十进制数?
我正在用gdb调试一个非常简单的代码: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
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。我认为为添加链接也有助于直接查看整个代码。虽然主要部分已经包含在您的答案中。我认为添加的链接也将有助于直接查看整个代码。虽然你的答案中包含了主要部分。