60 4. Program ćwiczeń
stosie i pobrania ze stosu odpowiedniej komórki pamięci. Druga to napisanie odpowiedniej procedury rekurencyjnej.
Zacznijmy od rozkazu skoku do procedury. Rozkaz ten przypomina rozkaz skoku bezwarunkowego SOB z ta różnica, że tym razem wymagane jest wcześniejsze zapamiętanie śladu (czyli adresu powrotu) na stosie. Zachowanie śladu powinno mieć miejsce bezpośrednio po zdekodowaniu rozkazu. Ponieważ rejestr X wskazuje na ostatnia zajęta komórkę na stosie, należy najpierw zdekrementować rejestr X (oczywiście korzystając z jednostki arytmetyczno-logicznej), a następnie przesłać aktualna zawartość licznika rozkazów L do komórki pamięci wskazywanej przez zawartość rejestru X Potem można już wykonać sam skok do procedury. Przedstawimy teraz definicję tego rozkazu za pomocy ciągu przesyłów międzyrejcstrowych:
((A)) - S |
czyt |
odczyt rozkazu |
(S)-I |
wys, wri |
i jego dekodowanie |
(L) + 1 - L |
U |
L wskazuje następny rozkaz |
(Ak) - S |
wyak, wes |
przechowanie zawartości rej. Ak w rej. S |
(X) - Ak |
wyx, weja, pob, weak |
przesianie X do JAL-u |
(Ak) - 1 - Ak |
jedn, weja. ode, weak |
i dekrementacja rejestru X |
(Ak) - X |
wyak, wex |
X wskazuje nowy szczyt stosu |
(Ak) - A |
wyak, sa, wea |
adres szczytu stosu do rej. A |
(S) -* Ak |
wys. weja, pob, weak |
przywrócenie starej zawartości Ak |
(L) -* S |
wyl, as, wes |
zapisanie śladu (rej. L) w rejestrze S |
(S) - (A) |
pisz |
i potem na szczycie stosu |
(Ad) - L |
wyad, wel |
i wreszcie wykonanie skoku do |
(Ad) - A |
wyad, wea |
odpowiedniej procedury |
Część operacji przesyłów można połączyć ze sobą i tym samym zredukować liczbę taktów wymaganych dla wykonania tego rozkazu do dziewięciu. Poniżej przedstawiono opis rozkazu w postaci pliku opisu RTX.
ROZKAZ
TYP - EW MNE = SOP
OPIS = '(X) - 1 - X; (L) -* (X); (Ad) -* L'
AKCJA
czyt wys wei il; wyak wes; wyx weja pob weak; jedn weja ode weak; wyak wex sa wea; wys weja pob weak; wyl as wes: pisz;
wyad wel was;
KONIEC
Kolejnym etapem rozwiązania zadania jest zaprojektowanie rozkazu powrotu z procedury. Zadaniem tego rozkazu jest pobranie adresu powrotu ze stosu, a następnie wykonanie skoku pod ten adres. Odpowiednia lista przesyłów między rejestrowych:
((A)) - S |
czyt |
odczyt rozkazu |
<S)-I |
wys, wei |
i jego dekodowanie |
(L) + 1 -* L |
ii |
L wskazuje następny rozkaz |
(Ak) - S |
wyak, wes |
przechowanie akumulatora w rej. S |
(X) -+ A |
wyx. sa, wea |
wskaźnik stosu do rej. A |
(X) -* Ak |
wyx, weja pob, weak | |
(Ak) + 1 Ak |
jedn, weja dod. weak |
modyfikacja wskaźnika stosu |
(Ak) -*> X |
wyak, wex | |
(S) - Ak |
wys, weja, pob. weak |
przywrócenie zawartości akumulatora |
((A)) -* S |
czyt |
odczyt adresu powrotu |
(S) -+ L |
wys, sa, wel |
przesłanie go do rejestrów L |
(S) -* A |
wys, sa, wea |
oraz A |
Po połączeniu niektórych przesyłów we wspólne takty otrzymamy, podany poniżej, opis rozkazu powrotu z procedury:
ROZKAZ
TYP = EW MNE = PWR
OPIS = '({X» - L; (X) + 1 - X'
AKCJA
czyt wys wei fi; wyak wes;
wyx weja pob weak sa wob; jedn weja dod weak; wyak wex; wys weja pob weak; czyt wys sa wel wea;
KONIEC
Podobnie zostaną zdefiniowane pozostałe dwa rozkazy operujące na stosie. Zadaniem rozkazu PSH jest zapisanie na szczycie stosu zawartości wskazanej komórki pamięci, co skrótowo można opisać za pomocą następujących przesyłów:
(X) - 1 - X ((Ad)) - (X).
Rozkaz POP będzie pełnił odwrotną funkcję, to znaczy spowoduje pobranie liczby ze szczytu stosu i przesłanie jej do wskazanej w części argumentowej rozkazu komórki pamięci. Można co opisać za pomocą następujących przesyłów międzyrejestrowych:
((X)) - (Ad)
(X) + 1 - X.