3.6.
Zadanie 2
a) Wprowadzić następujący program
# program główny, main(), sam jest funkcją
# więc najpierw trzeba utworzyć ramkę stosu
# drukować pierwszy łańcuch
.data
stringl: .asciiz "Hello world!\n"
string2: .asciiz "Drugi tekst\n"
.text
main: subu $sp, $sp, 24
sw $ra, 20($sp)
la $a0, stringl li $v0, 4 syscall
sw $a0, 0($sp) jal function lw $a0, 8($sp)
li $v0, 4 li $v0, 10
# zachować w ramce stan rejestru $a0
# wywołać funkcję o nazwie function
# odtworzyć rejestr $a0
# powtórnie drukować pierwszy łańcuch
# exit (tutaj nie ma potrzeby niszczyć ramki)
function: subu $sp, $sp, 24
sw $ra, 20($sp)
la $a0, string2 li $v0, 4
lw $ra, 20($sp) addu $sp, $sp, 24 jr $ra
# utworzyć ramkę stosu # drukować drugi łańcuch
# zrekonstruować adres powrotny
# zniszczyć ramkę stosu
# powrót do wywołującego
b) Wykonać program krokowo; prześledzić operacje na stosie, zmieniający się stan stosu, zrozumieć i zapamiętać, jak działa stos, jak utworzyć ramkę stosu, jak należy organizować funkcje.
4. Zmienne lokalne
4.1. Zmienne lokalne funkcji przechowuje się na stosie, w ramce stosu. Zmienne te mają więc charakter dynamiczny, gdyż w odróżnieniu od zmiennych statycznych (które są przechowywane w segmencie .data), zmienne lokalne nie zajmują pamięci przez cały czas wykonywania programu: istnieją (i można w nich przechowywać wartości) od chwili utworzenia ramki do czasu zniszczenia ramki stosu.
a) W prologu funkcji, zmienne lokalne tworzy się następująco:
• należy zwiększyć rozmiar ramki stosu tak, aby utworzyć miejsce do przechowania w niej wszystkich zmiennych lokalnych
• należy zdecydować, gdzie w ramce stosu mają rezydować poszczególne zmienne (jaki jest ich adres względem początku ramki stosu).
b) Do adresowania zmiennych lokalnych można wykorzystać rejestr $fp (wskaźnika ramki stosu), do którego można wpisać adres początkowy ramki (oczywiście, przed tą operacją, należy zachować na stosie zastaną zawartość rejestru $fp, a w epilogu funkcji zrekonstruować $fp).