PROCEDÚRY
Ak by som mal definovať pojem procedúra, prvé čo by ma napadlo by asi bolo, že je to podprogram, t.j. program, ktorý vykonáva nejakú špecifickú činnosť i keď nemusí to byť pravidlom. Procedúry sa najčastejšie používajú tam, kde sa často opakuje blok programu. Procedúra súvisí s inštrukciou CALL, ktorá sa používa na jej volanie. Jednoducho napíšete CALL meno_procedúry.
Syntax:
meno PROC [jazyk] [typ]
[USES items,] [argument [,argument]...]
RETURNS [argument [,argument]...]
Sem treba vložiť blok programu.
RET
meno ENDP
Jazyk môže byť jedna z nasledujúcich variant: BASIC, C, CPP, FORTRAN, PASCAL, PROLOG, SYSCALL, NOLANGUAGE. Typ môže byť FAR alebo NEAR. Items je zoznam registrov a jednoduchých symbolov, ktoré budú v procedúre použité. Celý zoznam je pri vstupe do procedúry uložený do zásobníka a pri ukončení procedúry znova obnovený, t.j. vybratý zo zásobníka. Jednotlivé prvky zoznamu je potrebné od seba oddeliť medzerou. Kľúčové slovo RETURNS určuje jednu, alebo viac položiek, ktoré nebudú pri návrate z procedúry odstránené zo zásobníka.
Medzi časté chyby pri používaní procedúr patria:
Preto si vždy skontrolujte či je procedúra ukončená inštrukciou
RET a následne ENDP. V prvom prípade vás ani prekladač na chýbajúcu inštrukciu neupozorní.V bloku PROC...ENDP môžeme používať nasledujúce
direktívy:
ARG
- direktíva sa používa pri definovaní procedúry a určuje parametre tejto procedúry uložené v zásobníku pred návratovou adresou. Zvýhodňuje prístup k týmto parametrom, ktoré by sa inak museli adresovať ako dáta (pomocou registra BP). POZOR!!! Uloženie jednotlivých argumentov v zásobníku je rôzne, podľa použitého jazyka.Syntax: ARG argument [,argument] ...[=size]
[RETURNS argument [,argument]]
Konštanta size obsahuje celkovú veľkosť dát. RETURNS určuje jednu, alebo viac položiek, ktoré nebudú pri návrate z procedúry odstránené zo zásobníka.
LOCAL
- direktíva slúži na definovanie lokálnych premenných v procedúre.Syntax: LOCAL localdef [,localdef] [=size]
USES
- sa používa v bloku PROC...ENDP a určuje, ktoré dáta a registre budú pri vstupe do procedúry uložené do zásobníka a pri výstupe z procedúry vybraté zo zásobníka.Syntax: USES item [,item]
Príklad:
;Takto vyzerá procedúra pred |
|
;aplikovaním direktívy USES |
|
CLS1 |
PROC C NEAR |
|
USES AX,BX,CX,DX |
|
MOV AX,0003 |
|
INT 10H |
|
RET |
CLS1 |
ENDP |
;Po aplikovaní vzniknú |
|
;viditeľné zmeny v procedúre |
|
CLS1 |
PROC C NEAR |
|
USES AX,BX,CX,DX |
|
PUSH AX |
|
PUSH BX |
|
PUSH CX |
|
PUSH DX |
|
MOV AX,0003 |
|
INT 10H |
|
POP DX |
|
POP CX |
|
POP BX |
|
POP AX |
|
RET 00000H |
CLS1 |
ENDP |
LOCALS, NOLOCALS
- táto direktíva povoľuje používanie lokálnych symbolov v bloku PROC...ENDP. Každý symbol musí začínať dvojznakom. Ak tento dvojznak nebude uvedený, potom musí začínať implicitným dvojznakom "@@". Direktíva NOLOCALS zakazuje používanie lokálnych symbolov.Syntax: LOCALS [prefix]
Príklad:
LOCALS AB |
|
VYPIS |
PROC NEAR |
ABX10: |
MOVSB |
STOSB |
|
LOOP ABX10 |
|
RET |
|
VYPIS |
ENDP |
Výsledkom toho je, že návestie "abx10" môžete použiť v programe viackrát. Pri použití direktívy
LOCALS je platnosť návestia len v rámci procedúry. To je príčina, prečo môžete použiť to isté návestie viackrát. Ak by ste však direktívu LOCALS nepoužili prekladač ohlási chybu Symbol already defined (Symbol bol už raz definovaný).Ešte nám zostali dve direktívy. Sú to EXTRN a PUBLIC. Tieto dve z doposiaľ uvedených sa pravdepodobne používajú (v bežnej praxi) najčastejšie.
PUBLIC
- direktíva označuje symbol, ktorý má byť viditeľný z iných modulov. PUBLIC sa používa na zverejňovanie mien premenných, konštánt, programových návestí atď.Jazyk môže byť napr.: C, PASCAL, BASIC, FORTRAN, alebo PROLOG.
Syntax: PUBLIC [jazyk] symbol [,[jazyk] symbol]...
EXTRN
- direktíva oznamuje prekladaču a linkeru, že daný symbol je definovaný v inom module.Syntax: EXTRN definition [,def...]
Definícia má tento tvar: [jazyk] name : type [:count], kde jazyk
môže byť napr.: C, PASCAL, BASIC, FORTRAN, alebo PROLOG.
Name je symbol, ktorý je definovaný v inom module. Typ môže
byť NEAR, FAR, PROC. Typ PROC určuje, že
spôsob volania je závislý na použitom pamäťovom modeli. V prípade dát ide vo
väčšine prípadov o určenie veľkosti. Môžete použiť tieto kľúčové slová BYTE,
CODEPTR, DATAPTR, DWORD, FWORD, PWORD, QWORD, TBYTE, WORD, ABS, alebo meno
štruktúry. Count určuje, koľko položiek (items) má externý
symbol, ide o nepovinný parameter.