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:
1. Zabúda sa na inštrukciu RET,
2. Ukončenie procedúry ENDP.

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 | LOCAL | USES | LOGALS, NOLOCALS | PUBLIC | EXTRN


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.