来自 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
我正在尝试在 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