在 gdb 中运行信息寄存器后,我们得到类似于以下的输出:
rax 0x1c 28
rbx 0x0 0
rcx 0x400a60 4196960
rdx 0x7fffffffde88 140737488346760
rsi 0x1 1
rdi 0x400932 4196658
rbp 0x0 0x0
rsp 0x7fffffffde68 0x7fffffffde68
r8 0x400ad0 4197072
r9 0x7ffff7dea560 140737351951712
r10 0x7fffffffdc30 140737488346160
r11 0x7ffff7732dd0 140737344908752
r12 0x4007f0 4196336
r13 0x7fffffffde80 140737488346752
r14 0x0 0
r15 0x0 0
rip 0x7ffff7732dd0 0x7ffff7732dd0
eflags 0x202 [ IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
虽然我确实理解 for rax、rcx 等,但 GDB 正在将第二列的值转换为十进制,但这似乎不一致。一些寄存器,即 rsp 和 rip 显示相同的十六进制值,即使在第二列中也是如此。另一方面,eflags 显示第二列中的标志。
gdb 这样做的原因是什么?如果它要显示相同的信息(在 rsp 和 rip 的情况下),这不是多余的吗?另外,这如何推广到其他架构上?(以上输出适用于 x86-64)。
来源。我重新问了这个问题,因为我认为我会从逆向工程的角度找到更具体的答案。