| FORTH | |
|||||
| Úvod | Výukové lekce | 03 04 05 | ||||
|
Lekce 4 - Návratový zásobník
Návratový zásobník
je datová struktura LIFO (poslední dovnitř,
první ven), stejně jako datový zásobník.
Používá se pro uchování
návratové adresy právě prováděného
slova, tj. adresy, ze které se přečte další slovo.
V rámci prováděného slova můžeme do
návratového zásobníku odkládat
libovolná data, ale před ukončením slova musí
být návratový zásobník ve
stavu, jako při vstupu do slova. Jinak hrozí, že se za
návratovou adresu budou považovat např. uživatelská data
a běh programu se nám někam zatoulá. Některá slova
návratový zásobník již
používají a nepromyšleným zásahem do
návratového zásobníku, jejich funkci
narušíme.
: PRESKOC R> 2 + >R ; : PRICTI 1+ PRESKOC 1+ 1+ ; 0 PRICTI . 2 ok Slovo PRESKOC vyčte svou návratovou adresu, zvýší ji o dva bajty a vrátí zpět do návratového zásobníku. Slovo PRICTI by mělo zvýšit obsah TOS o tři. Při vstupu do slova PRESKOC, ukazuje jeho návratová adresa na první 1+, ale zvyšuje návratovou adresu tak, že ukazuje až na druhé slovo 1+. Proto zobrazený výsledek je jen číslo 2, jedno slovo 1+ se přeskočilo. Příklad 5:
Na
následujícím Obr. 5 jsou
prakticky
vyzkoušeny některé operace s návratovým zásobníkem v F-PC
.
![]() Obr. 5 |
|||
|
>R
|
(
x -- ) (R: -- x ) x-libovolné 16b číslo R-návratový zásobník |
to-r | TOS datového zásobníku přesune do návratového zásobníku. Vyčte x z datového zásobníku a přidá ho do návratového zásobníku. Např. 5 >R uloží číslo 5 do návratového zásobníku. Nezkoušejte. ![]() |
| R> | ( -- x) (R: x -- ) | r-from | TOS návratového zásobníku přesune do datového zásobníku. Vyčte x z návratového zásobníku a přidá ho do datového zásobníku. Např. R> přesune číslo 5 do datového zásobníku. Nezkoušejte. ![]() |
| R@ | ( -- x) (R: x -- x) | r-fetch | TOS návratového zásobníku zkopíruje do datového zásobníku. Přečte x z návratového zásobníku, x nemaže a přidá ho do datového zásobníku. Např. R@ . zobrazí číslo uložené v návratovém zásobníku. Např. : ZKUSA 5 >R R@ 1+ R> . . ; ZKUSA nadefinuje a spustí slovo ZKUSA. Číslo 5 uloží do R: , pak jej vykopíruje na TOS, přičte 1 a ještě vyčte z R: číslo 5, zobrazí 5 6. ![]() |
| 2>R | (
d -- ) (R: -- d ) (x1 x2 -- ) (R: -- x1 x2) d-libovolné 32b číslo R-návratový zásobník |
two-to-r | TOS a NOS datového zásobníku přesune do návratového zásobníku. Vyčtené x1 a x2 z datového zásobníku přidá do návratového zásobníku. Provede ekvivalent SWAP >R >R zachová pořadí x1, x2 pro 32b číslo. Např. 5 3 2>R uloží čísla 5 3 do návratového zásobníku. Nezkoušejte. ![]() |
| 2R> | ( -- d) (R: d -- ) ( -- x1 x2) (R: x1 x2 -- ) |
two-r-from | TOS a NOS návratového zásobníku přesune do datového zásobníku. Vyčtené x1 a x2 z návratového zásobníku přidá do datového zásobníku. Provede ekvivalent R> R> SWAP zachová pořadí x1, x2 pro 32b číslo. Např. 2R> přesune čísla 5 3 do datového zásobníku. Nezkoušejte. ![]() |
| 2R@ | ( -- d) (R: d -- d ) ( -- x1 x2) (R: x1 x2 -- ) |
two-r-fetch | TOS a NOS návratového zásobníku zkopíruje do datového zásobníku. Přečte x1 a x2 z návratového zásobníku, nemaže je a přidá je do datového zásobníku. Provede ekvivalent R> R> 2DUP >R >R SWAP zachová pořadí x1, x2 pro 32b číslo. Např. 2R@ . . zobrazí dvě čísla uložená v návratovém zásobníku. Např. : ZKUSB 5 3 2>R 2R@ 1+ 2R> . . . . ; ZKUSB nadefinuje a spustí slovo. Čísla 5 3 uloží do R: , pak je vykopíruje na TOS, NOS, přičte k číslu 3 jedna, ještě vyčte z R: čísla 5 3, zobrazí 3 5 4 5. ![]() |
| ____________________________________________________________________________________________________________________ 04.03.2008 -
Luboš Pěkný, čerpáno z
X3J14 dpANS-6 a z AR84 - Ing. Rudolf Pecinovský: FORTH. Podléhá
autorskému zákonu,
šíření povoleno jen s
uvedením autora.
|
|||