UPE - popis spolupráce s jazykem C


Štěpán Roh

Verze 0.1
Revize dokumentu 1.0 (20.8.2000)

Překlad zdrojových textů

Kompilátor zdrojových textů se jmenuje upecc. Prvním parametrem je jméno zdrojového souboru, druhým jméno výsledného souboru v C. Tento výsledný soubor obsahuje emulovaný procesor. Pro překlad takto vygenerovaného souboru jsou třeba ještě soubory upe.h, upe.c a config.h. Všechny tyto soubory jsou vloženy automaticky, takže je není třeba specifikovat při volání linkeru. Jméno výsledného procesoru je specifikováno parametrem -n.

Kostra programu využívajícího emulovaný procesor

Pro lepší představu viz soubory test.upe a test.c. Ze všeho nejdříve je třeba provést inkluzi přeloženého procesoru. poté je třeba definovat funkce označené ve zdrojovém textu procesoru jako external - ty musí mít prototyp odpovídající tomu z přeloženého procesoru, dále je třeba definovat funkci volanou při nedostatku paměti se jménem <jméno procesoru>_low_mem, která se již nesmí vrátit. V hlavním těle programu (typicky ve funkci main()) je nutné alokovat paměť s alespoň jedním poolem a to do proměnné s názvem <jméno procesoru>_mem. Dále je třeba inicializovat procesor voláním funkce <jméno procesoru>_init, která při chybě vrací nenulovou hodnotu. A nakonec je třeba periodicky volat funkci <jméno procesoru>_step, která vždy provede jednu instrukci nebo vrátí nenulovou hodnotu při přístupu mimo existující paměť (což by mělo být ošetřeno v kódu procesoru).

Převod symbolů

Veškeré globální symboly z emulovaného procesoru jsou vidět i navenek. Jako prefix mají jméno procesoru, pak následuje podtržítko, pak třída symbolu, pak podtržítko a pak jméno symbolu. Názorně: <jméno procesoru>_<třída>_<jméno symbolu>. Konstanty jsou ve třídě const, registry ve třídě reg a funkce ve třídě fn. Konstanty a registry jsou typu upe_number_t *, funkce tento typ vrací a argumenty mají stejné jako ve zdrojovém textu procesoru.

Práce s dlouhými čísly a pamětí

Tento oddíl popisuje práci s dlouhými čísly a pamětí. Funkce k tomu sloužící se nacházejí v souborech upe.h a upe.c. Bližší popis viz. tyto soubory. zde je pouze stručný nástin.

Dlouhá čísla jsou čísla, která mají téměř libovolnou délku v bitech a mohou mít byty s jiným počtem bitů než je klasických 8. K vytvoření takovéhoto čísla slouží funkce upe_initnum, k jeho zrušení zase upe_donenum. Velikost bytu se specifikuje globálně a je uložena v proměnné upe_byte_size, nebo je #definována jako upe_byte_size (to v případě, že je tato knihovna využívána přeloženým procesorem). Nad těmito čísly je definováno několik operací jako sčítání, odčítání, různé logické i bitové operace, bitové posuny apod.

Paměť emulovaného procesoru se vytváří voláním upe_create_mem. Je třeba uvést počet tzv. "poolů", což jsou samostatné adresové prostory. Jsou číslovány od 0, přičemž je třeba mít alespoň jeden, ze kterého se čtou instrukce pro procesor. Každý pool je třeba namapovat na reálnou paměť voláním upe_map_mem, kde je možno specifikovat i různé uživatelské funkce volané při čtení nebo zápise. Je možné mapovat i jen jednotlivé kusy poolu. Voláním funkcí upe_read_mem a upe_write_mem je možno pracovat s pooly na úrovni emulace.



This document was generated using AFT v5.05b