Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

assembler FATAL: unsuported 16 bit segment(s) in module p2.asm

Ostatnio zmodyfikowano 2014-01-05 17:25
Autor Wiadomość
kejkun
Temat założony przez niniejszego użytkownika
assembler FATAL: unsuported 16 bit segment(s) in module p2.asm
» 2014-01-05 17:25:29
używam NASM  wraz z BORLAND c++ 5.5.1 , do którego dołączyłem wraz z instrukcją/ jak na zajeciach http://stackoverflow.com/questions/1147337/borland-cant-compile-what-is-going-on-i-cant-even-get-started

http://stackoverflow.com​/questions/1147337​/borland-cant-compile-what-is-going-on-i-cant-even-get-started"
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

#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

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\moje 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????
P-101259
« 1 »
  Strona 1 z 1