【问题标题】:Reading RIP register gives next instruction's address? [duplicate]读取 RIP 寄存器给出下一条指令的地址? [复制]
【发布时间】:2018-05-07 17:09:48
【问题描述】:

我尝试读取 x86_64 寄存器 rip 的值。这是objdump 显示的内容。

4017ec: 48 8d 35 00 00 00 00  lea    0x0(%rip),%rsi
4017f3: 41 89 d4              mov    %edx,%r12d

我希望在指令0x4017ec 执行后,rsi 的值应该是0x4017ec。不过是0x4017f3,也就是下一条指令的地址。

我使用 gdb 停在0x4017ec,当时rip 的值是0x4017ec。为什么rsi当时没有被rip的值加载?处理器应该从0x4017ec 读取指令吗?

【问题讨论】:

  • 不确定这是否是实际原因,但我不希望指令在被读取之前执行,这可能会将 ip 寄存器更新为指令之后。
  • IIRC,这很正常。在执行一条指令期间,rip 指向指令的end,即下一条指令的开始。这与跳转和调用指令相同。相对位移是从jmp的末尾开始

标签: assembly x86-64 cpu-registers addressing-mode


【解决方案1】:

rip 在运行当前指令时始终保存下一条指令的地址。如果事实通过下一条指令的地址更新rip,是当前指令执行过程的一部分。

【讨论】:

    【解决方案2】:

    取决于架构 %rip 保存当前正在执行的指令或要执行的下一条指令。在这里,您在 0x4017ec 之前添加了一个断点,这意味着要执行的下一条指令是 0x4017ec。但是 %rsi 只有在执行第一条指令后才会被加载。到那时 %rip 已经更新为指向下一条指令。

    【讨论】:

    • 嗯,除了 x86 之外的一些架构有 PC / IP 寄存器,在当前指令执行时保存当前指令的开始,但没有其他架构将其称为 %rip。在 x86-64 上,它不依赖任何东西;它始终是以下指令的开始,因为这就是它在 x86 ISA 中的定义方式。
    • 在 ARM(32 位)上,PC 可用于寻址模式(或作为常规寄存器)。它的值是超出执行的 2 条指令。所以这是第一句话的反例。你总是需要查看架构手册。
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2021-08-17
    • 2015-04-21
    • 2018-06-15
    • 2019-01-31
    相关资源
    最近更新 更多