fstcw 汇编操作数类型不匹配

2024-04-21

我正在尝试使用 C 中的内联汇编中指定的舍入模式对输入双精度舍入进行舍入。为此,我需要使用以下命令获取 FPU 控制字fstcw然后更改字中的位。不幸的是我在第一行遇到了错误:

double roundD(double n, RoundingMode roundingMode) {
    asm("fstcw      %%ax       \n"

        ::: "ax");      //clobbers

    return n;
}

我收到的汇编错误是:

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

我的印象是这个代码片段应该将 FPU 控制字(长度为 16 位)存储在AX寄存器,长度也是16位。为了确定,我还使用以下命令测试了上面的代码EAX注册而不是AX,并收到相同的错误。

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


fstcw https://github.com/HJLebbink/asm-dude/wiki/FSTCW_FNSTCW(控制字)仅适用于内存目标操作数,不适用于寄存器。

也许你正在混淆fstsw https://github.com/HJLebbink/asm-dude/wiki/FSTSW_FNSTSW(状态字)具有单独的形式(单独的操作码),其中目标是 AX,而不是由寻址模式指定。

这有助于根据 FP 比较结果有效地进行分支(之前fcomi https://github.com/HJLebbink/asm-dude/wiki/FCOMI_FCOMIP__FUCOMI_FUCOMIP与存在的 EFLAGS 进行比较),这种情况比控制字发生的情况更频繁。这就是为什么有 AX 目标版本的原因fnstsw但不是fnstcw.


顺便说一句,您可以使用 C 设置舍入模式。#include <fenv.h> http://en.cppreference.com/w/c/numeric/fenv/FE_round

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fstcw 汇编操作数类型不匹配 的相关文章

随机推荐