I've got problem, I can compile these programs:
assembly program
;WZOR NA PI: 4 (1 - 1/3 + 1/5 - 1/7 + 1/9...) section .text use32 global _liczbae _liczbae: ; WZOR: e = 1 + (1^2/2!) + (1^3/3!) + (1^4/4!) + ... ; po wykonaniu push ebp i mov ebp, esp: ; [ebp] old EBP location ; [ebp+4] return point from procedure ; [ebp+8] the first parameter of the procedure, ; [ebp+12] the second parameter of the procedure push ebp mov ebp, esp ; ramka stosu finit ; inicjalizacja FPU fild dword [ebp+8] ; ładujemy int n do st0 ftst ; sprawdzamy czy n == 0 fstsw ax ; zapisujemy stan FPU do AX sahf ; wrzucamy rejestr AH do rejestru flag fstp dword [n] ; zapisujemy st0 pod adresem [n] i zrzucamy st0 ze stosu je koniec ; jezeli rozne to petla fld1 ; ładujemy 1.0f do st0 - silnia fld dword [podstawa] ; ładujemy wynik do st0 // fld1 ; ładujemy temp do st0 // petla: ; st2 = silnia - 1 ; st1 = wynik - 1 ; st0 = temp - 1 fld1 ; ładujemy 1.0f na stos faddp st3, st0 ; st3 = st3 + st0 i st0 zdejmujemy ze stosu (++silnia) fdiv st0, st2 ; temp = temp/silnia fadd st1, st0; wynik += temp fld dword [n] ; ładujemy wartość n na st0 fld1 ; ładujemy 1.0f do st0 fsubp ; st1 = st1 - st0 i st0 zdejmujemy ze stosu // n--; ftst ; sprawdzamy czy st0 (n--) jest równe 0 fstsw ax ; zapisujemy stan FPU do AX sahf ; wrzucamy rejestr AH do rejestru flag fstp dword [n] ; zapisujemy st0 pod adresem [n] i zrzucamy st0 ze stosu jne petla ; jezeli rozne to petla fxch st0, st1 ; wymieniamy st0 z st1 // temp = wynik, wynik = temp koniec: fld1 ; ładujemy wartośc 1.0f do st0 faddp st1, st0 ; wynik += 1.0f == wynik += x^0/0! lub gdy x == 0.0f to e^0 == 1.0f ; poprzednia linijka dodatkowo zdejmuje wartość st0 ze stosu leave ; usuwa ramke stosu ret ; wartosc zwracana to wartosc z rejestru st0 n: dd 0.0 podstawa: dd 1.0
I named file p4.asm
- c program:
#include <stdio.h>
extern float liczbae(int n);
int main()
{
int n = 6;
float wynik;
int wait = 0;
printf("Program liczy wartosc e z podana dokladnoscia");
printf("\n\nPodaj dokladnosc: ");
scanf("%d", &n);
wynik = liczbae(n);
printf("\ne = %f", wynik);
scanf("%d", &wait);
return 0;
}
I named file p2.c
now in nasm
i can compile it with Borland with following lines:
cd C:\Users\jaa\Desktop\assembler projekt 2
nasm p4.asm -f obj -o obj.obj
set path=C:\Borland\BCC55\Bin;%path%
bcc32 p2.c obj.obj
p2
but, when i compile using gcc
, with following lines:
cd C:\Users\jaa\Desktop\assembler projekt 2
nasm -f coff p4.asm -o plik.o
set path=%pah%;C:\mingw\bin
gcc p2.c -c -o plik1.o
gcc plik.o plik1.o -o plik.exe
plik.exe
runs, but it crashes when i type 11
and enter
but that error doesn't occur in nasm. I wonder why?