我正在查看程序的反汇编(因为它崩溃了),并注意到很多
xchg ax, ax
我用谷歌搜索了一下,发现它本质上是一个 nop,但是为什么 Visual Studio 会执行 xchg 而不是 noop?
该应用程序是一个C# .NET3.5 64位应用程序,由Visual Studio编译
在 x86 上NOP
操作说明is XCHG AX, AX
2 个助记符指令汇编成相同的二进制操作码。 (实际上,我想汇编器可以使用任何xchg
一个寄存器本身,但是AX
or EAX
通常用于nop
据我所知)。
xchg ax, ax
具有不更改寄存器值和不更改标志的属性(嘿 - 这是一个无操作!)。
Edit(回应 Anon 的评论。):
哦,对了 - 现在我记得有几种编码xchg
操作说明。有些采用 mod/r/m 组位(如许多 Intel x86 架构指令)来指定源和目标。这些编码占用超过一个字节。还有一种特殊的编码,它使用单个字节并与通用寄存器交换(E)AX
。如果指定的寄存器也是(E)AX
那么你就有了一个单字节 NOP 指令。你还可以指定(E)AX
使用较大的变体与自身进行交换xchg
操作说明。
我猜测 MSVC 使用多字节版本xchg
with (E)AX
当它想要咀嚼多个字节而不进行任何操作时,作为源和目标 - 它需要与单个字节相同的周期数xchg
,但占用更多空间。在反汇编中你不会看到多字节xchg
解码为NOP
,即使结果是一样的。
具体来说xchg eax, eax
or nop
可以编码为操作码0x90
or 0x87 0xc0
取决于您希望它使用 1 个字节还是 2 个字节。 Visual Studio 反汇编器(可能还有其他反汇编器)将解码操作码0x90
as the NOP
指令并将解码操作码0x87 0xc0
as xchg eax, eax
.
我已经有一段时间没有完成详细的汇编语言工作了,所以很可能我在这里至少在一个方面是错误的......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)