我在看下面的反汇编c++代码

    auto test2 = convert<years, weeks>(2.0);
00007FF6D6475ECC  mov         eax,16Dh
00007FF6D6475ED1  xorps       xmm1,xmm1
00007FF6D6475ED4  cvtsi2sd    xmm1,rax
00007FF6D6475ED9  mulsd       xmm1,mmword ptr [__real@4000000000000000 (07FF6D64AFE38h)]
00007FF6D6475EE1  divsd       xmm1,mmword ptr [__real@401c000000000000 (07FF6D64AFE58h)]

并且对xorps xmm1, xmm1指令的意义感到好奇。似乎任何数字xor本身只会给出0?如果是这样,清除寄存器的目的是什么?

注意:我只是出于好奇而问这个问题。我对汇编语言了解甚少。

最佳答案

XMM寄存器具有128位,使用cvtsi2sd仅填充低64位。因此,xorps指令用于清除可能会影响后续操作的可能的垃圾值和/或依赖项链。

基本上,您所拥有的操作顺序是:

mov         eax, 16Dh       ; load 0x16D into lower 32 bits of RAX register
xorps       xmm1, xmm1      ; zero xmm1
cvtsi2sd    xmm1, rax       ; load lower 32 bits from RAX into xmm1
<do more stuff with xmm1>

当仅加载寄存器的某些部分(随后的指令在其全部范围内进行操作)时,在 assembly 中将寄存器清零的必要性非常频繁。进行xor x, x是常用的寄存器清除模式之一。

另请参阅this(根据评论,非常详尽且出色)答案,以了解有关为什么xor优于其他替代方法(mov x, 0and x, 0)的更多详细信息。

关于c++ - xorps在同一寄存器上的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35103741/

10-13 07:01