b) Przeprowadzić asemblację i wykonać program krokowo. Proszę zaobserwować wykonanie operacji wskazywanej w instrukcji jal: jaki adres jest zapamiętany w $ra, jaki jest adres początkowy funkcji? Zaobserwować zakończenie funkcji: jaki jest adres w $ra, jaki jest adres instrukcji, która będzie realizowana po instrukcji jr $ra?
3. Organizacja funkcji
3.1. Pisząc (w języku asemblera) funkcje i programy, w których występują wywołania funkcji, należy przestrzegać pewnych reguł:
a) Wywołujący funkcję powinien mieć możliwość przekazania jej listy argumentów (kolejność może być istotna). W ciele funkcji, dostęp do argumentów powinien być taki, jak do zmiennych lokalnych.
b) Funkcja powinna mieć możliwość tworzenia własnych zmiennych.
c) Wywołujący funkcję (ang. caller) i wywołana funkcja (ang. callee) muszą przestrzegać uzgodnień odnośnie do korzystania z rejestrów procesora, tak aby nie było obaw, że mogą wystąpić kolizje, prowadzące do utraty danych przechowywanych w rejestrach.
d) Funkcja musi mieć możliwość zwrócenia (wywołującemu) wartości, będącej rezultatem jej działania.
e) Jeśli planujemy korzystać z funkcji do implementacji algorytmów rekurencyjnych, to trzeba tak napisać funkcję, aby funkcja mogła wywołać samą siebie - bez ograniczenia głębokości zagnieżdżenia.
3.2. Rejestry używane do przekazania argumentów i wartości zwracanych
a) W architekturze MIPS, standardowo, do przekazania argumentów do funkcji, stosuje się rejestry $a0, $al, $a2, $a3, $a4 - jeśli trzeba przekazać więcej argumentów, to należy je przekazać poprzez pamięć (stos).
b) Rezultat powinien być, standardowo, zwracany w rejestrach $v0, $vl (wartość typu doubleword jest zwracana w parze rejestrów).
3.3. Podział odpowiedzialności za stan rejestrów CPU
a) odpowiedzialność wywołującego: przed wywołaniem funkcji, należy zachować (w pamięci) stan tych spośród rejestrów $t0 do $t7, których zawartość jest istotna, i chcemy mieć pewność, że nie zostanie zmieniona przez funkcję; analogicznie, należy zadbać o stan rejestrów $a0 do $a3, oraz $v0, $vl.
b) odpowiedzialność wywoływanego: funkcja musi, przede wszystkim, zachować stan (w pamięci) tych spośród rejestrów $s0 .. $s7, $fp, $ra, które mają być używane przez tę funkcję, w celu przechowywania w nich nowych wartości.
3.4. Stos
a) Stos jest strukturą UFO (ang. last in first out) - zorganizowaną w pamięci, wskazywaną przez rejestr $sp (stack pointer). Dane, które trzeba przechować na stosie, odkłada się na wierzchołek (rejestr $sp zawiera adres danych leżących na wierzchołku stosu). W architekturze MIPS, stos rośnie w kierunku adresów malejących, więc przed odłożeniem na stos, należy dekrementować rejestr $sp (aby nie nadpisać danych leżących na wierzchołku).