gdb 中 pc 的含义(别名?)
Meaning of pc in gdb (alias?)
我有一个小的 x86_64 汇编程序,但我没有看到任何专门称为 pc
(程序计数器?)的寄存器,尽管有指令指针,在 rip
注册 然而,当我输入:
>>> p/x $rip
= 0x4000c5
>>> p/x $pc
= 0x4000c5
pc
和 rip
具有相同的值。 pc
是gdb中rip
的别名,还是另有含义?
这是 GDB 对程序计数器/指令指针的通用名称,无论您正在调试的目标 ISA 是什么。
在 x86-64 上,体系结构寄存器名称是 RIP,因此 $pc
是 $rip
的别名。请注意,这是下一条要执行的指令的地址,即您停止的指令。
它也是 RIP 在 而 前一条指令正在执行时具有的相同地址(除非我们通过分支到达这里): RIP-relative 寻址是相对于末尾的当前指令的位置(下一条的开始),与相对分支位移相同。
当在 GDB 中停止执行时,您可以将此状态视为在 条指令之间。前面的指令已经完全完成,但 RIP 仍然指向尚未解码 + 执行的指令。 (所以 $pc
实际上是来自调试异常或 single-step TF 陷阱的 exception-return 地址。)
在 ARM 上,instruction-pointer 寄存器称为 PC 或 R15,因此碰巧 $pc
实际上与 ARM 手册中使用的名称之一匹配。
我不知道ARM GDB的$pc
或$r15
是否真的反映了用mov r0, r15
读取R15寄存器后给你2条指令的地址,而不是下一条指令,如 x86-64 lea rax, [rip + 0]
.
我有一个小的 x86_64 汇编程序,但我没有看到任何专门称为 pc
(程序计数器?)的寄存器,尽管有指令指针,在 rip
注册 然而,当我输入:
>>> p/x $rip
= 0x4000c5
>>> p/x $pc
= 0x4000c5
pc
和 rip
具有相同的值。 pc
是gdb中rip
的别名,还是另有含义?
这是 GDB 对程序计数器/指令指针的通用名称,无论您正在调试的目标 ISA 是什么。
在 x86-64 上,体系结构寄存器名称是 RIP,因此 $pc
是 $rip
的别名。请注意,这是下一条要执行的指令的地址,即您停止的指令。
它也是 RIP 在 而 前一条指令正在执行时具有的相同地址(除非我们通过分支到达这里): RIP-relative 寻址是相对于末尾的当前指令的位置(下一条的开始),与相对分支位移相同。
当在 GDB 中停止执行时,您可以将此状态视为在 条指令之间。前面的指令已经完全完成,但 RIP 仍然指向尚未解码 + 执行的指令。 (所以 $pc
实际上是来自调试异常或 single-step TF 陷阱的 exception-return 地址。)
在 ARM 上,instruction-pointer 寄存器称为 PC 或 R15,因此碰巧 $pc
实际上与 ARM 手册中使用的名称之一匹配。
我不知道ARM GDB的$pc
或$r15
是否真的反映了用mov r0, r15
读取R15寄存器后给你2条指令的地址,而不是下一条指令,如 x86-64 lea rax, [rip + 0]
.