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

All*_*Goh 5 x86 assembly

有人可以解释一下 xchg 在这段代码中是如何工作的吗?鉴于 arrayD 是一个 1,2,3 的 DWORD 数组。

mov eax, arrayD ; eax=1
xchg eax, [arrayD+4]; eax=2 arrayD=2,1,3
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*des 7

xchg作品像英特尔的文件说

我认为第二行的评论是错误的。 应该是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 个 uop,而单独加载 + 存储总共有 2 个指令。 xchg不会停止管道,但内存屏障会造成很大伤害,而且 CPU 需要做很多工作才能使其成为原子。

有关的: