有人可以解释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=2
,arrayD = 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变得原子化也需要大量的工作。
有关的:
xchg
仅在需要原子性或只关心代码大小而不关心速度的情况下才有用。