2015-01-15 27 views
1

我调试一个非常简单的代码使用gdb:为什么gdb中的“info register ebp”不显示十进制数字?

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显示我0xd中13 EAX但0xd中0xd中的EBP?

+0

如果你在该行停止,但尚未执行。另外,除非你知道你在做什么,否则不要惹恼EBP。 – 2015-01-15 18:17:10

+0

@SevaAlekseyev我已经跨过那条线。正如你可以看到0xd已经是十进制13. – 2015-01-15 18:23:49

回答

2

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

这不仅是EBP的情况,也是ESP,EFLAGS和EIP的情况。我认为,这没有特别的意义。 gdb只是试图以有用的方式显示它。例如,对于EFLAGS,您希望看到标志的状态而不是十进制数字(在下面的示例中设置IF)。在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 

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

4

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"/> 

从GDB中,你可以看到一个寄存器的类型:

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

我想为[i386/32bit-core.xml]添加链接(https://github.com/gergap/binutils-gdb/blob/2b8118237ae25785e3afddafd9c554b1ad03d424/gdb/features/i386 /32bit-core.xml)有助于直接查看整个代码。虽然主要部分已包含在您的答案中。 – 2015-06-25 07:45:37

相关问题