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舍入模式)。