2017-10-17 100 views
0

我很好奇GDB是如何確定值是有符號還是無符號的。我創建了一個小程序,將有符號負值存儲到eax中。我已經通過調試器運行了它,並且我注意到它將eax中的值解釋爲負值。這是怎麼回事?我也嘗試過,而不生成調試信息。這裏是我的短節目:GDB如何知道一個值是否被簽名?

section .text 
global _start 
_start: 
    nop 
    mov eax, [doubleWord] 
    mov ebx, 0 
    mov eax, 1 
    int 0x80 
section .data 
    doubleWord dd -52 
+1

取決於您打印的方式。 'd'(十進制)和'f'(浮點)是有符號的,其餘的,包括'u'和'x'都是無符號的。 – Jester

+1

你告訴它如何解釋這個值(沒有辦法從這些位本身告訴)。 – Ped7g

+0

愚蠢的運氣,當你使用一個無符號或浮點數時會發生什麼,它猜對了還是使它成爲一個十進制有符號數? (我的猜測是後者) –

回答

1

對於編譯器生成的代碼,debug info specifies the types for global symbols

沒有調試信息,我認爲gdb只是假設一切都是int

可能手工代碼調試信息自己,但它是非常繁瑣的,通常更容易只覆蓋使用石膏或格式說明符的類型px命令。 (https://sourceware.org/gdb/current/onlinedocs/gdb/Data.html#Data

例如,p /x $eax將EAX打印爲(無符號)十六進制整數。

另外,layout reg很好。請參閱標記wiki底部的stracegdb的更多asm調試提示。

+1

感謝您的回答。我嘗試輸入EAX的十六進制值,並將0xffffffcc解釋爲-52。此外,ptype返回int_32,因此它將該值作爲有符號整數處理。 – user7355630

相關問題