Procedura (subrutina) este unitatea funcțională de bază a descompunerii (împărțirea în mai multe părți) a unei sarcini. Procedura este un grup de instrucțiuni pentru rezolvarea unei submăsuri specifice și are mijloacele de a obține controlul din punctul de a apela o sarcină cu o prioritate mai mare și a reveni la acest punct de control. În cel mai simplu caz, programul poate consta într-o singură procedură. Procedura poate fi, de asemenea, definită ca un set de instrucțiuni bine formate, care, odată descris, poate fi apelat, dacă este necesar, oriunde în program.
O funcție este o procedură care poate returna o valoare.
Procedurile sunt valoroase prin faptul că pot fi activate oriunde în program. Procedurile pot fi transmise câteva argumente, care permit, având o copie a codului în memorie și schimbarea acestuia pentru fiecare caz de utilizare specific, înlocuind valorile cerute ale argumentelor.
Pentru a descrie secvența de comenzi sub forma unei proceduri în limba de asamblare, se folosesc două directive: PROC și ENDP.
Sintaxa descrierii procedurii este:
Denumire proceduri PROC proceduri PROC limba distanță
; proceduri corporale
Denumirea procedurii ENDP
În antetul procedurii (directiva PROC), trebuie doar să specificați numele procedurii. Distanta de atribut poate avea valori apropiate sau de departe si caracterizeaza posibilitatea de a accesa o procedura dintr-un alt segment de cod. În mod implicit, atributul distance ia valoarea apropiată. iar această valoare este utilizată la selectarea unui model plat cu memorie FLAT.
Procedura poate fi plasată oriunde în program, dar nu este lovită accidental de către conducere. Dacă procedura este pur și simplu introdusă în fluxul comun de comenzi, microprocesorul va trata comenzile procedurii ca parte a acestui fir. Având în vedere această circumstanță, există următoarele opțiuni pentru plasarea procedurii în program:
- la începutul programului (înainte de prima comandă executabilă);
- la final (după comanda care readuce controlul asupra sistemului de operare);
- versiune intermediară - corpul procedurii este localizat în interiorul altei proceduri sau programe principale;
- într-un alt modul.
Plasarea unei proceduri la începutul segmentului de cod presupune că secvența de comandă este limitată la o pereche de directive PROC și ENDP. va fi plasat în fața mărcii care desemnează prima comandă cu care începe programul. Această etichetă trebuie specificată ca parametru al directivei END. indicând sfârșitul programului:
.cod
myproc proc aproape
putrezi
myproc endp
începe proc
apelarea meaproc
.
start endp
Începeți sfârșitul
Plasarea procedurii la sfârșitul programului presupune că secvența de comandă este limitată de directivele PROC și ENDP. va fi plasat după comanda care readuce controlul asupra sistemului de operare.
.cod
începe proc
apelarea meaproc
.
start endp
myproc proc aproape
putrezi
myproc endp
Începeți sfârșitul
O variantă intermediară a localizării corpului procedurii presupune plasarea sa într-o altă procedură sau program principal. În acest caz, este necesar să se prevadă o ocolire a procedurii, limitată de directivele PROC și ENDP. folosind comanda de jump necondiționată jmp:
.cod
începe proc
jmp ml
myproc proc aproape
putrezi
myproc endp
ml:
.
start endp
Începeți sfârșitul
Ultima variantă a locației descrierilor procedurilor - într-un modul separat - presupune că procedurile utilizate frecvent sunt extrase într-un fișier separat. Fișierul procedurii trebuie formatat ca fișier sursă normală și difuzat pentru a obține codul obiect. Ulterior, acest fișier obiect este combinat cu fișierul în care procedurile sunt utilizate în faza de legătură. Această metodă presupune prezența în codul sursă al programului a altor elemente legate de caracteristicile implementării conceptului de programare modulară în limba de asamblare. Varianta aranjării procedurilor într-un modul separat este, de asemenea, utilizată în construcția de aplicații Windows bazate pe funcții API.
Deoarece numele procedurii are aceleași atribute ca și eticheta din comanda de tranziție, puteți accesa procedura utilizând orice comandă de salt cu condiție sau necondiționată. Dar datorită unui mecanism special pentru procedurile de apelare, puteți salva informații despre contextul programului în momentul apelării procedurii. Contextul este informația despre starea programului în momentul apelării procedurii. În sistemul de instruire al microprocesorului, există două comenzi care funcționează cu contextul. Acestea sunt comenzile de apel și ret:
- apelați ProcedureName @num este un apel de procedură (subrutină).
- ret numărul - control de întoarcere la programul apelant.
Numărul este un parametru opțional care indică numărul de octeți șterși din stivă la întoarcerea din procedură.
@ este numărul de octeți care ocupă argumentele transmise procedurii pentru procedură (parametrul este o caracteristică a utilizării traducătorului MASM).
Combinarea procedurilor din diferite module
O atenție deosebită ar trebui acordată plasării procedurii într-un alt modul. Deoarece un modul separat este un obiect autonom funcțional, acesta nu cunoaște nimic despre aranjarea internă a altor module și invers, alte module nu cunosc nimic despre dispozitivul intern al acestui modul. Dar fiecare modul trebuie să aibă astfel de mijloace prin care să notifice translatorul că un obiect (procedură, variabilă) ar trebui să fie vizibil în afara acestui modul. În schimb, trebuie să explicați traducătorului că un obiect este în afara acestui modul. Acest lucru va permite traducătorului să formeze corect instrucțiunile mașinii, lăsând unele câmpuri necompletate. Mai târziu, la etapa de conectare, acesta configurează modulele și permite conectarea tuturor legăturilor externe din module.
Aici numele este identificatorul definit în celălalt modul. Identificatorul poate fi:
- numele variabilelor;
- numele procedurilor;
- numele constantelor.
- Dacă numele este numele variabilei, tipul poate lua valori. cuvânt. DWORD. qword și tbyte;
- dacă numele este numele procedurii, tipul poate lua valori aproape sau departe; În compilarea MASM, după numele procedurii, trebuie să specificați numărul de octeți din stiva care ocupă argumentele funcției:
extern p1 @ 0: aproape
Exemplu de utilizare a directivelor externe și publice pentru două module
Modulul 1
.586
. model plat, stdcall
. date
extern p1 @ 0: aproape
.cod
începe proc
sunați p1 @ 0
putrezi
start endp
Începeți sfârșitul