problem z hybryda

0

Mam problem z programem hybrydowym część główna zrobiona jest w C++ a moduł dodatkowy zrobiony jest w asemblerze. W Dev-C++ i Visual studio nie chce mi go skompilować czy ktoś wie dlaczego ? Błąd jest np. taki
"1 C:\Dev-Cpp\include\c++\3.4.2\backward\iostream.h:31, from C:\asembler\c.cpp In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31, from C:\asembler\c.cpp"

Kod główny C++:

#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

extern "C" double zamien (char* mantysa, int przesuniecie, int Dzialanie, int znakLiczby);


char* podana = new char [1];
//tworzymy nowa strukture do ktorej bedziemy wczytywac znaki


void Wczytywanie_liczby () {
    
	int i = 0; // pozycja pobrania
    char znak = '\0'; // wartosc pierwotna zmiennej pobierajacej  
    
	int pozycjaE = -1; // -1 oznacza ze nie ma E
	int Kropka = 1; // 1 oznacza ze nie ma kropki
	
	//Struktura zawierajacac pelna pobrana liczbe
	//I do niej pomocnicza
	char* liczba = new char [1];
	char* nowa = new char [1];
	liczba [0] = '\0';

	while (znak != 13) {
    // Puki nie enter
     znak = getch();
    
         // Jesli znak jest cyfra, kropka, minusem lub E
		if (((znak >= '0') && (znak <= '9')) 
              || (znak == '-') || (znak == '.') 
              || (znak == 'e') || (znak == 'E')) {
                       
		    // Jesli minus to czy znajduje sie zaraz na poczatku czy zaraz za e
            if (znak== '-') {
		        if ((i != 0) && (pozycjaE != (i - 1))) continue;
			}
			
			// Jesli e to czy wystapilo po raz pierwszy - jesli tak ustal pozycje 
			if ((znak == 'e') || (znak == 'E')) {
				if (pozycjaE == -1)	{
					pozycjaE = i;
					Kropka = 0;
				} else continue;
			}
			
			
			// Jesli jest kropka to czy wystapila po raz pierwszy
			if (znak == '.')	{
				if (Kropka) {
					Kropka = 0;
				} else continue;
			}
			
			
			// Pobieraj znak i dodawaj do lancucha
			cout << znak;
			nowa = new char [i + 1];
			for (int licznik = 0; licznik < i; licznik++) nowa [licznik] = liczba [licznik];
			
            
            // Przesun wskaznik lancucha i skasuj stara liczbe zapamietujac nowa
			nowa [i] = znak;
			delete liczba;
			liczba = nowa;
			i++;
		}
	}

// Po pobraniu liczby przenosimy do nowej zmiennej (o jednej dluzszej)
// by mozna bylo ja zamknac pustym znakiem \0
	podana = new char [i + 1];
	for (int j = 0; j < i; j++)	podana [j] = liczba [j];

	cout<<endl;
	podana [i] = '\0';
	delete liczba;
// Tu sie konczy funkcja
}

int main ()
{
	system("cls");

    
    
	cout << "Podaj liczbe: " << endl;
	Wczytywanie_liczby(); // Wywolujemy funkcje wyzej i drukujemy co powstalo
	cout << "Wprowadzono liczbe:" << endl  << podana << endl;

	char* mantysa = new char [1]; // Nowa struktura do przechowywania czesci ulamkowej
	int iloscPrzesuniec = 0; // Zliczymy przesuniecia
	int Dzialanie = 0; // 0 - mnozenie, 1 - dzielenie
	int znak = 0; // 0 - plus, 1 - minus

	// Czy pierwszy znak naszej liczby jest minusem - jesli tak to zmienmy flage koncowa
    if (*podana == '-')	znak = 1;


    //wskaznik i strktura pomocnicza
	char* temp = podana;
	char* pomoc = new char [1];
	int dl = 0;
	
	//Przegladamy po znaku i puki temp nie wskazuje na pusty lub E
	while (*temp != '\0' && (*temp != 'e') && (*temp != 'E')) {
		
         // Jesli temp jest cyfra
         if ((*temp >= '0') && (*temp <= '9')) {
		    
		    //Pamietajac ze dlugosc poczatkowo jest 0
		    //zapamietujemy nowa mantyse
		    //znak po znaku 
            pomoc = new char [dl + 2];
			for (int x = 0; x < dl; x++) {
				pomoc [x] = mantysa [x];
			}


            //... uzupelniajac pomocnicza o znak pusty
			pomoc [dl] = *temp;//'\0';
			pomoc [dl + 1] = '\0';
			dl++;

            delete mantysa;
			mantysa = pomoc;
		}
		
        temp++;
	}
	
    //Jesli jednak temp jest E
	if ((*temp == 'e') || (*temp == 'E')) {
		//Przesunmy sie o jedno i zamienmy co zostalo na liczbe
        temp++;
		iloscPrzesuniec = atoi (temp);
		//Sprawdzamy czy to o co sie przesunelismy nie bylo minusem
		//Jesli tak to zmieniamy znak dla ilosci przesuniec
		if (*(--temp) == '-') iloscPrzesuniec = -iloscPrzesuniec;
	}
	
	
	//Wracamy z naszym pomocnicznym wskaznikiem znowu na poczatek podanej
    temp = podana;
    
    //i szukamy kropki lub konca liczby
	while ((*temp != '.') && (*temp != '\0')) {
		temp++;
	}
	
	// Po znalezieniue kropki wzgledem niej nanosimy poprawki na ilosc przesuniec
    if (*temp == '.') {
		char* pomocnicza = temp;
		pomocnicza++;
		while ((*pomocnicza >= '0') && (*pomocnicza <= '9')) {
			iloscPrzesuniec--;
			pomocnicza++;
		}
		temp = pomocnicza;
	}

	// Dopieramy dzialanie i wartosc bezwzgledna z ilosci przesuniec
    if (iloscPrzesuniec < 0) {
		Dzialanie = 1;
		iloscPrzesuniec = -iloscPrzesuniec;
	}
	
	
    // ------------------------------- WYDRUK KONCOWY --------------------------//
    cout << endl << endl;
	cout << "Analiza pobranej liczby:" << endl
	     << "------------------------";
	cout << "\nMantysa: " << mantysa
	     << "\nPrzesuniecia: " << iloscPrzesuniec
	     << "\nDzialanie: ";
		if( Dzialanie==1) cout<<"dzielenie "; else cout<<"mnozenie ";
                
    cout << "\nZnak: ";
		if(znak==1) cout<<"minus "; else cout<<"plus ";
        
        cout << endl << endl;
        
             cout << "===========================================" << endl;
             cout << "Liczba po zamianie: "
             << zamien (mantysa, iloscPrzesuniec, Dzialanie, znak)
             << endl;
             cout << "===========================================" << endl;
    // -------------------------------------------------------------------------//
	getch ();
	delete podana;
	return 1;
}

