2

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

为什么sub完全用于此目的?sub在某些特殊情况下是否有任何理由偏爱?例如,它设置的标志与xor?

4

2 回答 2

8

差异:

我猜这只是手写 asm 的不同作者,他们中的一些人sub可能更喜欢没有意识到某些 CPU 只是特殊情况的异或。除非他们想要保证清除 AF 标志,否则sub可能是有意的。就像可能初始化事物并希望在可能使用pushf.

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

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

于 2021-01-20T22:39:41.400 回答
1

两者xor reg, reg和在许多现代 x86 处理器上sub reg, reg都被认为是归零习惯用法。两者的效果是相同的,使用一个比另一个没有优势。

于 2021-01-20T22:17:12.220 回答