来自 C++ 的 FPU 三角函数调用

FPU trigonometry functions calls from C++

我正在尝试在 VS2013 (Win10 x64) 下将 FPU 与 masm 一起使用以获得正弦和余弦。 header 是:

#pragma once

extern "C" double fpu_sincos(const double a_d_angle, double& a_sin, double& a_cos);

extern "C" double fpu_sin(const double a_d_angle);

extern "C" double fpu_cos(const double a_d_angle);

这些函数从常规 Visual C++ 代码中调用。 虽然第一个函数正常工作并且我确实通过引用参数获得了正确的值,但其他两个函数 给出了错误的结果 。 .asm 文件包含:

    PUBLIC  fpu_sincos
    PUBLIC  fpu_sin
    PUBLIC  fpu_cos

    _TEXT   SEGMENT
    a$ = 32
    fpu_sincos PROC
        movsd   QWORD PTR [rsp+8], xmm0
        sub rsp, 24
        fld QWORD PTR a$[rsp]
        fsincos
        fstp QWORD PTR [r8]
        fstp QWORD PTR [rdx]
        add rsp, 24
        ret 0
    fpu_sincos ENDP
    _TEXT   ENDS

    _TEXT   SEGMENT
    a$ = 8
    fpu_sin PROC
        movsd   xmm0, QWORD PTR a$[rsp]
        fld QWORD PTR a$[rsp]
        fsin
        fstp QWORD PTR a$[rsp]
        movq    xmm0, QWORD PTR a$[rsp]
        ret 0
    fpu_sin ENDP
    _TEXT   ENDS

    _TEXT   SEGMENT
    a$ = 8
    fpu_cos PROC
        movsd   xmm0, QWORD PTR a$[rsp]
        fld QWORD PTR a$[rsp]
        fcos
        fstp QWORD PTR a$[rsp]
        movq    xmm0, QWORD PTR a$[rsp]
        ret 0
    fpu_cos ENDP
    _TEXT   ENDS

    END

我花了一些时间来解决这个问题,但我不熟悉汇编语言,所以我无法获胜:/ 需要一些帮助!如果有人逐行解释就太好了。

谢谢。

存储xmm0的操作数顺序错误。

两者都改

movsd   xmm0, QWORD PTR a$[rsp]

movsd   QWORD PTR a$[rsp], xmm0