Tvorba podprogramůBloky programu, které vykonávají činnost často se opakující, nazveme podprogramem. Jejich použitím zjednodušíme program. Za podprogramy pokládáme procedury a funkce. Pascal umožňuje vkládat assembler i do obyčejných podprogramů. Můžeme také tvořit podprogramy pouze v assembleru. To vyjádříme zápisem assembler za definici procedury nebo funkce. Ty potom neobsahují klasické vymezení bloku begin...end, stačí jen assemblerovské asm..end (pokud tedy tvoříme podprogram jen v assembleru, uvedeme za definici označení assembler, blok vymezíme asm...end). S parametry pracujeme v podprogramech v souladu s tím, jak jsme je přes zásobník předávali. To znamená, že k parametrům volaným hodnotou přistupujeme jako ke klasickým proměnným, k parametrům volaným odkazem přistupujeme jako k ukazatelům (dosazujeme jejich adresu instrukcí LES, LDS). Lokální proměnnéV okamžiku vstupu do podprogramu se na vrcholu zásobníku automaticky vytvoří místa pro lokální proměnné definované v části var podprogramu. V případě, že se jedná o pascalovskou funkci (není označena slovem assembler v definici), je navíc vložena speciální proměnná @RESULT určená k předání funkční hodnoty (ta je i stejného datového typu). Před návratem z funkce je obsah proměnné @RESULT automaticky předán do registrů předepsaných pro návrat hodnoty (pokud tedy tvoříme funkci s vloženým assemblerovským blokem, předáme funkční hodnotu do proměnné @RESULT, ve funkci s označením assembler vracíme funkční hodnotu v registrech, ve kterých funkční hodnotu očekává volající (AL, AX,..), jak bylo uvedeno v části o volání podprogramů). Lokální proměnné používáme stejně jako globální (s tím rozdílem, že jejich segmentová adresa není v DS). Význam registru BPRegistr BP je v době vykonávání podprogramu nasměrován na vrcholek zásobníku v okamžiku vstupu do něj. Proto použitím nepřímé bázové adresace s pomocí tohoto registru můžeme přistupovat k:
Vzhledem k tomu, že se o tyto přepočty adres může postarat překladač, je jednodušší používat pro přístupy k proměnným a parametrům jen jejich symboly uvedené v definici podprogramu nebo části var. Příklad:
|
|