我在看下面的反汇编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, 0
,and x, 0
)的更多详细信息。关于c++ - xorps在同一寄存器上的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35103741/