”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > x86 汇编中的“锁定”指令是否无限期地保留总线?

x86 汇编中的“锁定”指令是否无限期地保留总线?

发布于2024-11-08
浏览:717

 Does the \

理解x86汇编中的“Lock”指令

x86汇编中的“lock”指令是一个前缀,它强制后续指令对总线的独占所有权。这可确保 CPU 在该指令的持续时间内完全控制高速缓存行。

停用总线锁定

与通常的理解相反,“lock”前缀不会导致 CPU 锁定无限期的公交车。执行后续指令后,锁会被释放。这允许 CPU 仅在绝对必要时锁定总线来保持最佳性能。

使用“Lock”实现加法

您提供的代码片段实现了长字的原子增量由 ecx 寄存器中的值指定的内存位置:

  1. movl 4(%esp), �x:复制要递增的变量的地址
  2. incl (�x):以原子方式递增 ecx 寄存器中存储的地址处的长字。
  3. mov $0,�x:将 eax 寄存器设置为 0。
  4. setne %al:如果变量的新值不等于0(表示自增操作),则将al寄存器的值设置为1成功)。

结果是变量自动加 1,如果新值为 0,则 eax 寄存器设置为 0,否则设置为 1。注意,这个操作是增量,而不是加法。

最新教程 更多>
  • 使用 STMMCU 实现静电除尘器控制器的 SPWM ase/ase 逆变器
    使用 STMMCU 实现静电除尘器控制器的 SPWM ase/ase 逆变器
    前段时间提到中频电除尘器控制器,我仔细分析了单相和三相SPWM驱动时间,完成了STM32F103处理器上SPWM代码的编写,并用示波器测试了信号和波形,逻辑分析仪。 STM32F103的TIMER1和TIMER2支持互补的PWM输出,我选择TIMER1的CH1、CH2、CH3用于A、B、C三相驱动;...
    编程 发布于2024-11-08
  • 我们必须了解开源工具,让您比开发人员更优秀
    我们必须了解开源工具,让您比开发人员更优秀
    The software development landscape is evolving faster than ever. To stay ahead of the curve, you must arm yourself with tools and technologies built f...
    编程 发布于2024-11-08
  • # 终极指南:QA 自动化工程师的调试技术
    # 终极指南:QA 自动化工程师的调试技术
    ?️ 面对让您摸不着头脑的测试失败? 调试可能感觉像是一场徒劳的追逐,但通过正确的技术,您可以加快工作流程并更快地发现问题。在这篇文章中,我将分享每个 QA 自动化工程师在他们的工具包中应该拥有的实用调试方法,以提供更可靠的自动化脚本。 ? 为什么调试在自动化测试中很重要 调试对于以...
    编程 发布于2024-11-08
  • 如何使用 Java Lookahead 和 Lookbehind 拆分字符串并保留分隔符?
    如何使用 Java Lookahead 和 Lookbehind 拆分字符串并保留分隔符?
    使用保留的分隔符分割字符串处理由一组唯一分隔符分隔的多行字符串时,分割字符串可能会很困难同时还保留分隔符本身。标准 String.split 方法仅根据指定的分隔符分隔字符串,并丢弃分隔符。使用 Lookahead 和 LookbehindJava 开发工具包 (JDK)提供了使用lookahead...
    编程 发布于2024-11-08
  • 为什么 np.vectorize() 比 df.apply() 对于 Pandas 列创建更快?
    为什么 np.vectorize() 比 df.apply() 对于 Pandas 列创建更快?
    Pandas apply 与 np.vectorize 的性能比较据观察,np.vectorize() 可以明显快于 df。基于 Pandas DataFrame 中的现有列创建新列时使用 apply() 。观察到的性能差异源于这两种方法所采用的底层机制。df.apply() 与 Python 级循...
    编程 发布于2024-11-08
  • 如何修复由于 MySQL 严格模式导致 Laravel Eloquent 中的“SELECT 列表的表达式 #1 不在 GROUP BY 子句中”错误?
    如何修复由于 MySQL 严格模式导致 Laravel Eloquent 中的“SELECT 列表的表达式 #1 不在 GROUP BY 子句中”错误?
    Laravel Eloquent 中与 sql_mode=only_full_group_by 不兼容遇到错误“SELECT 列表的表达式 #1 不在 GROUP BY 子句中.. .” 当执行带有分组的 Eloquent 查询时,表明与 MySQL 的 sql_mode=only_full_gro...
    编程 发布于2024-11-08
  • 冰冷的池塘如何帮助您理解 C++ 中未定义的行为?
    冰冷的池塘如何帮助您理解 C++ 中未定义的行为?
    理解初学者的未定义行为对于新程序员来说,未定义行为是一个很难掌握的概念,特别是当他们在工作中遇到过它时实践其具体实施。为了帮助新手理解避免未定义行为的重要性,可以采用一个有效的类比。想象一个结冰的池塘,其中冰的厚度和稳定性是不可预测的。假设你走过池塘一次,它成立。这能保证每次都能安全通过吗?当然不是...
    编程 发布于2024-11-08
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-08
  • 如何在Vue.js组件中动态加载外部JS脚本?
    如何在Vue.js组件中动态加载外部JS脚本?
    在 Vue.js 组件中动态加载外部 JS 脚本使用支付网关时,集成促进交易的外部脚本变得必要。然而,通常不希望在初始页面加载时加载这些脚本。这就是 Vue.js 提供的解决方案,用于在特定组件中动态加载外部脚本。要实现此目的,请利用 Vue.js 组件中的 Mounted() 生命周期挂钩。 Mo...
    编程 发布于2024-11-08
  • 如何使用 Foreach 循环查找 PHP 数组中的最后一个元素?
    如何使用 Foreach 循环查找 PHP 数组中的最后一个元素?
    使用 PHP 的 foreach 循环查找数组中的最后一个元素在 PHP 中,在 foreach 循环中访问数组的最后一个元素需要与 Java 相比,这是一种更细致的方法,可以直接检查数组长度。使用计数和增量要确定最后一个元素,您可以利用 count( ) 函数,返回数组中的元素数量:$numIte...
    编程 发布于2024-11-08
  • 如何解决Python中的循环依赖问题?
    如何解决Python中的循环依赖问题?
    Python 中的循环依赖解析在 Python 中,当模块相互依赖其定义时,可能会遇到循环依赖。当两个文件(node.py 和 path.py)分别定义类 Node 和 Path,并且每个文件都引用另一个文件时,就会出现这样的情况。最初,path.py 导入 node.py 来访问 Node目的。然...
    编程 发布于2024-11-08
  • rnr:适用于每个项目运行脚本的工具
    rnr:适用于每个项目运行脚本的工具
    嘿,JavaScript 和 TypeScript 开发者! ?您是否厌倦了使用不同的命令来启动各种 JS 项目?好吧,我有一些令人兴奋的消息要告诉你!我创建了一个名为 rnr(发音为“runner”)的工具,它使运行任何 JavaScript 或 TypeScript 项目变得超级容易。 ...
    编程 发布于2024-11-08
  • Java 的可选类型如何简化“Get”调用链中空值的处理?
    Java 的可选类型如何简化“Get”调用链中空值的处理?
    使用可选的“Get”调用链安全导航在 Java 编程中,经常会遇到“get”调用链,如下所示:house.getFloor(0).getWall(WEST).getDoor().getDoorknob();为了避免潜在的 NullPointerExceptions,开发人员通常采用详细的 null ...
    编程 发布于2024-11-08
  • 大泥球:理解反模式以及如何避免它
    大泥球:理解反模式以及如何避免它
    前端开发中最臭名昭著的架构反模式可能是大泥球。术语“大泥球”适用于没有明显结构或模块化组织的系统。代码库有机且混乱地增长,成为维护的噩梦。这是许多开发人员发现自己所处的情况,特别是当他们面临着按时完成任务并开发大量功能的压力时。 这就是当前文章的内容:大泥球反模式以及前端开发中的示例,为什么它如此常...
    编程 发布于2024-11-08
  • 如何正确使用带 Map 参数的“reflect.Call”函数?
    如何正确使用带 Map 参数的“reflect.Call”函数?
    解决reflect包中的.Call使用问题在reflect包中使用.Call函数时,遵守所需的参数格式至关重要。本文将指导您完成正确使用 .Call 函数并操作 in 变量以满足目标方法的过程。提供的示例代码中:params := "some map[string][]string&quo...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3