微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么某些 Windows booloader 代码使用 `sub` 而不是 `xor` 将寄存器归零?

如何解决为什么某些 Windows booloader 代码使用 `sub` 而不是 `xor` 将寄存器归零?

鉴于 https://stackoverflow.com/a/33668295 中详述的考虑因素,似乎 xor reg,reg 是将寄存器清零的最佳方法。但是,当我检查实际的汇编代码(例如 Windows 引导加载程序代码、IIRC)时,我发现同时使用了 xor reg,regsub reg,reg

为什么要为此使用 sub?在某些特殊情况下,是否有任何理由更喜欢 sub?例如,它设置的标志是否与 xor 不同?

解决方法

差异:

  • sub reg,reg 被记录为设置 AF=0(BCD 半进位标志,从第 3 位到第 4 位)。 XOR 未定义 AF。架构效果在其他方面完全相同,仅留下可能的性能差异。 AF 几乎从不重要,通常只有在下一条指令是 aaa 或其他指令时才重要。
  • sub-zeroing 在少数 CPU 上比 xor-zeroing 慢(例如 Silvermont,如 my answer you linked 中所指出的),但在大多数 CPU 上的性能相同。当然,两者都具有相同的 2 字节大小。

我猜这只是手写 asm 的不同作者,他们中的一些人更喜欢 sub 可能没有意识到有些 CPU 只是特殊情况的异或。除非他们想要保证清除 AF 标志,其中 sub 可能是有意的。就像可能会在可能使用 pushf 的东西之前初始化一些东西并希望 EFLAGS 有一个完全已知的状态。

XOR 使 AF 未定义仍然意味着它将是 0 或 1,您只是不知道哪个。 (不像 C 未定义的行为)。实际结果可能取决于 CPU 型号、输入值,甚至可能是某处的一些杂散位。

在将 sub 识别为归零习语的现代 CPU 中,它将为零,因此 CPU 可以完全相同地处理异或归零和子归零,包括 FLAGS 结果。

,

在许多现代 x86 处理器上,xor reg,regsub reg,reg 都被认为是归零习惯用法。两者的效果是一样的,使用一个没有任何优势。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。