首页 > 解决方案 > gdb 中 pc 的含义(别名?)

问题描述

我有一个小的 x86_64 汇编程序,我没有看到任何专门称为pc(程序计数器?)的寄存器,虽然寄存器中有指令指针rip但是,当我输入时:

>>> p/x $rip
$15 = 0x4000c5
>>> p/x $pc
$16 = 0x4000c5

两者pcrip具有相同的价值。是gdb 中pc的别名rip,还是有其他含义?

标签: assemblygccgdbcpu-registersprogram-counter

解决方案


它是 GDB 对程序计数器/指令指针的通用名称,无论您碰巧在调试什么目标 ISA。

在 x86-64 上,体系结构寄存器名称是 RIP,因此$pc$rip. 请注意,这是要执行的下一条指令的地址,即您要停止的指令。

这也是 RIP 在执行前一条指令时所拥有的地址除非我们通过分支到达这里):RIP 相对寻址是相对于当前指令的结尾(下一条指令的开始),与相对分支位移相同。

当在 GDB 中停止执行时,您可以将此状态视为指令之间的状态。上一条指令已完全完成,但 RIP 仍然指向尚未解码 + 执行的指令。($pc实际上是来自调试异常或单步 TF 陷阱的异常返回地址。)


在 ARM 上,指令指针寄存器称为 PC 或 R15,因此它恰好$pc与 ARM 手册中使用的名称之一匹配。

我不知道 ARM GDB$pc$r15实际上是否反映了这样一个事实,即读取 R15 寄存器后mov r0, r15会为您提供 2 条指令的地址,而不是像 x86-64 这样的下一条指令lea rax, [rip + 0]


推荐阅读