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.