在 Assembler 中调试 xmm 寄存器

Posted

技术标签:

【中文标题】在 Assembler 中调试 xmm 寄存器【英文标题】:Debugging xmm registers in Assembler 【发布时间】:2015-12-22 22:20:48 【问题描述】:

我在 C# 中使用 XMM 寄存器使用汇编程序 dll 库编写程序。

我在 asm 中的代码:

mov eax, 5
mov ecx, 2
movd xmm0, eax           // here 
movd xmm1, ecx           // here
addss xmm0,xmm1          // and here no difference 
movd eax, xmm0          
ret 

它可以按我的意愿工作,但是我想解决一个小问题。 在调试此代码时,我正在更改 eax 和 exc 寄存器的值,并且它在调试期间在寄存器窗口中以红色显示,因为值已更改。 但是如果我更改 xmm 寄存器的值,它不会显示为红色,并且该寄存器的值仍然是: XMM0 = 00000000000000000000000000000000 XMM1 = 00000000000000000000000000000000 只有在调试期间我在 c# 中时 ret 之后,我才能注意到寄存器发生了变化。 XMM0 = 000000000000000000000000000000007 XMM1 = 000000000000000000000000000000002 我的问题是:为什么 xmms 的值在调试期间不会在寄存器窗口中改变,但程序可以正常工作?

【问题讨论】:

这取决于您的调试器,您显然忘记提及了。 您意识到您正在使用浮点加法,对吧?您要添加两个非正规浮点数:7.0E-45 和 2.8E-45 以获得 9.8E-45。这恰好可以工作,但是当您将它与大于 2^23 左右的整数一起使用时,当指数中的一些非零位时,它就会中断。也许您的调试器正在使用带有更改阈值的 FP 比较? 【参考方案1】:

您知道,12 月 1 日发布的 VS 的 RTM 更新无法在调试器中正确显示 YMM/XMM 寄存器的数据。该问题已引起 MSFT 团队的注意,并正在处理中。

如果您可以提取 2015 年 12 月 1 日之前的 SW 版本,请更新,这不会显示此特定问题。

希望这会有所帮助...

【讨论】:

对此的进一步说明 - VS 2015.1 中的汇编程序不会生成 YMM 兼容代码 - 例如,vmovdqu ymm0、mem256 将仅生成 XMM 兼容代码,因此将仅加载 128 位数据- MSFT 已收到通知并已确认 - 这只是为了防止其他程序员浪费时间调试

以上是关于在 Assembler 中调试 xmm 寄存器的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSE 将浮点值从 Assembler DLL 返回到 C++

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

如何在 xmm 寄存器中旋转压缩四字?

XMM 寄存器的按位取反

XMM 寄存器值

在气体宏中自动生成 xmm 寄存器名称?