gpt4 book ai didi

x64 JMP 指令的汇编解码

转载 作者:行者123 更新时间:2023-12-03 06:32:27 24 4
gpt4 key购买 nike

我偶尔会使用汇编。因此,我需要更专家的帮助来解码我必须处理的一小段代码。

0000:  48 ff 25 61 57 07 00    rex.W jmp QWORD PTR [rip+0x75761]        # 0x75768
0007: cc int3

这是一个内存间接跳转到保存在 rip+0x75761 的 8 字节/64 位地址,因此加载跳转目标的绝对地址是 0007 + 0x75761 = 0x75768,对吗?

最佳答案

这是 x86-64 上的标准尾部调用序列,由 Microsoft 编译器生成。

是的,正如你所说,它是间接跳转到64位内存地址0x75768。执行此代码时,rip 等于 7,因此 rip + 0x75761 == 0x7 + 0x75761 == 0x75768。该代码将无条件地将控制权转移到地址0x75768处的指令。

后面的int 3只是填充,但它也充当砖墙。由于前一条指令中的无条件分支,执行永远不会到达此点。如果确实如此,CPU 将陷入困境,因为这是“中断”中断。

至于 REX.W 前缀,哈罗德在技术上是正确的,它是不必要的,但原因可能不是您想象的那样。有点令人惊讶的是,当在 x86-64 上使用通过寄存器的间接跳转时,Windows 需要 REX.W 前缀以确保堆栈展开成功。堆栈展开代码在内部使用它作为信号。罗斯·里奇 (Ross Ridge) 写道 an excellent answer关于 Windows x64 中 REX 前缀 JMP 指令的用途。

在这种情况下,这并不是绝对必要的,因为这是一个带有 IP 相关操作数的间接跳转,但编译器显然无论如何都会发出它。它处理这个问题的逻辑可能并不那么复杂,并且也许它总是生成这个代码以保持一致性。或者官方文档对于堆栈展开代码的具体实现方式可能并不全面。安全总比后悔好,因为额外的 REX.W 前缀并没有真正的缺点。

关于x64 JMP 指令的汇编解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38835196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com