我很好奇GDB如何确定某个值是有符号还是无符号。我创建了一个小程序,将一个带符号的负值存储到eax中。我已通过调试器运行它,我注意到它将eax的值解释为负数。这是怎么回事?我也试过这个没有生成调试信息。这是我的简短程序:
section .text
global _start
_start:
nop
mov eax, [doubleWord]
mov ebx, 0
mov eax, 1
int 0x80
section .data
doubleWord dd -52
答案 0 :(得分:1)
对于编译器生成的代码,debug info specifies the types for global symbols。
没有调试信息,我认为gdb只假设一切都是int
。
你可以自己手动编写调试信息,但它非常麻烦,通常更容易用p
和x
命令覆盖带有强制转换或格式说明符的类型。 (https://sourceware.org/gdb/current/onlinedocs/gdb/Data.html#Data)
例如,p /x $eax
将EAX打印为(无符号)十六进制整数。
此外,layout reg
很不错。请参阅x86代码wiki底部的strace
和gdb
的更多asm调试提示。