Kilkakrotnie poruszano na łamach działu "Dla praktyków" problem łączenia kodu, napisanego w asemblerze, z kodem napisanym w C przy pomocy środowiska DJGPP. Ściślej mówiąc znalazłem na ten temat dwa artykuły tej samej treści i pod tym samym tytułem, choć innych autorów ("DJGPP i asembler" p. Tomasza Cejnera - PCkurier 20/96 oraz "DJGPP i asembler" p. Konrada Kamińskiego - PCkurier 06/98). Na czym polega problem? Otóż, są dwie drogi łączenia asemblera z C w środowisku DJGPP. Pierwszą z nich jest nauka składni jaką posługuje się asembler AS wchodzący w skład pakietu DJGPP, jest to dość niewygodne rozwiązanie, ze względu na to, iż semantyka AS oparta jest na standardzie AT&T, a więc jest zupełnie odmienna od tej stosowanej w najpopularniejszych asemblerach (MASM/TASM). Drugim rozwiązaniem jest znalezienie programu, który "rozumie normalną składnię" i produkuje pliki obiektowe typu COFF, bo takimi właśnie posługuje się DJGPP.
Autorzy obu wspomnianych na wstępie artykułów proponują do tego celu asembler Microsoftu, czyli MASM, bowiem potrafi on skompilować kod do formatu COFF. Rozwiązanie takie nie wydaje się jednak najszczęśliwsze, jeżeli weźmiemy pod uwagę ideę i sens istnienia takich programów jak DJGPP i innych rozpowszechnianych na zasadzie licencji GNU, czyli za darmo, a bardzo często także z udostępnieniem kodu żródłowego, co pozwala doswiadczonemu programiście na ulepszanie i dostosowywanie programu, początkującemu zaś naukę tej trudnej sztuki. Któż jednak chciałby rozpowszechniać za darmo coś w co musiał sam zainwestować, a tak niestety jest jeżeli decydujemy się na MASM, który w przeciwieństwie do DJGPP nie jest udostępniany za darmo. Poza tym wielu programistów ma swój ulubiony asembler (np. TASM) i nie ma ochoty z niego rezygnować.
Okazuje się, że rozwiązań należy szukać właśnie wśród wyżej wspomnianych programów GNU. Ja znalazłem co najmniej trzy programy, które są w stanie sprostać zadaniu będącemu tematem tego artykułu. I chociaż prawdę mówiąc tylko ostatni z nich uważam za godny polecenia, to jednak przedstawiam je wszystkie, aby czytelnikowi pozostawić prawo wyboru.
Wszystkie poniższe propozycje dostępne są w sieci Internet. Pierwszą z nich jest asembler NASM, który można ściągnąć z ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/nasmXXX.zip, gdzie XXX jest numerem wersji i może ulegać zmianom. Składnia tego asemblera jest identyczna ze składnią TASM, ale posiada on własny zestaw dyrektyw. Oznacza to, że używanie go wymaga nieco nauki, chociaz mniej niż w przypadku nauki składni AS. Jeżeli jednak nie mamy zamiaru zaśmiecać sobie głowy nowymi informacjami to powinniśmy skorzystać z narzędzi do konwersji, np. program ta2as (ang. tasm to as) dostępny w serwisie ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2as.zip, służący do konwersji kodu TASM na kod AS. Korzystanie z tego programu wymaga jednak minimalnej znajomości AS, gdyż ta2as nie jest wolny od błędów i trzeba "patrzeć mu na ręce". Najlepszym rozwiązaniem jakie udało mi się znaleźć jest konwerter plików obiektowych DOS (*.obj) na pliki obiektowe UNIX'a, czyli pliki formatu COFF (a.out, *.o). Program ten nazywa się o2c (ang. object to coff), a ściągnąć go można z ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/o2c.zip. Dzięki niemu nie musimy rozstawać się z naszym ulubionym asemblerem, pod warunkiem jednak, że obsługuje on model pamięci FLAT (DJGPP jest kompilatorem 32-bitowym), co więcej możemy łączyć z DJGPP nie tylko fragmenty programu napisane w asemblerze, ale także w każdym innym języku, o ile kompilator tego języka produkuje pliki w formacie *.obj.
Jako przykład zastosowania tego programu zamieszczam poniżej trywialną bibliotekę obsługi myszy wykorzystującą przerwanie 33h, napisaną zgodnie ze składnią TASM. Plik mouse.asm należy skompilować poleceniem:
tasm.exe /MX mouse.asm
Przełącznik /MX nakazuje asemblerowi rozróżnianie małych i wielkich liter. Następnie konwertujemy powstały w wyniku kompilacji plik mouse.obj na plik formatu COFF:
o2c.exe mouse.obj
Ostatnim krokiem jest konsolidacja powstałego pliku mouse.o z programem demonstracyjnym demo.cc:
gcc demo.cc mouse.o
Stronę opracował Michał Szulowski