有人可以解释xchg在此代码中如何工作?假设arrayD是1,2,3的DWORD数组。

mov eax, arrayD ; eax=1
xchg eax, [arrayD+4]; eax=2 arrayD=2,1,3

为什么xchg之后的数组1,1,3不存在?

最佳答案

xchg适用于like Intel's documentation says

我认为第二行的评论是错误的。 应该是eax=2arrayD = 1,1,3所以您是对的,您应该给您的老师发电子邮件,说您认为自己发现了一个错误,除非您在笔记中遗漏了一些东西。
xchg仅存储一个元素,并且无法神奇地回顾过去以了解eax的值来自何处,并使用一个xchg指令交换两个内存位置。

在一条指令中将1,2交换为2,1的唯一方法是64位旋转,例如rol qword ptr [arrayD], 32(仅x86-64)。

顺便说一句,如果您在意性能,请不要将xchg与内存操作数一起使用。它有一个隐式的lock前缀,因此它是一个完整的内存屏障,在Haswell/Skylake(http://agner.org/optimize/)上大约需要20个CPU周期。当然,可以同时执行多个指令,但是xchg mem,reg为8 oups,相比之下,单独的load + store总共为2。 xchg不会使管道停滞不前,但是内存障碍会给它带来很大的伤害,并且使CPU变得原子化也需要大量的工作。

有关的:

  • swapping 2 registers in 8086 assembly language(16 bits)(如何有效地与内存交换寄存器)。 xchg仅在需要原子性或只关心代码大小而不关心速度的情况下才有用。
  • Can num++ be atomic for 'int num'?
  • Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures?(用于reg,reg版本)
  • 09-06 18:39