FPU三角函数函数来自C ++

时间:2015-10-22 08:49:06

标签: c++ assembly masm fpu

我正在尝试在VS2013(Win10 x64)下使用FPU和 masm 来获得正弦和余弦。标题是:

#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

我花了一些时间来解决这个问题,但我不熟悉汇编语言,所以我不能赢得:/ 需要一些帮助!如果有人逐行解释它会很棒。

感谢。

1 个答案:

答案 0 :(得分:1)

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

更改两者

movsd   xmm0, QWORD PTR a$[rsp]

movsd   QWORD PTR a$[rsp], xmm0