[Asembler][NASM]FATAL unsuported 16 bit segment(s) in module

kejkun7
Użytkownik
Użytkownik
Posty: 405
Rejestracja: 24 lip 2012, o 23:16
Płeć: Mężczyzna
Lokalizacja: hmm ?
Podziękował: 147 razy
Pomógł: 2 razy

[Asembler][NASM]FATAL unsuported 16 bit segment(s) in module

Post autor: kejkun7 »

używam NASM wraz z BORLAND c++ 5.5.1 , do którego dołączyłem wraz z instrukcją/ jak na zajeciach ... et-started
down vote
**create two file inside C:Borlandcc55in

edit its info with following** in file BCC32.cfg

-I"c:BorlandBcc55include"

-L"c:BorlandBcc55lib"
Create another file with name ILINK32.cfg

-L"c:BorlandBcc55lib"
"
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: Zaznacz cały

 
#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
 uzytkownika,podobnie jak dokladnosc obliczenia.
");
	printf("
Podaj wartosc X: ");
	scanf("%f",&a);
	
		{ printf("zle dane");}
	printf("Dokladnosc: ");
	scanf("%i",&b);
	printf("Wartosc funkcji Sinus(%f) = %f
", a, sinus(a, b));
	
	return 0;
}

nazwa: p2.asm

Kod: Zaznacz cały

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:UsersjaaDesktopinfaarchitekturaprojekt2mo je takie
nasm p2.asm -f obj -o obj.obj
set path=%pah%;C:BorlandBCC55in
bcc32 p2.c obj.obj
p2


teraz uzywam:
cd C:UsersjaaDesktopinfaarchitekturaprojekt2moje takie
set path=%pah%;C:mingwin
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????
Ostatnio zmieniony 5 sty 2014, o 18:04 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[Asembler][NASM]FATAL unsuported 16 bit segment(s) in module

Post autor: vpprof »

Nie wiem, ale być może program w assemblerze używał instrukcji odnoszących się do 16-bitowych procesorów, jakieś operacje na 16-bitowych rejestrach, AX zamiast EAX itd. Teraz działa, bo być może (tzn. na pewno, bo nie sądzę, żebyś to pisał na 8086 ) 16-bitowa architektura jest emulowana przez bcc32.

Nie wiem, bo ostatni raz mnemoniki assemblera widziałem… na pewno w poprzednim stuleciu. A w ogóle na jakich studiach tak męczą pisaniem funkcji sinus w asm?
ODPOWIEDZ