问题描述
我有一个小的x86_64汇编程序,尽管在pc
寄存器中有指令指针,但没有看到任何专门称为rip
的寄存器(程序计数器?)。输入:
>>> p/x $rip
$15 = 0x4000c5
>>> p/x $pc
$16 = 0x4000c5
pc
和rip
的值相同。 pc
是gdb中rip
的别名,还是有其他含义?
解决方法
它是GDB的程序计数器/指令指针的通用名称,无论您碰巧要调试的是哪个目标ISA。
在x86-64上,体系结构寄存器名称为RIP,因此 $pc
是$rip
的别名。请注意,这是下一条要执行的指令的地址,即您停止执行的指令。
它也是前一条指令正在执行时RIP 所具有的相同地址(除非我们通过分支到达此处):RIP相对寻址相对于当前指令的末尾(开始于下一个),与相对分支位移相同。
在GDB中停止执行时,您可以认为此状态介于 指令之间。上一条指令已完全完成,但RIP仍指向尚未解码+执行的指令。 (因此$pc
实际上是调试异常或单步TF陷阱的异常返回地址。)
在ARM上,指令指针寄存器称为PC或R15,因此碰巧$pc
实际上与ARM手册中使用的名称之一匹配。
我不知道ARM GDB的$pc
或$r15
是否实际上反映了以下事实:用mov r0,r15
读取R15寄存器会在以后给您2条指令的地址,而不是下一条指令的地址就像x86-64 lea rax,[rip + 0]
。