Programe din mai multe module

Subprograme in limbajul de asamblare

Limbajul de asamblare nu recunoaste notiunea de subprogram. Putem insa crea o secventa de instructiuni care sa poata fi apelata din alte zone ale programului si dupa terminarea ei sa returneze controlul programului apelant.

Apelul unei "proceduri" se poate face cu o instructiune jmp. Problema este insa ca procesorul nu tine minte de unde a fost trimis la "procedura" si prin urmare nu stie unde sa revina la terminarea procedurii. Este necesar deci ca la apelul unei proceduri sa salvam undeva adresa de revenire, iar revenirea din procedura este de fapt o instructiune de salt la acea adresa.

Locul unde se salveaza adresa de revenire este asa-zisa stiva de executie. Este nevoie de o stiva deoarece o procedura poate apela o alta procedura, acea procedura poate apela alta, s.a.m.d.

Exista doua instructiuni: call si return.

Instructiunea call, avand sintaxa


este de fapt o instructiune jmp care in plus introduce in varful stivei adresa instructiunii care urmeaza (adica cea care vine imediat dupa call, si nu destinatia saltului produs de instructiunea call).

Instructiunea ret extrage din varful stivei o adresa si executa un salt la acea adresa. Instructiunea nu are argumente deoarece adresa la care sare este extrasa din varful stivei (nu este data explicit).

Stiva trebuie declarata ca un segment cu tipul stack si trebuie rezervat spatiu pentru ceea ce se va depozita acolo. Exemplu:

stiva segment stack
  db 512 dup (?)
stiva ends
Aici se declara un segment de 512 octeti spre a fi folosit pentru stiva.

Stiva se poate folosi si pentru memorarea (temporara) a variabilelor programului. Instructiunea push introduce operandul in varful stivei, iar instructiunea pop extrage varful stivei si-l scrie in registrul sau locatia de memorie data ca operand.

De notat ca subprogramele nu au variabile locale sau etichete locale. Toate numele sunt vizibile in intregul program, prin urmare trebuie sa avem grija sa nu existe etichete cu acelasi nume in programul principal si in subprograme. Exemplu
A se vedea exemplul ex1.asm.

Programe din mai multe module

Un program scris in limbaj de asamblare poate fi impartit in mai multe fisiere sursa. Pentru a scrie un program din mai multe fisiere sursa trebuie sa respectam urmatoarele:

Fiecare modul se va asambla separat (cu comanda tasm), apoi modulele se vor lega impreuna cu comanda

executabilul rezultat avand numele primului modul.

Exemplu
pp.asm tipar.asm