[Asembler] Problem z programem

Odpowiedz Nowy wątek
Belussi
2008-11-16 11:10
Belussi
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???

Pozostało 580 znaków

2008-11-16 12:06
Moderator

Rejestracja: 17 lat temu

Ostatnio: 7 godzin temu

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

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

Pozostało 580 znaków

Belussi
2008-11-16 12:08
Belussi
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]

Pozostało 580 znaków

2008-11-16 12:21

Rejestracja: 16 lat temu

Ostatnio: 4 lata temu

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.

Pozostało 580 znaków

Belussi
2008-11-16 12:24
Belussi
0

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

Pozostało 580 znaków

Belussi
2008-11-16 12:34
Belussi
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.

Pozostało 580 znaków

_asd
2008-11-16 15:02
_asd
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]

Pozostało 580 znaków

Belussi
2008-11-16 15:43
Belussi
0

Dzięki! Teraz już wszytko rozumiem ;)

Pozostało 580 znaków

Odpowiedz

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