b) Stos jest używany przez wywołującego funkcję do zachowania zawartości rejestrów (w ramach swoich odpowiedzialności za stan rejestrów), a także do przekazania argumentów do funkcji (gdy jest ich więcej niż cztery).
c) Stos jest używany przez funkcję do przechowania zawartości rejestrów (w ramach swoich odpowiedzialności za stan rejestrów), a także do przechowywania swoich zmiennych lokalnych.
d) Operacja odkładania na stos (ang. push), np.
subu $sp, $sp, 4 # dekrementacja $sp
sw $tl, ($sp) # zapamiętanie zawartości rejestru $tl na stosie
e) Operacja zdejmowania ze stosu (ang. pop), np.
Iw $t3, ($sp) # pobranie słowa wskazywanego przez $sp
addu $sp, $sp, 4 # aktualizacja wskaźnika wierzchołka stosu
3.5. Ramka stosu
a) Funkcja tworzy na stosie obszar zwany ramką stosu (ang. stack frame), gdzie dla swoich potrzeb przechowuje:
• argumenty przekazane przez wywołującego
• adres powrotny (adres ten jest zawarty w rejestrze $ra, i byłby zniszczony, gdyby w ciele funkcji nastąpiło wywołanie innej funkcji)
• zawartość rejestrów, które ma zachować w ramach swojej odpowiedzialności za stan rejestrów
• zmienne lokalne (deklarowane w funkcji)
• zawartość rejestrów, które ma zachować wywołujący - jeśli funkcja wywołuje funkcję.
b) Przykładowa organizacja podstawowej, 24-bajtowej, ramki stosu (stos rośnie w kierunku adresów malejących; z lewej strony pokazano offset względem wierzchołka wskazywanego przez $sp):
20 |
Old Sra value |
16 |
Old Sfp value |
12 |
Storage for $a3 |
8 |
Storage for $a2 |
4 |
Storage for $a1 |
0 |
Storage for $a0 |
c) Przykład fragmentu prologu funkcji (początkowe instrukcje dotyczące ramki):
function: subu $sp, $sp, 24 # miejsce w ramce stosu dla 24 bajtów
sw $ra, 20($sp) # zachować $ra gdy funkcja ma wywoływać funkcję
d) Przykład fragmentu epilogu funkcji (końcowe instrukcje):
lw $ra, 20(sp) addu $sp, $sp, 24 jr $ra
# pobranie adresu powrotnego
# niszczenie ramki stosu
# powrót z funkcji
str. 3/8