xchg如何在英特尔汇编语言中工作

时间:2018-04-30 14:13:43

标签: assembly x86

有人可以解释一下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不是?

1 个答案:

答案 0 :(得分: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)。

BTW,如果您关心性能,请不要将xchg与内存操作数一起使用。它具有隐式lock前缀,因此它是一个完整的内存屏障,并且在Haswell / Skylake(http://agner.org/optimize/上需要大约20个CPU周期。当然,可以同时使用多个指令,但xchg mem,reg为8 uops,而单独加载+存储则为2。 xchg不会阻塞管道,但是内存屏障会造成很大的伤害,而且只需要CPU做很多工作就可以使其成为原子。

相关: