读取 RIP 寄存器给出下一条指令的地址?

Reading RIP register gives next instruction's address?

我尝试读取 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 读取指令吗?

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

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