读取 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,是当前指令执行过程的一部分。
我尝试读取 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,是当前指令执行过程的一部分。