【问题标题】:Meaning of pc in gdb (alias?)gdb 中 pc 的含义(别名?)
【发布时间】:2020-12-12 00:37:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: assembly gcc gdb cpu-registers program-counter


    【解决方案1】:

    它是 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 这样的下一条指令 @987654328 @。

    【讨论】:

    • @old_timer:这是大多数架构,包括 x86-64。 RIP 不是通用寄存器,它只是有一个类似的命名方案。 32 位 ARM 是确实将 PC 公开为 2^n 个通用寄存器之一的罕见 ISA 之一。 (我想你知道,也许你的意思是指出“架构”和“通用”之间的区别?)
    • @old_timer:嗯,你只是让我想知道 ARM GDB 是否像 mov r0, r15 指令那样读取 $pc 和/或 $r15,稍后获取 2 条指令的地址,而不是下一个要执行的。在 x86-64 上,两条指令之间的 RIP 是下一条要执行的指令,与执行前一条指令期间的情况相同(如果它不是分支)。但 ARM 不是这样的。我猜 GDB 想要轻松访问您停止的地址/si 将执行的指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2015-10-24
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多