此指令可与锁前缀一起使用,以允许指令原子执行。为了简化与处理器总线的接口,目的操作数接收一个写周期,而不考虑比较的结果。如果比较失败,则写回目标操作数;否则,将源操作数写入目标。
我很难理解最后一句(但可能也很难理解整个图表)
目标操作数被写回。..
写回什么?...;否则,将源操作数写入目标
源操作数是什么?是ecx:ebx
吗?据我所知,这个CAS指令只接受一个操作数(内存目标)。如果有人能重新措辞和/或解释关于无条件写入的这一点,我将不胜感激。
与常规CMPXCHG r/m32、r32
的措辞相比,应该更有意义,尤其是比较手动条目顶部表单中的简短描述。我已经用dst、src和隐式进行了注释。注意,Intel语法通常是OP dst,src
。
>
CMPXCHG r/m64,r64
:比较RAX(隐式)与r/m64(dst)。如果相等,则设置ZF,并将r64(src)加载到R/M64(dst)中。否则,清除ZF并将R/M64(dst)加载到RAX中(隐式)。
CMPXCHG16B m128
比较RDX:RAX和m128(dst)。如果相等,则设置ZF并将RCX:RBX加载到m128(dst)中。否则,清除ZF并将m128加载到RDX:RAX中。
是的,没错,英特尔的手册用“加载”来描述存储到内存。(对于目标可以是寄存器的CMPXCHG
来说,这是稍微合理的,而对于CMPXCHG16b
来说则完全不合理。)
但无论如何,记住这些实现:
(就C++而言std::atomic
。要真正做到原子化,它们需要lock
前缀,否则它是一个非原子RMW。C++只能编译为锁CMPXCHG
/锁CMPXCHG16b
,而不是主流编译器的未锁定的CMPXCHG
。)
目标操作数被写回...写回什么?
目标的旧值(刚刚加载)被写回。这意味着cmpxchg16b
始终是一个写,并且将始终将页面的脏标志标记为脏。(cmpxchg是否在失败时写入目标缓存行?如果不是,它是否比xchg更适合Spinlock?询问它是否真的在CAS失败时在微架构上弄脏了缓存行。我假设是这样,但没有检查过。)
这在历史上对旧CPU上的lock
前缀非常重要,在旧CPU上有一个外部lock#引脚,lock CMPXCHG
实际上为整个加载+存储对断言了这个引脚。现代CPU只是在受影响的高速缓存线上保持一个高速缓存锁的持续时间,用于可缓存内存上的对齐锁CAS。这就是为什么手册上说“为了简化与处理器总线的接口,目标操作数接收一个写周期,而不考虑比较的结果。”
如果比较失败,则写回目标操作数;否则,将源操作数写入目标。(处理器不会在不产生锁定写的情况下产生锁定读。)
这整段是Intel在编写CMPXCHG16b
条目时从CMPXCHG
手动条目复制粘贴的;在CX16上下文中不太清楚,因为它有2个隐式操作数,而不是显式源和读写RAX。它没有定义术语“源操作数”。
在前面的描述中,它确实为该指令定义了“目标操作数”术语
将edx:eax中的64位值(如果操作数大小为128位,则将rdx:rax中的128位值)与操作数(目标操作数)进行比较
“the operand”表示显式操作数。这显然是这个意思,因为它是唯一可以是记忆的东西,所以它一定是被比较的东西之一。还有其他线索/原因,从英语如何运作等等。
本文向大家介绍深入了解Java GC的工作原理,包括了深入了解Java GC的工作原理的使用技巧和注意事项,需要的朋友参考一下 JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代下载地址 和旧生代采用不同的垃圾回收机制。 首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。 JVM
正如标题所解释的,我有一个非常基本的编程问题,但我还没有找到。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”各种在线线程的回复我仍然不太明白。 当我们面对不知道自己不知道的事情时,我们可能会提出错误的问题或错误地提出正确的问题。我将分享我的“想法”。我的问题是希望有类似观点的人能够分享一些知识,帮助我打开递归灯泡! 以下是函数(语法用Swift编写): 我们将使用2和5作为参数:
我不明白嵌套for循环是如何工作的。正在执行升序程序,请逐步解释它的工作原理 输出: 之后:
我写了下面的函数(当我读里奇关于C的书时),从命令行获取一行。它做了它应该做的事情,我理解它是如何工作的,但我想深入一点。 我的问题是关于循环的,假设我们有一个空白命令行,它正在等待用户输入内容,因为第一个getchar()在循环中被调用,假设用户输入了以下内容: 我猜接下来会发生什么,是getchar()在arr[]中存储“h”,而用户实际上没有按回车键。 因此如果用户继续键入: 'h''e''
本文向大家介绍SELINUX工作原理详解,包括了SELINUX工作原理详解的使用技巧和注意事项,需要的朋友参考一下 1. 简介 SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。 Security-Enhanced Linux (SELinux)由以下两部分组成: 1) Kernel SELinux模块(/kernel/security/selinux
本文向大家介绍AngularJS 工作原理详解,包括了AngularJS 工作原理详解的使用技巧和注意事项,需要的朋友参考一下 个人觉得,要很好的理解AngularJS的运行机制,才能尽可能避免掉到坑里面去。在这篇文章中,我将根据网上的资料和自己的理解对AngularJS的在启动后,每一步都做了些什么,做一个比较清楚详细的解析。 首先上一小段代码(index.html),结合代码我们来