gdb中pc的含义别名?

问题描述

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

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

pcrip的值相同。 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]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...