Asembler/C

Asembler za darmo

Marcin Kos

Kilkakrotnie poruszano na amach dziau "Dla praktykw" problem czenia kodu, napisanego w asemblerze, z kodem napisanym w C przy pomocy rodowiska DJGPP. cilej mwic znalazem na ten temat dwa artykuy tej samej treci i pod tym samym tytuem, cho innych autorw ("DJGPP i asembler" p. Tomasza Cejnera - PCkurier 20/96 oraz "DJGPP i asembler" p. Konrada Kamiskiego - PCkurier 06/98). Na czym polega problem? Ot, s dwie drogi czenia asemblera z C w rodowisku DJGPP. Pierwsz z nich jest nauka skadni jak posuguje si asembler AS wchodzcy w skad pakietu DJGPP, jest to do niewygodne rozwizanie, ze wzgldu na to, i semantyka AS oparta jest na standardzie AT&T, a wic jest zupenie odmienna od tej stosowanej w najpopularniejszych asemblerach (MASM/TASM). Drugim rozwizaniem jest znalezienie programu, ktry "rozumie normaln skadni" i produkuje pliki obiektowe typu COFF, bo takimi wanie posuguje si DJGPP.

Autorzy obu wspomnianych na wstpie artykuw proponuj do tego celu asembler Microsoftu, czyli MASM, bowiem potrafi on skompilowa kod do formatu COFF. Rozwizanie takie nie wydaje si jednak najszczliwsze, jeeli wemiemy pod uwag ide i sens istnienia takich programw jak DJGPP i innych rozpowszechnianych na zasadzie licencji GNU, czyli za darmo, a bardzo czsto take z udostpnieniem kodu rdowego, co pozwala doswiadczonemu programicie na ulepszanie i dostosowywanie programu, pocztkujcemu za nauk tej trudnej sztuki. Kt jednak chciaby rozpowszechnia za darmo co w co musia sam zainwestowa, a tak niestety jest jeeli decydujemy si na MASM, ktry w przeciwiestwie do DJGPP nie jest udostpniany za darmo. Poza tym wielu programistw ma swj ulubiony asembler (np. TASM) i nie ma ochoty z niego rezygnowa.

Okazuje si, e rozwiza naley szuka wanie wrd wyej wspomnianych programw GNU. Ja znalazem co najmniej trzy programy, ktre s w stanie sprosta zadaniu bdcemu tematem tego artykuu. I chocia prawd mwic tylko ostatni z nich uwaam za godny polecenia, to jednak przedstawiam je wszystkie, aby czytelnikowi pozostawi prawo wyboru.

Wszystkie ponisze propozycje dostpne s w sieci Internet. Pierwsz z nich jest asembler NASM, ktry mona cign z ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/nasmXXX.zip, gdzie XXX jest numerem wersji i moe ulega zmianom. Skadnia tego asemblera jest identyczna ze skadni TASM, ale posiada on wasny zestaw dyrektyw. Oznacza to, e uywanie go wymaga nieco nauki, chociaz mniej ni w przypadku nauki skadni AS. Jeeli jednak nie mamy zamiaru zamieca sobie gowy nowymi informacjami to powinnimy skorzysta z narzdzi do konwersji, np. program ta2as (ang. tasm to as) dostpny w serwisie ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2as.zip, sucy do konwersji kodu TASM na kod AS. Korzystanie z tego programu wymaga jednak minimalnej znajomoci AS, gdy ta2as nie jest wolny od bdw i trzeba "patrze mu na rce". Najlepszym rozwizaniem jakie udao mi si znale jest konwerter plikw 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 cign go mona z ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/o2c.zip. Dziki niemu nie musimy rozstawa si z naszym ulubionym asemblerem, pod warunkiem jednak, e obsuguje on model pamici FLAT (DJGPP jest kompilatorem 32-bitowym), co wicej moemy czy z DJGPP nie tylko fragmenty programu napisane w asemblerze, ale take w kadym innym jzyku, o ile kompilator tego jzyka produkuje pliki w formacie *.obj.

Jako przykad zastosowania tego programu zamieszczam poniej trywialn bibliotek obsugi myszy wykorzystujc przerwanie 33h, napisan zgodnie ze skadni TASM. Plik mouse.asm naley skompilowa poleceniem:
tasm.exe /MX mouse.asm
Przecznik /MX nakazuje asemblerowi rozrnianie maych i wielkich liter. Nastpnie konwertujemy powstay w wyniku kompilacji plik mouse.obj na plik formatu COFF:
o2c.exe mouse.obj
Ostatnim krokiem jest konsolidacja powstaego pliku mouse.o z programem demonstracyjnym demo.cc:
gcc demo.cc mouse.o
