gdb 中 pc 的含义(别名?)

Meaning of pc in gdb (alias?)

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

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

pcrip 具有相同的值。 pc是gdb中rip的别名,还是另有含义?

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

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

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

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


在 ARM 上,instruction-pointer 寄存器称为 PC 或 R15,因此碰巧 $pc 实际上与 ARM 手册中使用的名称之一匹配。

我不知道ARM GDB的$pc$r15是否真的反映了用mov r0, r15读取R15寄存器后给你2条指令的地址,而不是下一条指令,如 x86-64 lea rax, [rip + 0].