gdb这样做的原因是什么?如果要显示相同的信息(在rsp和rip的情况下),这是否多余?此外,这如何在其他架构上推广? (以上输出适用于x86-64)。
源。我重新提出了这个问题,因为我认为我会从逆向工程的角度找到更具体的答案。
#1 楼
实际上,在汇编中,您只能找到三种类型的值:数字值;
内存地址;
指令(操作码)。
通用寄存器,例如
rax
,rbx
,...,用于存储数值(将触发程序的行为)或存储器地址(以了解在何处读取/写入或跳转)。 当然,由于大多数人习惯于将十进制格式用于程序中使用的值,因此当寄存器中可能包含十进制格式时,显示十进制格式很重要。
现在,重要的是要知道内存地址通常以十六进制格式给出(主要是出于紧凑性原因)。并且,通用寄存器可能还包含内存地址。这就是为什么
gdb
同时显示十进制和十六进制格式的情况,以防万一,另一种最适合当前值。寄存器
rsp
,rip
(和rbp
)是特殊情况,因为它们特别用于存储地址(仅用于存储地址),因此将此类寄存器的内容转换为十进制格式将毫无用处。这就是为什么gdb
只为这些寄存器提供十六进制格式的原因。最后,
rflags
/ eflags
的情况有点特殊,因为该寄存器的含义取决于每个位(请参见下图。因此,给用户十进制,十六进制或二进制格式不是真正有用(除非您可以将数字与立即标记)。但是,给出设置为“ true”的标志列表(这是您在示例中看到的
[ IF ]
)更为有用。但是,gdb
给出了eflags
的十六进制值,因为它可以被访问并用作程序中的值(我已经将此作为混淆目的了。)
评论
谢谢恐怖。同样从64bit-core.xml的源文件中,似乎很清楚为什么会发生这种情况。
–Rakholiya Jenish
15年6月25日在7:40