2015-01-15 23 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

相關問題