2017-10-17 99 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

相关问题