i moduł dodatkowy w asm:

;modul asemblerowy do zamiany liczby z ASCII na liczbe w postaci obliczeniowej, wykorzystujacy koprocesor

.model small, C
.stack
.data
	dziesiec dw 000Ah	;deklarujemy sobie zmienne, z ktorych bedziemy korzystali
	przes dd 10.0	    ;potrzebna jest dziesiatka, bedziemy potem przez nia dzielic i mnozyc
	minus dd -1.0	    ;oraz minus, jako minus jedynka, tez bedziemy przez nia, w miare koniecznosci mnozyc
	wynik dw ?
.code
public zamien
.486
zamien proc
	push bp	
	mov bp, sp
	push si		   ;odkladamy na stos wartosci rejestrow
	push ax
	push bx
	push di
	push dx
	mov si, [bp+4] ;pierwszy parametr, pierwsza 'litera' liczby
	fldz 		   ;ladujemy zero

	xor ax, ax	   ;zerujemy sobie rejestry
	xor cx, cx
	xor dx, dx
licz:
	cmp [si], byte ptr 00h	;petla, w ktorej pobrana liczbe, a wlasciwie mantyse sobie zamieniamy
	je koniec			    ;na wartosc obliczeniowa do dalszych operacji

	mov al, byte ptr [si]	
	sub ax, 30h
	mov wynik, ax
	fiadd wynik
	fimul dziesiec
	inc si
	jmp licz
koniec:
	inc cx

podzielenie:				 ;w zaleznosci od wartosci cx dzielimy liczbe przez 10 odpowiednia ilosc razy
	fidiv dziesiec
	dec cx
	jnz podzielenie

	xor cx, cx
	mov cx, [bp+6]		      ;sprawdzamy drugi parametr, czyli przesuniecie (przecinek)
	cmp cx, 00h
	jz koniec_przes
	xor si, si
	mov si, [bp+8]		      ;sprawdzamy czy mamy dzielic (liczba z przecinkiem, albo -E), czy mnozyc
	cmp si, 00h
	jne dziel
mnoz:						  ;mnozymy
	fmul przes
	dec cx
	jnz mnoz
	jmp koniec_przes
dziel:                        ;albo dzielimy, zalezy
	fdiv przes
	dec cx
	jnz dziel
koniec_przes:
	xor si,si
	mov si,[bp+10]            ;pobieramy ostatni parametr, ujemnosc albo dodatniosc liczby
	cmp si,00h	  			  ;zamieniamy ja zatem jesli trza
	je dod
	fmul minus
dod:
	pop dx
	pop di
	pop bx
	pop ax
	pop si
	pop bp
	ret
zamien endp
end

Z góry dziekuję za odpowiedź.

0

zacznij od wklejenia prawdziwego, calego, niezniszczonego i oryginalnie sformatowanego komunikatu bledu

0

no to będą takie błędy:
3 C:\Dev-Cpp\include\c++\3.4.2\backward\iostream.h:31, from C:\Users\Michal\Desktop\Tc\BIN\c.cpp In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31, from C:\Users\Michal\Desktop\Tc\BIN\c.cpp

3 C:\Users\Michal\Desktop\Tc\BIN\c.cpp from C:\Users\Michal\Desktop\Tc\BIN\c.cpp

32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.

[Linker error] undefined reference to `zamien'

32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h ld returned 1 exit status

Słyszałem jeszcze że w Turbo C++ można to odpalić ale nie wiem dokładnie jak to zrobić ...

0

warning -- uzywasz niewlasciwego include'a. przeczytaj warning, dowiesz sie jak go poprawic

linker error - masz gdzies zdefiniowana forward-declaration funkcji "zamien", i jest ona uzywana przez jakis inny kod, natomiast linker NIE znalazl CIALA tej funkcji. sprawdz czy nie pomieszales sygnatur miedzy deklaracja a definicja tejże - oraz, czy nie zapomniales jej po prostu napisac

i popraw temat, bo jak zajrze nastepnym razem i bedzie tak samo malo mowiacy, to watek poleci do kosza

1 użytkowników online, w tym zalogowanych: 0, gości: 1