Reputation: 2083
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?
Upvotes: 1
Views: 235
Reputation: 14409
As Frank pointed out, the format for NASM with MingW-GCC should be -f win32
.
I'm surprised that it works with BCC32 (version here: 5.8.2). There is a variable in the .text section that is accessed for writing by fstp dword [n]
. The .text section should not be writeable.
Insert the line
section .data use32 class=DATA
after ret
and
change
section .text use32
to
section .text use32 class=CODE
Upvotes: 1