сборка — вызов тригонометрических функций FPU из переполнения стека

Я пытаюсь использовать 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

Я потратил некоторое время на борьбу с этой проблемой, но я не знаком с языком ассемблера, поэтому я не смог бы победить: /
Нужна помощь! И было бы здорово, если бы кто-то объяснил это построчно.

Благодарю.

0

Решение

Операнды для хранения xmm0 в неправильном порядке.

Изменить оба

movsd   xmm0, QWORD PTR a$[rsp]

в

movsd   QWORD PTR a$[rsp], xmm0
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]