我正在尝试在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
我花了一些时间来解决这个问题,但我不熟悉汇编语言,所以我不能赢得:/ 需要一些帮助!如果有人逐行解释它会很棒。
感谢。
答案 0 :(得分:1)
存储xmm0
的操作数顺序错误。
更改两者
movsd xmm0, QWORD PTR a$[rsp]
到
movsd QWORD PTR a$[rsp], xmm0