有人可以解释一下 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?
xchg作品像英特尔的文件说。
我认为第二行的评论是错误的。 应该是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 个 uop,而单独加载 + 存储总共有 2 个指令。 xchg不会停止管道,但内存屏障会造成很大伤害,而且 CPU 需要做很多工作才能使其成为原子。
有关的:
xchg如果您需要原子性,或者您关心代码大小而不是速度,则仅对这种情况有用。| 归档时间: |
|
| 查看次数: |
9001 次 |
| 最近记录: |