używam NASM wraz z BORLAND c++ 5.5.1 , do którego dołączyłem wraz z instrukcją/ jak na zajeciach c++ - Borland Can't Compile, what is going on, I can't even get started - Stack Overflow
down vote
**create two file inside C:\Borland\bcc55\bin
edit its info with following** in file BCC32.cfg
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
Create another file with name ILINK32.cfg
-L"c:\Borland\Bcc55\lib"
"
Mam do zrobienia projekt, chcialem analizować podobny przykład, który znalazłem, jednakże nie mogę go skompilować poprzez błąd
opisany w tytule tematu.
Projekt z zajęc działa i się dobrze kompiluje więc to nie wina kompilatora. ( jednakże ten nie chcę sie skompilować)
Ząłączam plik w c oraz assemblerze:
nazwa: p2.c
Kod:
#include <stdio.h>
extern float sinus(float x, int dokladnosc); //deklaracja funkcji zewnętrznej
int main()
{
float a;
int b;
printf("1.Napisz program, ktory oblicza sin(x), gdzie x jest argumentem podanym przez\n uzytkownika,podobnie jak dokladnosc obliczenia.\n");
printf("\nPodaj wartosc X: ");
scanf("%f",&a);
{ printf("zle dane");}
printf("Dokladnosc: ");
scanf("%i",&b);
printf("Wartosc funkcji Sinus(%f) = %f\n", a, sinus(a, b));
return 0;
}
nazwa: p2.asm
Kod:
section .text ;do wykonania dla procesora
global _sinus ;definicja funkcji sinus,która jest odwoływana w pliku C
_sinus:
push ebp ;przenies na stos
mov ebp, esp ;przenieś esp do ebp
finit ;inicjalizacja
fldz ;załaduj 0 do zamian i wyniku
fild dword [ebp+12] ;załaduj drugi argument funkcji (ilosc iteracji)
fld dword [ebp+8] ;załaduj pierwszy argument fukcji
odejmij:
fldpi ;ładuje pi
fld1 ;ładuj +1
fld1 ;ładuj +1
faddp ;dodaj
fmulp ;mnozenie st0 z st1
fcomp ; x ? 2*pi ;porownaj
fstsw ax ;zapis stanu porownania do ax
sahf ;zapisz ah we flagach
ja nie_odejmuj ;skok
fldpi ;ładuje pi
fld1 ;ładuj +1
fld1 ;ładuj +1
faddp ;dodaj st0 z st1
fmulp ;mnozenie st0 z st1
fsubp st1, st0 ;odejmowanie
jmp odejmij ;skok
fxch ;zamien
nie_odejmuj:
fldpi ;ładuj pi
fcomp ; x ? pi ;porównaj
fstsw ax ;zapis stanu porownania do ax
sahf ;zapisz ah we flagach
ja nie_odejmuj2 ;skok
fldpi ;ładuj pi
fsubp st1, st0 ;odejmij
fld1 ;ładuj +1
fchs ; +/-
fstp dword [mnoznik]
nie_odejmuj2:
fadd st2,st0 ;dodaj st2 z st0
petla: ;procedura pętli
;najpierw liczone jest 2i+1
fld1 ;ładuj +1
fld1 ;ładuj +1
fmul st0,st3 ;pomnóż st0 przez st3,
fld1 ;ładuj +1
fld1 ;ładuj +1
faddp st1,st0 ;dodawanie st1 z st2
fmulp st1,st0 ;mnozenie st1 z st0
fld1 ;ładuj +1,0
faddp st1,st0 ;dodaj st1 z st0 i zdjęcie ze stosu
potega_i_silnia:
fxch st2 ;zamiana st(0) z st(2)
fmul st1,st0 ;mnozenie st(1) z st0
fxch st2 ;zamiana st(0) z st(2)
fdiv st1,st0 ;dzielenie st1 z st0
fld1 ;ładuje +1
fsubp st1,st0 ;odejmowanie st1 z st0
ftst ;st0 porownywane jest z 0
fstsw ax ;zapis stanu porownania do ax
sahf ;kopiowanie ah do rejestru flag
jg potega_i_silnia ;skok,jeśli większe lub równe
fld1 ;ładuje +1
faddp st1,st0 ;dodaj st1 z st0
fmul st0,st3 ;mnozenie st0 z st3
fld1 ;ładuje +1
;fxch st2
minusjeden:
fchs ;zmiana znaku st(0)
fxch st1 ;zamiana st(0) z st(1)
fld1 ;ładuje +1
fsubp st1,st0 ;odejmowanie odwrócone i+(-1) i zdjęcie ze stosu
ftst ;st0(licznik i) porownywane jest z 0
fstsw ax ;zapis stanu porownania do ax
fxch st1 ; ustawianie znaku -/+ na st0
sahf ;zapisz ah we flagach
jg minusjeden ;skok,jeśli większe lub równe
fmulp st2,st0 ; -/+ * potega/silnia
faddp st3,st0 ;0+0, wyraz na st0 (3) st1=x st2=i
faddp st3,st0 ;wyliczony wyraz z szeregu dodaje do wyniku, czyli na sam koniec stosu
fxch st1 ;zamiana st(0) z st(1)
fld1 ;ładuj +1
fsubp st1,st0 ;i-1 do glownej petli
ftst ;iteracje przyrownuje do 0
fstsw ax ;zapis stanu porownania do ax
fxch st1 ;zamiana st(0) z st(1)
sahf ;zapisz ah we flagach
jg petla ;skok,jeśli większe lub równe
koniec: ;koniec programu,powrót do C
fxch st2 ;zamień st0 z st2
fld dword [mnoznik]
fmulp
leave ;wyjście
ret ;bliski powrót z procedury
section .data
mnoznik: dd 1.0
byłbym bardzo wdzięczny gdyby ktoś wskazał mi błąd, który uniemożliwia kompilacje, co umożliwiłoby mi bazowanie na dobrym przykładzie.
(mam exe) stąd widziałem, że program działał .
edit*
z kompilacją już sobie poradziłem,
uzywalem linii:
linie jakich używam na zajęciach, aby skompilować w nasmie to:
cd C:\Users\jaa\Desktop\infa\architektura\projekt2\mo je takie
nasm p2.asm -f obj -o obj.obj
set path=%pah%;C:\Borland\BCC55\bin
bcc32 p2.c obj.obj
p2
teraz uzywam:
cd C:\Users\jaa\Desktop\infa\architektura\projekt2\mo je takie
set path=%pah%;C:\mingw\bin
gcc p2.c -c -o plik1.o
gcc plik.o plik1.o -o plik.exe
i działa się kompiluje ładnie, umiałby ktoś wytłumaczyć czemu wcześniej nie chciało, a teraz juz działa