C dla każdego (cz. 28.)

Ulepszanie systemu cz. 3

Dziś zajmiemy się podstawowym mechanizmem używanym do "ulepszania" systemu: funkcją SetFunction().

Ze względu na dość obszerny listing, nie będziemy w stanie opisać go w tej części. Skupimy się tylko na kilku zagadnieniach, a sam listing omówimy dokładnie za miesiąc. Przykre doświadczenia z częściami o gadżetach uczą nas, że tak jest lepiej, niż gdybyśmy mieli listing podzielić.

Jeżeli znacie nieco asembler, to będzie jak znalazł, gdyż zajmiemy się niskopoziomowymi aspektami programowania systemowego, w których nawet język "C" jest za bardzo abstrakcyjny. Wystarczy, abyście wiedzieli trochę o rejestrach procesora i potrafili zrozumieć podtawowe rozkazy. Tak między nami mówiąc, to każdy szanujący się programista piszący w "C" MUSI umieć czytać programy napisane w asemblerze: choćby po to, aby w przypadku niewytłumaczalnych błedów móc upewnić się, że kompilator wyprodukował poprawny kod. Ale teraz do pracy:

Przede wszystkim musimy wyjaśnić, w jaki sposób wywoływane są funkcje z bibliotek w systemie AmigaOS. Wiecie dobrze, że aby móc ich używać, trzeba najpierw otworzyć bibliotekę i zapamiętać jej bazę w zmiennej o ściśle określonej nazwie, ale tak na dobrą sprawę po co?

Jak wiecie, funkcja OpenLibrary() zwraca wskaźnik na punkt w pamięci operacyjnej będący początkiem struktury "Library": idąc w górę przestrzeni adresowej przemierzamy kolejne pola tej struktury. Iść można również "w dół", a jest to droga zdecydowanie ciekawsza. W obszarze tym znajduje się tablica skoków do procedur danej biblioteki. Każda funkcja ma w tej tablicy stałe, ściśle określone miejsce. Nie wdając się w szczegóły, można powiedzieć, że aby wywołać jakąś procedurę należy skoczyć w odpowiedni punkt tablicy skoków danej biblioteki. W tablicy odnotowany jest rzeczywisty adres procedury i do niej jest przekazywane sterowanie.

Szczególną cechą funkcji z bibliotek jest to, że parametry przekazuje się nie na stosie, jak to jest w zwyczaju w języku "C", ale bezpośrednio w rejestrach procesora.