XMM 寄存器值

Posted

技术标签:

【中文标题】XMM 寄存器值【英文标题】:XMM register values 【发布时间】:2011-10-17 09:58:54 【问题描述】:

我发现很难在 Visual Studio 的寄存器窗口中解释 xmm 寄存器的值。窗口显示以下内容:

XMM0 = 00000000000000004018000000000000 XMM1 = 00000000000000004020000000000000 
XMM2 = 00000000000000000000000000000000 XMM3 = 00000000000000000000000000000000 
XMM4 = 00000000000000000000000000000000 XMM5 = 00000000000000000000000000000000 
XMM6 = 00000000000000000000000000000000 XMM7 = 00000000000000000000000000000000 

XMM00 = +0.00000E+000      XMM01 = +2.37500E+000      XMM02 = +0.00000E+000      
XMM03 = +0.00000E+000      XMM10 = +0.00000E+000      XMM11 = +2.50000E+000      
XMM12 = +0.00000E+000      XMM13 = +0.00000E+000

从我运行的代码来看,XMM0 和 XMM1 的值应该是 6 和 8(或其他方式)。这里显示的寄存器值为:XMM01 = +2.37500E+000

这意味着什么?

【问题讨论】:

【参考方案1】:

是的,它看起来像:

XMM0 =  6.0, 0.0   // 6.0 = 0x4018000000000000 (double precision)
XMM1 =  8.0, 0.0   // 8.0 = 0x4020000000000000 (double precision)

您在解释这一点时遇到问题的原因是您的调试器仅以十六进制显示每个 128 位 XMM 寄存器,然后在其下方显示为 4 x single 精度浮​​点数,但您显然正在使用 double 精度浮​​点数。

我不熟悉 Visual Studio 调试器,但理想情况下应该有一种方法可以更改 XMM 寄存器的表示 - 您可能需要查看手册或在线帮助。

请注意,通常在 SSE 中使用双精度几乎没有任何价值,特别是如果您有一个相当现代的 x86 CPU 和两个 FPU。

【讨论】:

如果有人像我一样通过谷歌偶然发现了这个。双打位于 Visual Studio 调试器中的 XMM0DLXMM0DH 中,它们显示在启用了“AVX Double”的“寄存器”对话框中。 如果有人想在 VS2017+ 中看到他们(我想,我正在使用 VS2019),您必须使用监视窗口,您可以通过弹出窗口添加 XMM0 或获取特定的 XMM0.m128_f64或更具体的XMM0.m128_f64[1]

以上是关于XMM 寄存器值的主要内容,如果未能解决你的问题,请参考以下文章

如何将浮点常量值移动到 xmm 寄存器中?

如何在 XMM 寄存器之间交换值?

将浮点数从高 xmm 四字移动到低 xmm 四字

将单个浮点数移动到 xmm 寄存器

克隆扩展 XMM 寄存器的 SSE 指令

XMM 寄存器中的取消引用指针(收集)