c/c++语言开发共享fstcw程序集操作数类型不匹配

我试图在C中的内联汇编中使用指定的舍入模式对输入double进行舍入。为此,我需要使用“fstcw”获取FPU控制字,然后更改字中的位。 不幸的是我在第一行遇到错误:

double roundD(double n, RoundingMode roundingMode) { asm("fstcw %%ax n" ::: "ax"); //clobbers return n; } 

我收到的汇编程序错误是:

“错误:’fstcw’的操作数类型不匹配。”

我的印象是这个代码片段应该在AX寄存器中存储FPU控制字,长度为16位,长度也是16位。 为了确保,我还使用EAX寄存器而不是AX测试了上述代码,并收到了同样的错误。

我可能会在这里失踪什么? 如果需要任何进一步的信息,请告诉我。

    fstcw仅适用于内存目标操作数,而不适用于寄存器。

    也许你正在与fnstsw混淆, fnstsw有一个单独的forms(单独的操作码),其中目的地是AX而不是寻址模式。

    这需要基于FP比较结果(在fcomi之前比较存在的EFLAGS之前)有效地分支,这比使用控制字的任何事情更频繁地发生。 这就是为什么有一个AX目标版本的fnstsw而不是fnstcw


    顺便说一句,您可以使用C. #include 设置舍入模式

    或者更好的是,如果SSE4.1可用,则使用roundsd (或内在)使用自定义舍入模式进行一次舍入,而不设置/恢复SSE舍入模式(在MXCSR中,完全独立于x87舍入模式)。

      以上就是c/c++开发分享fstcw程序集操作数类型不匹配相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522258.html

      (0)
      上一篇 2020年12月9日
      下一篇 2020年12月9日

      精彩推荐