【问题标题】:Intel x86 assembly to compare and reset memory用于比较和重置内存的 Intel x86 程序集
【发布时间】:2014-03-29 17:22:44
【问题描述】:

在 Intel x86 处理器上,是否可以在特定内存位置将一个值与另一个值进行比较,如果比较成功则重置内存而不用担心多线程/处理器问题?我看到了 CMPXCHG 指令——这行得通吗?或者有没有比较和设置用例的东西?

【问题讨论】:

    标签: assembly x86 compare-and-swap


    【解决方案1】:

    CMPXCHG 指令将隐含寄存器 (EAX) 中的值与目标进行比较,并更新零标志 (EFLAGS.ZF) 以指示目标中的值是否与 EAX 中给出的值匹配,在这种情况下,源操作数(显式寄存器)存储在目标中。 CMPXCHG 还使用从目标读取的值更新 EAX。

    Wikipedia 将compare-and-set 描述为compare-and-swap 的变体,您可以在其中获得真/假指示,表明内存位置的数据是否与给定值匹配,以及内存位置是否已更新。 compare-and-swap 替代方案返回从内存中读取的内容,您可以自己与给定的值进行比较。

    http://en.wikipedia.org/wiki/Compare-and-set

    ...重定向到

    http://en.wikipedia.org/wiki/Compare-and-swap

    在这个意义上 CMPXCHG 既是 compare-and-set 也是 compare-and-swap.

    您必须使用LOCK 前缀来确保 CMPXCHG 以原子方式执行,即执行 CMPXCHG 的线程在任何其他线程访问内存位置之前先读取并写入内存位置。

    你说resetting the memory if the compare succeeded如果你的意思是将内存位置设置为零,那么零就是你想要在源寄存器中的值。

    有关进行compare-and-swap 的可移植方式,请参阅this SO question 中的资源

    注意 CMPXCHG 指令允许目标操作数既是寄存器也是内存位置。测试 8 个字节时,您将使用 CMPXCHG8B 指令。当您在 CMPXCHG8B 指令上指定 LOCK 前缀并指定寄存器作为目标时,奔腾处理器中存在一个错误,您可以阅读有关它的更多信息here

    【讨论】:

    • 有没有比较和交换、比较和设置的区别的链接?
    • @EvanCarroll 我已更新答案以包含指向 Wikipedia 的 compare-and-set 文章的链接,该文章重定向到 compare-and-swap。我还更新了 CMPXCHG 指令的描述,这是错误的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2023-03-15
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多