PROCEDURY

Ak by som mal definovat pojem procedura, prve co by ma napadlo by asi bolo, ze je to podprogram, t.j. program, ktory vykonava nejaku specificku cinnost i ked nemusi to byt pravidlom. Procedury sa najcastejsie pouzivaju tam, kde sa casto opakuje blok programu. Procedura suvisi s instrukciou CALL, ktora sa pouziva na jej volanie. Jednoducho napisete CALL meno_procedury.

Syntax:
meno PROC [jazyk] [typ]
[USES items,] [argument [,argument]...]
RETURNS [argument [,argument]...]
Sem treba vlozit blok programu.
RET
meno ENDP

Jazyk moze byt jedna z nasledujucich variant: BASIC, C, CPP, FORTRAN, PASCAL, PROLOG, SYSCALL, NOLANGUAGE. Typ moze byt FAR alebo NEAR. Items je zoznam registrov a jednoduchych symbolov, ktore budu v procedure pouzite. Cely zoznam je pri vstupe do procedury ulozeny do zasobnika a pri ukonceni procedury znova obnoveny, t.j. vybraty zo zasobnika. Jednotlive prvky zoznamu je potrebne od seba oddelit medzerou. Klucove slovo RETURNS urcuje jednu, alebo viac poloziek, ktore nebudu pri navrate zprocedury odstranene zo zasobnika.

Medzi caste chyby pri pouzivani procedur patria:
1. Zabuda sa na instrukciu RET,
2. Ukoncenie procedury ENDP.

Preto si vzdy skontrolujte ci je procedura ukoncena instrukciou RET a nasledne ENDP. V prvom pripade vas ani prekladac na chybajucu instrukciu neupozorni.

V bloku PROC...ENDP mozeme pouzivat nasledujuce direktivy:

ARG | LOCAL | USES | LOGALS, NOLOCALS | PUBLIC | EXTRN


ARG - direktiva sa pouziva pri definovani procedury a urcuje parametre tejto procedury ulozene v zasobniku pred navratovou adresou. Zvyhodnuje pristup k tymto parametrom, ktore by sa inak museli adresovat ako data (pomocou registra BP). POZOR!!! Ulozenie jednotlivych argumentov v zasobniku je rozne, podla pouziteho jazyka.

Syntax: ARG argument [,argument] ...[=size]

[RETURNS argument [,argument]]

Konstanta size obsahuje celkovu velkost dat. RETURNS urcuje jednu, alebo viac poloziek, ktore nebudu pri navrate z procedury odstranene zo zasobnika.

LOCAL - direktiva sluzi na definovanie lokalnych premennych v procedure.

Syntax: LOCAL localdef [,localdef] [=size]

USES - sa pouziva v bloku PROC...ENDP a urcuje, ktore data a registre budu pri vstupe do procedury ulozene do zasobnika a pri vystupe z procedury vybrate zo zasobnika.

Syntax: USES item [,item]

Priklad:

;Takto vyzera procedura pred

;aplikovanim direktivy USES

CLS1

PROC C NEAR

 

USES AX,BX,CX,DX

 

MOV AX,0003

 

INT 10H

 

RET

CLS1

ENDP

 

;Po aplikovani vzniknu

;viditelne zmeny v procedure

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 - tato direktiva povoluje pouzivanie lokalnych symbolov v bloku PROC...ENDP. Kazdy symbol musi zacinat dvojznakom. Ak tento dvojznak nebude uvedeny, potom musi zacinat implicitnym dvojznakom "@@". Direktiva NOLOCALS zakazuje pouzivanie lokalnych symbolov.

Syntax: LOCALS [prefix]

Priklad:

 

LOCALS AB

VYPIS

PROC NEAR

ABX10:

MOVSB

 

STOSB

 

LOOP ABX10

 

RET

VYPIS

ENDP

Vysledkom toho je, ze navestie "abx10" mozete pouzit v programe viackrat. Pri pouziti direktivy LOCALS je platnost navestia len v ramci procedury. To je pricina, preco mozete pouzit to iste navestie viackrat. Ak by ste vsak direktivu LOCALS nepouzili prekladac ohlasi chybu Symbol already defined (Symbol bol uz raz definovany).

Este nam zostali dve direktivy. Su to EXTRN a PUBLIC. Tieto dve zdoposial uvedenych sa pravdepodobne pouzivaju (v beznej praxi) najcastejsie.

PUBLIC - direktiva oznacuje symbol, ktory ma byt viditelny z inych modulov. PUBLIC sa pouziva na zverejnovanie mien premennych, konstant, programovych navesti atd.

Jazyk moze byt napr.: C, PASCAL, BASIC, FORTRAN, alebo PROLOG.

Syntax: PUBLIC [jazyk] symbol [,[jazyk] symbol]...

EXTRN - direktiva oznamuje prekladacu a linkeru, ze dany symbol je definovany v inom module.

Syntax: EXTRN definition [,def...]

Definicia ma tento tvar: [jazyk] name : type [:count], kde jazyk moze byt napr.: C, PASCAL, BASIC, FORTRAN, alebo PROLOG. Name je symbol, ktory je definovany v inom module. Typ moze byt NEAR, FAR, PROC. Typ PROC urcuje, ze sposob volania je zavisly na pouzitom pamatovom modeli. V pripade dat ide vo vacsine pripadov o urcenie velkosti. Mozete pouzit tieto klucove slova BYTE, CODEPTR, DATAPTR, DWORD, FWORD, PWORD, QWORD, TBYTE, WORD, ABS, alebo meno struktury. Count urcuje, kolko poloziek (items) ma externy symbol, ide o nepovinny parameter.