[英]How does xchg work in Intel Assembly Language
有人可以解释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
工作方式类似于Intel的文档所述 。
我认为第二行的评论是错误的。 它应该是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 uops,相比之下,单独的load + store总共为2。 xchg
不会使流水线停滞不前,但是内存障碍会给它带来很多伤害,并且使CPU原子化也需要大量工作。
有关:
xchg
仅在需要原子性或只关心代码大小而不关心速度的情况下才有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.