Łączenie c++ z asemblerem

0

Cześć. Chciałbym napisać program w c++, którego jakaś funkcja będzie w asemblerze, np:

extern double sumuj (double liczba1, double liczba2);

Z tego co wiem, to należy skompilować oba programy (.cpp i .asm) do pliku .obj/.o, a następnie je zlinkować. Problem napotkałem już na początku, bo wyskakuje błąd: "undefined reference to sumuj." Wie ktoś może, jak można skompilować taki program? Jakby co, to używam GNU GCC w Codeblocks.

0

Może wystarczą Ci tzw.nagie funkcje? Wtedy nie będziesz musiał bawić się z linkerem.
(poszukaj pod kątem gcc naked fuctions)

1

C/C++ dodaje podkreślenie (domyślnie) do nazwy pliku, w assemblerze funkcja musi nazywać się: _sumuj

5

Zapewne chodzi o to o czym _13th_Dragon pisze, czyli o dodatkowe dekoracje.
Natomiast sam underscore nie wystarczy, chyba, że dodasz "C" przy deklaracji:

[code]
extern "C" double sumuj (double liczba1, double liczba2);
[/code]

Dodam jeszcze, że ten underscore to nie cecha C/C++, tylko kompilatorów pod Windowsem. W środowiskach typu GNU/Linux tego underscore w symbolach się nie dodaje (hmm, ale jeśli mnie pamięć nie myli, to pod OSX już tak).

Natomiast jeśli chcesz koniecznie zadeklarować sumuj w C++ (bez tego "C" tam), to musisz pamiętać o dekoracji symbolu (w C++, z uwagi możliwośc istnienia wielu funkcji o tej samej nazwie, ale z różnymi argumentami, typy argumentów są dodawane do symbolu).
W przypadku MinGW (z którego CB afair korzysta) będzie to:
[code]
__Z5sumujdd
[/code]
Schemat jest prosty:
2x underscore
liczba mówiąca o długości nazwy (w tym wypadku 5)
N znaków będących nazwą
Po czym oznaczenia typów parametrów (w tym wypadku 2x double to po prostu dd)
(przy czym to wszystko zależy od kompilatora - cos tam więcej na wiki o tym jest: https://en.wikipedia.org/wiki/Name_mangling - natomiast imo nie ma się co wczytywać; dużo łatwiej wygenerować plik obiektowy i wrzucić go w objdump albo IDA, i sprawdzić jakiego symbolu oczekuje)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.