我查看了以下解压缩的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?若然,清拆登记册的目的是甚麽?
注:我只是出于好奇才问这个问题。我对汇编语言了解甚少。
发布于 2016-01-30 16:03:40
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>
对寄存器进行归零的必要性在汇编中非常常见,当只加载寄存器的一部分时,随后的指令在它们的全部范围内运行。执行xor x, x
是常见的寄存器清除模式之一。
还请参阅this (非常详尽和伟大,如注释所示),以获得更多关于为什么xor
比其他替代方案(mov x, 0
、and x, 0
)更可取的详细信息。
https://stackoverflow.com/questions/35103741
复制相似问题