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 .
 
FPC05
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.
to-r
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-from
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.
r-fetch
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.
2-to-r
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.
2-r-from
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
2-r-fetch
____________________________________________________________________________________________________________________
04.03.2008 - Luboš Pěkný, čerpáno z  X3J14 dpANS-6 a z AR84 - Ing. Rudolf Pecinovský: FORTH.