Я пытаюсь использовать FPU с MASM под VS2013 (Win10 x64), чтобы получить синус и косинус. Заголовок:
#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 ++.
В то время как первая функция работает должным образом, и я действительно получаю значения Corrent через параметры по ссылке, но две другие функции дать плохие результаты. Файл .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
Других решений пока нет …