Štěpán Roh
Verze 0.1
Revize dokumentu 1.0 (20.8.2000)
Zdrojový soubor se skládá z následujících částí:
- globální definice
- definice registrů
- definice funkcí
- definice instrukcí
Tyto části mohou být libovolně promíchány (i vnitřně mezi sebou), i když je
doporučeno mít globální definice přede všemi ostatními. Vyhodnocení symbolů
se provádí až po načtení celého zdrojové souboru, takže je možno se
odkazovat na ještě nedeklarované symboly. K těmto částím je ještě třeba
připočíst direktivy zpracovávané lexikálním analyzátorem, které mohou
figurovat kdekoliv.
Jedinou skutečnou direktivou je include, za kterou následuje jméno souboru
v uvozovkách :
include "soubor nebo cesta"
Tato direktiva bezprostředně vloží obsah souboru (který se hledá v aktuálním
adresáři) do aktuálního souboru beze změny stavu parseru.
Dalšími direktivami jsou komentáře a to ve třech formách :
# cokoliv do konce řádku
// cokoliv do konce řádku
/* cokoliv i přes více
řádek */
Globální definice jsou důležité pro popis procesoru jako celku. Jsou to
tyto :
- byte_size <počet bitů>
- Velikost bytu v bitech (1 až 32 bitů). Implicitně 8 bitů.
- numbers_len <délka číselných konstant v bitech>
- Velikost konstant uvedených jako číslo ve ydrojových textech v bitech. Implicitně 32 bitů.
- byte_order <způsob ukládání bytů>,...
- Způsob ukládání bytů do emulované paměti. Při ukládání nějakého množství bytů se na základě dělky v bytech vezme příslušná položka z byte_order a byty se zapíší v daném pořadí. Pořadí se skládá z číslic 1 až 9, kde 1 značí první byte a 9 osmý. Není-li pro daný rozsah uvedeno řazení, tak se bere jako 1234... atd.
- constant <jméno konstanty> <hodnota>:<délka v bitech>
- Definice konstanty o dané hodnotě a délce v bitech. Konstantu je možno použít všude tam, kde je vyžadován nějaký číselný výraz.
Registry jsou speciální proměnné reprezentující registry procesoru (ale
nejenom ty) :
- register <jméno registru>:<délka v bitech> (ip)
- Definice nového registru. Je-li přítomno ip, tak je daný registr označen jako "programový čítač" ve kterém je obsažena adresa další instrukce. Tento registr není modifikován implicitně, ale je třeba jej po každé dekódované instrukci posunout.
- function <jméno funkce> ((argumenty)) { <tělo funkce> }
- Definice (a deklarace) funkce. Argumenty jsou jména oddělená čárkou. Argumenty se předávají odkazem, takže jejich změna se promítne k volajícímu. Tělo funkce viz níže. Před tělem funkce ještě mohou být deklarace proměnných :
- var <jméno proměnné>:<délka v bitech>,...
- external function <jméno funkce> ((argumenty));
- Deklarace externí funkce. Externí funkce jsou specifikovány mimo zdrojový kód procesoru (viz dokument "Spolupráce s jazykem C").
Instrukční blok obsahuje samotné jádro emulovaného procesoru. Při každém
kroku procesoru se postupně prověří všechny bloky instructions a jejich
větve a pro všechny větve které se shodují je vykonán jejich kód.
- instructions <instrukční maska> { <výraz> { <kód> } ... }
- Pakliže je splněna instrukční maska, tak se vykonají jednotlivé větve za podmínky, že jejich výraz je nenulový. Instrukční maska je tvaru :
- <bitový rozsah>:<hodnota> (as <alias jméno>)
- Bitový rozsah je ve tvaru <počáteční bit>- <koncový bit> nebo <koncový bit s počátečním na nule>. Hodnota může být buď číslo, pak se daný blok prověřuje jenom když je daný načtený bitový úsek stejné hodnoty nebo to může být otazník, pak se pouze přiřadí daný bitový úsek do proměnné s daným jménem.
Kód se skládá z příkazů. Každý příkaz musí končit středníkem. Jednotlivé
příkazy jsou :
- <výraz>
- Viz níže.
- break
- Vyskočí z nejvnitřnějšího cyklu.
- continue
- Iniciuje další krok cyklu.
- while (<výraz>) { <kód> }
- Kód se provádí, dokud je výraz nenulový.
- for (<inicializátor>, <podmínka>, <iterátor>) { <kód> }
- Nejdříve provede inicalizátor, a poté provádí kód a iterátor tak dlouho, než je podmínka nulová.
- do { <kód> } while (<výraz>)
- while cyklus s testem podmínky na konci.
- if (<výraz>) { <kód> } (else { <else-kód> } )
- Je-li výraz nenulový provede se kód, je-li nulový a je přítomna else větev, tak se provede else-kód.
- return <výraz>
- Návrat z funkce s danou návratovou hodnotou.
- <číslo>
- Dané číslo, které bude mít poté bitvou délku zadanou pomocí globální definice numbers_len.
- <proměnná, registr nebo alias>++
- Postinkrement.
- <proměnná, registr nebo alias>--
- Postdekrement.
- ++<proměnná, registr nebo alias>
- Preinkrement.
- --<proměnná, registr nebo alias>
- Predekrement.
- <výraz> + <výraz>
- Sčítání.
- <výraz> - <výraz>
- Odčítání.
- <výraz> << <výraz>
- Bitový posun doleva.
- <výraz> >> <výraz>
- Bitový posun doprava.
- !<výraz>
- Logická negace.
- <výraz> && <výraz>
- Logický and.
- <výraz> | <výraz>
- Logické or.
- <výraz>
- Bitová negace.
- <výraz> & <výraz>
- Bitový and.
- <výraz> | <výraz>
- Bitové or.
- <výraz> ^ <výraz>
- Bitové xor.
- (<výraz>)
- Závorky.
- <jméno proměnné, registru, konstanty nebo alias>
- Daná hodnota.
- <jméno funkce> ((<argumenty>,...))
- Volání funkce.
- <výraz> == <výraz>
- 1, když jsou si oba výrazy rovny, 0 jinak.
- <výraz> != <výraz>
- 1, když si nejsou oba výrazy rovny, 0 jinak.
- <výraz> < <výraz>
- 1, když je první výraz menší než druhý, 0 jinak.
- <výraz> <= <výraz>
- 1, když je první výraz menší nebo roven než druhý, 0 jinak.
- <výraz> > <výraz>
- 1, když je první výraz větší než druhý, 0 jinak.
- <výraz> >= <výraz>
- 1, když je první výraz větší nebo roven než druhý, 0 jinak.
- <výraz> ? <výraz> : <výraz>
- Má hodnotu druhého výrazu, když je první výraz nenulový, jinak má hodnotu třetího výrazu.
- <výraz>:(<bitový rozsah>
- Z hodnoty daného výrazu vyřízne pouze daný bitový rozsah.
- <proměnná, registr nebo alias> = <výraz>
- Přiřazení, má hodnotu výsledku.
- <proměnná, registr nebo alias> += <výraz>
- Přičtení, má hodnotu výsledku.
- <proměnná, registr nebo alias> -= <výraz>
- Odečtení, má hodnotu výsledku.
- <proměnná, registr nebo alias> &= <výraz>
- Bitový and, má hodnotu výsledku.
- <proměnná, registr nebo alias> |= <výraz>
- Bitové or, má hodnotu výsledku.
- <proměnná, registr nebo alias> ^= <výraz>
- Bitové xor, má hodnotu výsledku.
- <proměnná, registr nebo alias> <<= <výraz>
- Bitový posun doleva, má hodnotu výsledku.
- <proměnná, registr nebo alias> >>= <výraz>
- Bitový posun doprava, má hodnotu výsledku.
v následující tabulce je priorita operátorů od nejvyšší k nejnižší.
Priorita operátorů
Operátory | Asociativita |
() | zleva |
! ~ ++ -- | zprava |
+ - | zleva |
<< >> | zleva |
< <= > >= | zleva |
== != | zleva |
& | zleva |
^ | zleva |
| | zleva |
&& | zleva |
| | zleva |
?: | zprava |
= a spol. | zprava |
Všechny tyto funkce se volají stejně jako uživatelsky definované funkce.
- overflow ()
- Vrací 1, přesáhlo-li poslední sčítání maximální hodnotu danou bitovou délkou operandů.
- underflow ()
- Vrací 1, zasáhlo-li poslední odčítání do záporných čísel.
- bit_length (<argument>)
- Vrací bitovou délku argumentu.
- fetch (<paměťový pool>, <adresa>, <počet bytů>)
- Vrací číslo o daném počtu bytů načtených z daného poolu a adresy. Hodnota je přečtena s použitím byte_order.
- store (<paměťový pool>, <adresa>, <hodnota>)
- Uloží hodnotu do paměti.
- mem_violation ()
- Vrací 1, bylo-li poslední čtení/zápis do paměti mimo paměť, popř. z/do zakázané oblasti.
This document was generated using AFT v5.05b