如何解决gdb中pc的含义别名?
我有一个小的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]
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。