Pokaż wyniki 1 do 1 z 1

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

  1. #1
    Zarejestrowany
    Jan 2014
    Postów
    4

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

    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
    Ostatnio edytowane przez yami : 01-05-2014 - 19:17

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj