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ź.