[Asembler] Problem z programem

0

Mam napisać program w ASM i C, który obliczy mi wartość funkcji liniowej dla zadanego argumentu i współczynnika kierunkowego:

Kod w C:

#include <stdio.h>

float wartosc2=0;

void liniowa(float arg, float wsp,float* wartosc);

float funkcja(float arg, float wsp){
	liniowa(arg, wsp, &wartosc2);
	return wartosc2;
}


int main() {

	float i;
	float wsp;

	scanf("%f", wsp);

for(i=0;i<7;i++){
	printf("%f \n",funkcja(i, wsp));
}


return 0;

}

Kod w Ameblerze

.686
.model flat
public _liniowa
.data
.code

_liniowa PROC
			push	ebp
	        mov		ebp, esp
	        

			
			mov esi, [ebp+8]; przechowuje argument
			mov edi, [ebp+16]; pzrechowuje współczynnik a
			mov edx, [ebp+24]; wskaźnk na wynik
			
			finit
			
			fld qword PTR [esi] 
			fld qword PTR [edi]
			
			fmul st(1), st(0)
			
			fstp qword PTR [edx]
	

	    pop		ebp
	ret
_liniowa ENDP

END

Niby wszystko ładnie się kopliluje. Ale po podaniu danej (tzn po wykonaniu scanfa), włącza mi się Just-In-Time-Debugger (Korzystam z Visual Studio 2008) z takim komunikatem: An unhandled win32 exception occured in liniowa.exe [5676]`

Co mam źle???

0
scanf("%f", &wsp); 

Nie powinno być? "&" jest istotny z tego co pamiętam z C.

0

Tak powinno, ale to nie to ;) Zobaczylem ze nie mam '&' dopiero po napisaniu posta. Poza tym kod w C jest raczej dobrze. Debugger zatrzymuje mi sie na lini:

 fld qword ptr [esi]
0

Upewnij się czy nie masz dwa razy push ebp. PROC wstawia jednego push, a Ty jeszcze jednego?
Poza tym, qword możesz użyć jeżeli pobierasz/zwracasz double. Float ma 4 bajty - wstaw dword.

I jeszcze jedno - zachowaj esi i edi jeżeli już ich użyłeś, a tak na przyszłość - ebx też.
Lub zamiast nich, użyj eax,ecx i edx. Chyba wiesz że jest reguła mówiąca by funkcja nie niszczyła wybranych rejestrów i flagi kierunku.

0

Czyli dla float co mam użyć???

0

W asm jestem początkujący.

Możesz mi ten kod przeredagować tak, żeby działał. Chyba tylko wtedy będę w stanie zrozumieć co jest źle.

0
                        fld qword PTR [esi]
                        fld qword PTR [edi]
                       
                        fmul st(1), st(0)
                       
                        fstp qword PTR [edx]

fld qword ptr [esi] /[edi] pobiera wartość z adresu który jest w ESI/EDI - a ty tam masz WARTOŚĆ nie adres. drugie wartości jakie Cie interesują to float, wiec zamiast qword użyj dword.
generalnie :

fld dword ptr[ebp+8]
fld dword ptr[ebp+12]
fmul st(1),st(0)
fstp dword ptr[ebp+16]
0

Dzięki! Teraz już wszytko rozumiem ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1