Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

C::B + zewnętrzny moduł w asemblerze



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Glinka
Gość





PostWysłany: Pon Maj 27, 2013 4:36 pm  OP    Temat postu: C::B + zewnętrzny moduł w asemblerze Odpowiedz z cytatem Pisownia

Heya,
Mam napisać program hybrydowy, tzn. część w języku wysokiego poziomu (C++) i część w j. niskiego poziomu (asemblerze). Na razie wziąłem sobie kod z Wikipedii by zobaczyć jak to w ogóle działa (i czy działa).
asembler:
Kod:
section .text

global sumuj

sumuj:
        ;WPROWADZENIE:
        ;[EBP+12] - pierwszy argument od prawej
        ;[EBP+8] - drugi od prawej
        ;[EBP+4] - adres powrotu z funkcji
        ;[EBP] - stara wartość EBP

        ;PRZYKŁAD DEKLARACJI FUNKCJI W C++ (przy linkowaniu statycznym)
        ;int sumuj(int a, int b), zatem:
        ;[EBP+12] = b
        ;[EBP+8]  = a

        push ebp         ; tworzymy ramkę stosu
        mov ebp,esp      ; niech EBP ma teraz wartość ESP

        mov eax,[ebp+12] ; EAX=b
        add eax,[ebp+8]  ; EAX=EAX+a , zatem ostatecznie EAX=a+b

        mov esp,ebp      ; niszczmy ramkę
        pop ebp          ; przywróć starego EBP
        ret              ; koniec funkcji
; zwracana wartość funkcji przekazywana jest do programu poprzez rejestr EAX

section .data
napis db "<<<FUNCJA SUMUJ>>>",0Ah
offset equ $ - napis


c++
Kod:

#include <iostream>
using namespace std;

extern "C" unsigned int sumuj (unsigned int, unsigned int);


int main()
{
unsigned int a,b;

        cout<<"Podaj liczbe a: ";
        cin>>a;

        cout<<"Podaj liczbe b: ";
        cin>>b;



        cout<<"Wynik dodawania to: "<<sumuj(a,b)<<endl;

        return 0;
}



Używam C::B. Stworzyłem nowy konsolowy projekt, dodałem pliki do projektu i skompilowałem i dostałem takie błędy:
-------------- Build: Debug in arch1-4 (compiler: GNU GCC Compiler)---------------
mingw32-gcc.exe -Wall -fexceptions -g -c D:\programy\szkola\AK\arch1-4\funkcja.asm -o obj\Debug\funkcja.o
mingw32-gcc.exe: warning: D:\programy\szkola\AK\arch1-4\funkcja.asm: linker input file unused because linking not done
mingw32-g++.exe -o bin\Debug\arch1-4.exe obj\Debug\funkcja.o obj\Debug\main.o
mingw32-g++.exe: error: obj\Debug\funkcja.o: No such file or directory
Process terminated with status 1 (0 minutes, 0 seconds)
1 errors, 1 warnings (0 minutes, 0 seconds)

Poszperałem troszkę i w instrukcji C::B znalazłem taki zapis (http://www.bt4.pl/dokumentacje/srodowiska-programistyczne/code-blocks/r1/)
Cytat:
1.9. Dołączanie plików asemblera

W oknie Management widoku projektu pliki asemblera znajdują się w kategorii ASM Sources. Użytkownik może zmienić porządkowanie plików w kategoriach (zobacz 1.1). Kliknięcie prawym przyciskiem myszy pliku asemblera spowoduje wyświetlenie menu kontekstowego. Kliknij w nim opcję Properties (właściwości), aby otworzyć nowe okno. Następnie przejdź na kartę Build (kompilacja) i zaznacz pola wyboru Compile file (plik kompilacji) i Link file (plik konsolidacji). Później przejdź na kartę Advanced (zaawansowane) i wykonaj następujące czynności:

W polu Compiler variable wpisz wartość CC
Wybierz kompilator z listy rozwijanej For this compiler
Zaznacz pole wyboru Use custom command to build this file
W polu tekstowym poniżej wpisz: $compiler $options $includes <asopts> -c $file -o $object

Zmienne CodeBlocks są oznaczone znakiem $ (zobacz podrozdział 3.4). Są one ustawiane automatycznie, dzięki czemu samodzielnie trzeba tylko zmienić opcję asemblera <asopt>.

Zrobiłem tak i tym razem dostałem takie coś:
-------------- Build: Debug in arch1-4 (compiler: GNU GCC Compiler)---------------
mingw32-gcc.exe -Wall -fexceptions -g <asopts> -c D:\programy\szkola\AK\arch1-4\funkcja.asm -o obj\Debug\funkcja.o
mingw32-gcc.exe: error: <asopts>: Invalid argument
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings (0 minutes, 0 seconds)

Może ktoś nakierować czy robię coś źle albo gdzie szukać??
Powrót do góry
BiTi22



Dołączył: 20 Sty 2006
Posty: 165
Skąd: Pruszków

PostWysłany: Pon Maj 27, 2013 4:46 pm      Temat postu: Odpowiedz z cytatem Pisownia

Wpisałeś wprost
Cytat:
<asopt>
?

W zacytowanym przez Ciebie fragmencie jest wyraźnie napisane
Cytat:
samodzielnie trzeba tylko zmienić opcję asemblera <asopt>
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Glinka
Gość





PostWysłany: Pon Maj 27, 2013 4:51 pm  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Y.. racja
Ok, to teraz drugie pytanie gdzie mam to dokładnie wpisać?? o0
Powrót do góry
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.11535 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |