gpt4 book ai didi

assembly - 为什么 Visual Studio 使用 xchg ax,ax

转载 作者:行者123 更新时间:2023-12-02 12:00:32 30 4
gpt4 key购买 nike

我正在查看程序的反汇编(因为它崩溃了),并注意到很多

xchg    ax, ax

我用 google 搜索了一下,发现它本质上是一个 nop,但为什么 Visual Studio 会执行 xchg 而不是 noop?

该应用程序是一个 C# .NET3.5 64 位应用程序,由 Visual Studio 编译

最佳答案

在 x86 上,NOP 指令 XCHG AX, AX

这 2 个助记符指令汇编成相同的二进制操作码。 (实际上,我认为汇编器可以将寄存器的任何 xchg 与自身一起使用,但 AXEAX 通常用于据我所知, nop)。

xchg ax, ax 具有不更改寄存器值和不更改标志的属性(嘿 - 这是一个无操作!)。

<小时/>

编辑(回应 Anon 的评论。):

哦,对了 - 现在我记得 xchg 指令有多种编码。有些采用 mod/r/m 组位(如许多 Intel x86 架构指令)来指定源和目标。这些编码占用超过一个字节。还有一种特殊的编码,它使用单个字节并与 (E)AX 交换通用寄存器。如果指定的寄存器也是(E)AX,那么您就有一个单字节 NOP 指令。您还可以使用 xchg 指令的较大变体指定 (E)AX 与其自身交换。

我猜测,当 MSVC 想要处理多个字节时,它会使用 xchg 的多字节版本,并以 (E)AX 作为源和目标对于无操作 - 它需要与单字节 xchg 相同的周期数,但使用更多空间。在反汇编中,即使结果相同,您也不会看到解码为 NOP 的多字节 xchg

具体来说,xchg eax、eaxnop 可以编码为操作码 0x900x87 0xc0,具体取决于是否你希望它用完 1 或 2 个字节。 Visual Studio 反汇编器(可能还有其他反汇编器)会将操作码 0x90 解码为 NOP 指令,并将操作码 0x87 0xc0 解码为 xchg eax,eax

自从我完成详细的汇编语言工作以来已经有一段时间了,所以我很可能在这里至少有一个错误......

关于assembly - 为什么 Visual Studio 使用 xchg ax,ax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2136043/

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