我有一个小的 x86_64 汇编程序,我没有看到任何专门称为pc
(程序计数器?)的寄存器,虽然寄存器中有指令指针rip
但是,当我输入时:
>>> p/x $rip
$15 = 0x4000c5
>>> p/x $pc
$16 = 0x4000c5
两者pc
和rip
具有相同的价值。是gdb 中pc
的别名rip
,还是有其他含义?
我有一个小的 x86_64 汇编程序,我没有看到任何专门称为pc
(程序计数器?)的寄存器,虽然寄存器中有指令指针rip
但是,当我输入时:
>>> p/x $rip
$15 = 0x4000c5
>>> p/x $pc
$16 = 0x4000c5
两者pc
和rip
具有相同的价值。是gdb 中pc
的别名rip
,还是有其他含义?
它是 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]
。