Сборка — Возвращение значения с плавающей запятой из библиотеки Assembler DLL в C ++ с использованием SSE.

У меня проблема с возвратом значения с плавающей точкой из DLL Assembler в программу на C ++. Я полагаю, что это должно быть обработано в регистре xmm0, я не прав? Вот основной файл:

#include "stdafx.h"#include<windows.h>
#include<iostream>
#include <cstdio>
#include <thread>
#include <vector>
using namespace std;

extern "C" float _stdcall MyProc1(float begin, float end, float x2 ,float x1, float x0);    //dll assembler

int main(int argc, _TCHAR* argv[])
{
float suma=0;
suma = MyProc1(12.75,9.3,0,0,1);
cout << std::hex<< suma << endl;
getchar();
return 0;
}

и вот моя сборка DLL:

.686p
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
INCLUDE C:\masm32\include\windows.inc
.mmx
.xmm

.DATA
pi dd 3.14159265358979 ; constant

.CODE

DllEntry PROC hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry ENDPMyProc1 proc b:DWORD, e:DWORD, x2: DWORD, x1: DWORD, x0:DWORD

movss xmm0,[b]
ret

MyProc1 endp

END DllEntry

и возвращаемое значение -1. ​​# IND, почему?

2

Решение

Это очень специфично для компилятора, но я предполагаю, что вы используете 32-битный компилятор Microsoft.

В этом случае, поскольку вы определили свою функцию для возврата числа с плавающей запятой, вам нужно, чтобы результат был помещен в верхнюю часть стека с плавающей запятой.

Проверьте вывод сборки вашего кода C ++, чтобы убедиться в этом — вы должны увидеть fst или же fstp инструкция после вызова функции.

1

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

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

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