7.1.1. Registry virtuálního procesoru
Nyní k registrům jenž náš virtuální procesor obsahuje. Uvedu jejich zavedená jména a zároven popis jejich významu.
- W — pracovní registr (Working Register)
- Pracovní a pomocný registr. Je používán k řadě věcí včetně dočasného uchovávání adresy. Je třeba aby tento registr bylo možno použít jako adresový registr při práci s pamětí. Tento registr se používá v každém slově. Často používané operace mimo aritmetických a logických je přístup do paměti (LOAD, STORE).
- IP — ukazatel instrukcí (Instruction Pointer / Interpreter Pointer)
- Ukazatel na instrukci. Podle implementace a průběhu programu ukazuje na aktuálně vykonávanou instrukci / slovo, nebo o jednu instrukci dopředu, tedy na následující instrukci. Je používán každým slovem. Používá jej implementace slov NEXT, ENTER a EXIT. Musí to být opět adresový registr. Nejčastější operace nad tímto registrem ja inkrementace (INC, DEC, LOAD).
- PSP — Parameter Stack Pointer / Data Stack
- Ukazatel zásobníku parametrů, někdy označován také jen SP (Stack Pointer). Je lepší jej označovat PSP protože označení SP často používá některý z registrů skutečného procesoru. PSP musí být adresový registr s charakterm ukazatele zásobníku. Potřebujeme jej inkrementovat, dekrementovat a použít jako adresu do paměti při čtení a zápisu (PUSH, POP). Podle způsobu realizace ukazuje na první volnou buňku na vrcholu zásobníku, na TOS, NOS či NNOS, podle toho jsou-li některé z těchto hodnot drženy pro rychlost zpracování v registrech procesoru. Samotný zásobník, či jeho zbytek je pak v paměti (u speciálních Forth procesorů se nachází přímo v jádře). Nároky na zásobník parametrů nejsou veliké, postačí několik desítek slov.
- RSP — Return Stack Pointer
- Ukazatel zásobníku návratových adres někdy nazývaný RP. RSP musí mít charakter ukazatele zásobníku nebo adresového registru. Opět operace které budem používat jsou obdobné jako u PSP, tedy inkrementace, dekrementace a přístup do paměti (PUSH, POP).
- X — Working Register
- Pracovní registr. Pro některé operace budeme potřebovat další pomocný pracovní registr. Použití záleží na implementaci. Je důležitý pro procesory jenž nemohou použít jako jeden z operandů buňku v paměti.
- UP — User Pointer
- Ukazatel na uživatelský proces. Je použit u víceúlohového forthu. Ukazuje na důležité struktury jenž jsou pro každý proces samostatné a dovolují tak „paralelní“ běh několika úloh/aplikací, přesněji konkurentní přepínání mezi několika uživatelskými prostředími.
- TOS — Top Of Stack
- TOS není skutečným registrem ale v registru může být. Jedná se o vrchol zásobníku parametrů. Tedy je to označení pro buňku/slovo na které „ukazuje“ PSP. Slovo ukazuje je v úvozovkách, protože realizace zásobníku parametrů může implementovat ukazatel PSP jako ukazatel na první volnou buňku a nikoliv buňku na vrcholu zásobníku. Operace ve forthu pracují se zásobníkem a jeho vrcholem velmi často. Z důvodů výkonu se TOS implementuje v registru procesoru a zásobník obsahuje až další buňky pod vrcholem. V některých případech je i další hodnota NOS, případně NNOS implementována v registrech procesoru.
- NOS — Next Of Stack
- NOS stejně jako TOS není skutečným registrem ale v registru může být. Jedná se o buňku pod vrcholem zásobníku parametrů, tedy pod TOS.
- NNOS — Next Next Of Stack
- NNOS stejně jako TOS není skutečným registrem ale v registru může být. Jedná se o druhou buňku pod vrcholem zásobníku parametrů, tedy pod NOS.
Je-li to možné je potřeba s ohledem na výkon udržovat W, IP, PSP a RSP přímo v registrech procesoru.
Poznámka
ANS Forth vyžaduje aby zásobník parametrů adresovaný PSP měl alespoň 32 buňek (slov) a zásobník navratových adres adresovaný RSP alespoň 24 buňek (slov).
Následující tabulka je beze změny převzata z MOVING FORTH Part1: Design Decisions in the Forth Kernel.
W IP PSP RSP UP TOS
----------------------------------------------------------
8086[1] BX SI SP BP memory memory [LAX84]
8086[2] AX SI SP BP none BX [SER90]
68000 A5 A4 A3 A7=SP A6 memory [CUR86]
PDP-11 R2 R4 R5 R6=SP R3 memory [JAM80]
6809 X Y U S memory memory [TAL80]
6502 Zpage Zpage X SP Zpage memory [KUN81]
Z80 DE BC SP IX none memory [LOE81]
Z8 RR6 RR12 RR14 SP RR10 RR8 [MPE92]
8051 R0,1 R2,3 R4,5 R6,7 fixed memory [PAY90]