【发布时间】:2020-11-06 13:14:20
【问题描述】:
首先,我想说我是 ASM 新手,如果这是一个愚蠢的问题,请原谅。
我在Agner Fog's microarchitecture manual 中读到了有关部分寄存器停顿的信息(这似乎有点先进,但我很好奇为什么 64 位模式下的 32 位指令将寄存器的上半部分归零)。例 6.13 给出了如何避免寄存器停顿的解决方案。我对此仍然有些困惑,为什么不使用 OR 操作而不是 MOV,例如:
xor eax, eax
mov al, byte [mem8]
; or al, byte [mem8] ; why not this?
我认为效果是一样的。它们每秒都使用相同数量的周期吗?一个比另一个更有效吗?有没有什么“幕后”让我更喜欢其中一个?
【问题讨论】:
-
是的。你可以这样做。但为什么呢?
-
在线查找代码以确定,但我相信它们的速度相同。如果您可以加载整个寄存器而不是仅加载 8 位,则可以删除 xor,但这也可能很容易通过管道传输。
-
在这种特殊情况下,当目标寄存器为
al时,mov指令短一个字节,参见godbolt.org/z/v114od -
如果可以避免的话,通常最好不要让指令依赖于寄存器以前的内容,因为它限制了处理器乱序执行的能力,所以通常你会更喜欢@987654326 @。不过,我不知道这在这种特定情况下是否重要。
-
请注意效果并不完全相同;
or将设置标志,mov不会。不过,这在大多数应用程序中可能并不重要。
标签: assembly x86 intel-syntax