有人可以解释一下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不是?
答案 0 :(得分: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)。
BTW,如果您关心性能,请不要将xchg
与内存操作数一起使用。它具有隐式lock
前缀,因此它是一个完整的内存屏障,并且在Haswell / Skylake(http://agner.org/optimize/)上需要大约20个CPU周期。当然,可以同时使用多个指令,但xchg mem,reg
为8 uops,而单独加载+存储则为2。 xchg
不会阻塞管道,但是内存屏障会造成很大的伤害,而且只需要CPU做很多工作就可以使其成为原子。
相关:
xchg
仅适用于这种情况。