在 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 寄存器的主要内容,如果未能解决你的问题,请参考以下文章