寄存器置零:为何 xor 胜出而不是 sub?
微软开发博客导航微软开发博客包含开发者相关、技术相关、编程语言相关、.NET 相关、平台开发相关、数据开发相关等多方面内容。开发者相关包括面向开发者的微软、Visual Studio、Visual Studio Code 等技术相关有 DirectX、微软代理框架编程语言相关涵盖 C、C#、F# 等.NET 相关涉及所有 .NET 文章、.NET MAUI、AI 等平台开发相关包含 #ifdef Windows、微软 Foundry 等数据开发相关有 Azure Cosmos DB、Azure Data Studio 等。寄存器置零方法探讨马特·戈德博尔特写了短文探讨为什么 x86 编译器喜欢使用 xor eax, eax 指令。在 x86 架构中这是将寄存器置零最紧凑的方式比 mov eax, 0 短几个字节因为无需对四字节常量进行编码。但马特未解释为何大家选 xor 而非其他能保证结果为零的数学运算特别是 sub eax, eax。sub eax, eax 编码字节数和执行周期与 xor eax, eax 相同且在标志位方面表现更好xor eax, eax 会使 AF 标志位未定义而 sub eax, eax 会清除该标志位。xor 胜出原因推测怀疑 xor 胜出是群体效应。设想历史中xor 和 sub 最初受欢迎程度相似但 xor 因偶然因素稍领先也许是看起来更“巧妙”。早期编译器用 xor 置零人们看到编译器生成 xor 指令会认为编译器开发者聪明从而倾向于 xor。英特尔在指令解码前端增加对 xor r, r 和 sub r, r 的特殊检测将目标重命名为内部零寄存器跳过指令执行还能打破依赖链。不过 Stack Overflow 担心其他 CPU 制造商可能只对 xor 做特殊处理使得 xor 胜出。额外闲聊与特殊情况有同事喜欢用 sub r, r 置零看到用 sub 而非 xor 置零寄存器就知道是他写的代码。xor 技巧在安腾Itanium处理器上不起作用因为数学运算不会重置 NaT 位但安腾有专门的零寄存器可直接将零移动到所需目标位置。评论讨论汤姆·林特询问在早期奔腾处理器上用异或操作置零是否会导致流水线停顿这或许是选减法而非异或置零的原因。约斯特·霍本推测 xor 比 sub 简单早期处理器中 xor 执行周期更少、功耗更低或有更多并行执行单元可用。乔纳森·哈斯顿表示使用 XOR A,A 四十多年已成习惯还提到 PDP11 上有明确的 CLR dst 指令编写代码时可将操作简化为 CLR 和 INC/DEC 以避免使用立即数。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2544460.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!