[Asembler] - problem z dll.

wojtala6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Witam mam oto taki problem. Napisałem sobie funkcję w dll z wykorzystanie SSE2.

Kopiuj
dividePolynomial proc tabTemp: DWORD,n: DWORD, divisor:REAL8

	mov ecx,[n]
	mov esi,tabTemp
	mov ebx,ecx     ; w EBX liczba wezlow
	shr ecx,1		; przetwarzanie po 2 wezly
	mov edx,ecx     ; EDX = ECX/4
	movhpd xmm0,[divisor]
	movlpd xmm0,[divisor]
	petla:
	movupd xmm1,[esi]
	divpd  xmm1,xmm0
	movupd [esi],xmm1
	add esi,16
	loop petla
	mov eax,tabTemp

ret
dividePolynomial endp

I wyskakuje mi oto taki błąd podczas powrotu z funkcji i nie wiem czemu.

user image

02
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1176
0

Jedyne miejsce gdzie mozesz sobie nadpisac stos to:
movupd [esi],xmm1
Poza tym powinienes zachowac i na koniec odtworzyc wartosci wszystkich modyfikowanych rejestrow zgodnie z calling convention, ktorej uzywasz.

02
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1176
0

shr ecx,1 ; przetwarzanie po 2 wezly
mov edx,ecx ; EDX = ECX/4

Poza tym zgodnie z komentarze powinno byc shr ecx,2

wojtala6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Nie bo ja ładuje po dwie wartości. Już rozwiązałem problem, wystarczyło dać w miejscu gdzie wywołuje funkcje

Kopiuj
typedef DWORD (__stdcall*MYPROC1)(int*, int,int);

zamiast:typedef DWORD (MYPROC1)(int, int,int);

Kopiuj
.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.