1 / 25

Implementarea apelului de subprograme

Implementarea apelului de subprograme. (in limbajele Pascal si C). Rezumat. Cod de apel, cod de intrare, cod de iesire Implementarea subprogramelor in Turbo Pascal Modele de memorie Harta memoriei Turbo Pascal Cod de apel – transmiterea parametrilor

aisha
Download Presentation

Implementarea apelului de subprograme

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Implementarea apelului de subprograme (in limbajele Pascal si C)

  2. Rezumat • Cod de apel, cod de intrare, cod de iesire • Implementarea subprogramelor in Turbo Pascal • Modele de memorie • Harta memoriei Turbo Pascal • Cod de apel – transmiterea parametrilor • Cod de intrare – intoarcerea rezultatului de catre functii • Cod de iesire • Implementarea subprogramelor in Borland C • Cod de apel – transmiterea parametrilor • Cod de intrare – intoarcerea rezultatului de catre functii • Cod de iesire

  3. Codul de apel (1) • Cod ce se executa inainte de apelul efectiv al subprogramului • Cuprinde urmatoarele actiuni: • daca subprogramul apelat este o functie care intoarce un string, se va pune in stiva adresa stringului rezultat (segment:offset) • punerea parametrilor in stiva • executia unei instructiuni CALL pentru apelarea propriu-zisa a subprogramului, care are ca si efect salvarea in stiva a adresei de revenire (far (segment:offset) sau near (offset), in functie de tipul de apel al subprogramului)

  4. Codul de apel (2) push seg (rez) ;punerea în stivă a adresei stringului rezultat push offset (rez) ;(numai pentru funcţiile care întorc string) sub sp, parametri ;valoarea lui sp (adresa primului cuvant liber din stiva) se modifica, ;scazandu-se atatia octeti cati sunt necesari pentru depunerea parametrilor ;in stiva push seg (adr_revenire) ;memorarea in stiva a adresei de revenire (far sau near) push offset (ard_revenire) jmp adr_subprogram ;salt la corpul subprogramului

  5. SP Stackframe-ul programului apelant SP offset revenire adr. seg. revenire offset şir rezultat adr. seg. şir rezultat parametri Stackframe-ul programului apelant Codul de apel (3) Stiva inainte de apelul functiei Stiva dupa apelul functiei

  6. Cod de intrare (1) • Cod care se executa la intrarea in subprogram, inainte de executia primei instructiuni a subprogramului • Consta din urmatoarele actiuni: • izolarea stivei, adica definirea bazei zonei de stiva (stackframe) utilizate la executia subprogramului • alocarea de spatiu pe stiva pt eventualul rezultat de tip diferit de string intors de acest subprogram • alocare spatiu pe stiva si realizarea copiilor locale pt parametrii de dimensiune > 4 octeti transmisi prin valoare si pt care nu s-a realizat copierea pe stiva in codul de apel • alocare spatiu pe stiva pt date locale • alocarea spatiu pe stiva pt rezultatul de tip string intors de functii apelate din subprogram

  7. Cod de intrare (2) push bp ; salvam BP pe stiva, pt a putea fi restaurata in codul de iesire mov bp,sp ; BP va indica acum baza zonei de stiva (stackframe) sub sp,n ; alocare de spatiu pe stiva pt eventualul rezultat diferit de string (n - dimensiunea ; rezultatului) sub sp,100h ; alocarea de spatiu in stiva pentru realizarea copiilor locale ale parametrilor de tip ; string transmisi prin valoare … ; realizarea copiei locale in spatiul alocat anterior sub sp,locale ; alocarea pe stiva a ‘locale’ octeti pt datele locale sub sp,100h ; alocare de spatiu pe stiva pt rezultatul de tip string intors de functii apelate din acest ; subprogram

  8. SP BP-200h-locale 256 octeţi pentru rezultatul de tip string întors de o funcţie apelată din interiorul acestui subprogram BP-100h-locale Variabilele locale Variabile locale BP-100h 256 octeţi pentru copia parametrului de tip string transmis acestei funcţii prin valoare * Rezultat diferit de string BP iniţial offset revenire adr. seg. revenire offset string rezultat adr. seg. string rezultat BP+0 BP BP+2 Adresa de revenire Efect al codului de apel Parametri transmişi (n octeţi) Parametri BP+6 Adresa zonei de memorie unde va fi stringul rezultat întors de către această funcţie * BP+6+n Stackframe-ul programului apelant Cod de intrare (3) Stiva dupa intrarea in subprogram

  9. Cod de iesire (1) • Cod care se executa la iesirea din subprogram, dupa executia ultimei instructiuni din subprogram • Consta din urmatoarele actiuni: • refacerea stivei astfel incat registrii care o caracterizeaza (SS, SP si BP) sa aibe valorile pe care le-au avut inainte de intrarea in functie • scoaterea de pe stiva a parametrilor si revenirea in codul apelant (desigur, se scoate de pe stiva si adresa de revenire)

  10. Codul de iesire (2) mov sp,bp ;refacerea valorii lui SP pop bp ;refacerea lui BP, eliberarea stivei de spatiul ocupat in cadrul ;codului de intrare ret parametri ;revenirea din subprogram si scoaterea de pe stiva a parametrilor ;(‘parametri’ octeti) Apelatorul mai trebuie sa scoata de pe stiva adresa stringului rezultat (add sp, 004).

  11. SP offset revenire adr. seg. revenire offset şir rezultat adr. seg. şir rezultat parametri SP offset şir rezultat adr. seg. şir rezultat Stackframe-ul programului apelant Stackframe-ul programului apelant Cod de iesire (3) Stiva dupa refacere Stiva dupa revenirea din subprogram

  12. Implementarea subprogramelor in Turbo Pascal. Modele de memorie • Modelele de memorie acceptate de Turbo Assembler 2.0: • tiny : un singur segment ce contine si date si cod (pt progame .com) • small : un segment de cod si un segment de date (cel mai utilizat) • medium : mai multe segmente de cod, un segment pt. date+stiva • compact : un segment de cod, mai multe segmente de date, mai multe segmente de stiva • large : mai multe segmente pt cod, date si stiva • huge : similar cu large (diferente in dimensiunea datelor care pot fi declarate in segmentul de date)

  13. Harta memoriei Turbo Pascal Limita superioara a memoriei DOS

  14. Cod de apel – transmiterea parametrilor (1) • apelul poate fi far sau near • parametrii se pun pe stiva in ordinea in care apar, de la stanga la dreapta • pt. parametrii transmisi prin valoare reprezentati pe 1, 2 sau 4 octeti, se pune pe stiva valoarea parametrului (daca parametru e octet pe stiva se pune un cuvant al carui octet inferior este valoarea parametrului; daca parametrul este pe 4 octeti, pe stiva se pun 2 cuvinte cu valoarea lui, intai cuvantul superior) • pt. parametrii transmisi prin referinta si pt. parametrii transmisi prin valoare reprezentati pe > 4 octeti (ex. string, array) pe stiva se pune adresa acestora (far sau near)

  15. Cod de apel – transmiterea parametrilor (2)

  16. Cod de apel – tipuri de apel • Se vor apela FAR: • subprograme declarate in sectiunea interface a unui unit • subprograme declarate in urma unei directive de compilare {$F+} sau declarate cu directiva FAR • subprograme declarate la nivelul cel mai exterior al unui program, daca compilarea se face cu optiunea de apel FAR implicit • Se vor apela NEAR: • subprograme declarate la nivelul cel mai exterior al unui program, daca compilarea se face fara optiunea de apel FAR implicit • subprograme declarate folosind directiva NEAR sau care nu urmeaza dupa un {$F+} • subprograme declarate in sectiunea implementation

  17. Cod de intrare – intoarcerea rezultatului de catre functii • rez. intreg: • pe 1 octet -> AL • pe 2 octeti -> AX • pe 4 octeti -> DX:AX • rez. real -> DX:BX:AX • rez. reprezentat in virgula flotanta -> registrii coprocesorului numeric • rez. string : intr-o zona de memorie a carei adresa este plasata (de catre codul de apel) pe stiva inainte de parametrii actuali • rez. pointer : in DX – segmentul, in AX - offsetul

  18. Exemplu program Exemplu1; var AY: Byte; AS, S: String; Procedure A (X: Integer; var Y:Byte; S: String); 1 begin 2 Y := Lo(X); 3 end; Function B(N: Integer): String; var T: Real; 4 begin 5 B[0] := Chr(N); 6 end; 7 begin 8 A(5, AY, AS); 9 S := B(7); 10 end.

  19. Cod de apel - exemplu • Codul de apel generat in linia 8 ( A(5, AY, AS) ): mov ax, 0005h push ax ; pune in stiva valoarea parametrul X mov di, 0050h ; di <- deplasamentul lui AY în segmentul de date push ds ; pune in stiva adresa de segment a lui AY push di ; pune in stiva offset-ul lui AY mov di, 0052h ; di <- offset-ul lui AS push ds ; pune in stiva adresa de segment a lui AS push di ; pune in stiva offset-ul lui AS call EXEMPLU1.A; apelul efectiv

  20. Cod de intrare – exemplu (1) • Codul de intrare generat la intrare in procedura A (linia 1): push bp mov bp, sp ; izolarea stivei mov ax, 0100h call 689C:02CDh sub sp, 0100h ; alocare spatiu pe stiva pt copia locala a parametrului de tip string mov bx, ss ; transmis prin valoare mov es, bx mov bx, ds cld lea di, [bp-100] lds si, [bp+4] lodsb stosb xchg cx, ax xor ch, ch rep movsb mov ds, bx ; copierea propriu-zisa a stringului pe stiva

  21. Cod de intrare – exemplu (2) • Cod de intrare generat la intrarea in functia B (linia 4): push bp mov bp, sp mov ax, 0006 call 689Ch:02CDh sub sp, 0006; alocare spatiu pt variabila de tip real • Cod de apel generat pt functia B (linia 9): lea di, [bp-0100h] push ss push di; punerea pe stiva a adresei pt rezultat de tip string mov ax, 0007 push ax call EXEMPLU1.B add sp, 0004; scoaterea de pe stiva a adresei rezultatului

  22. Cod de iesire - exemplu • Cod de iesire din procedura A (linia 3): mov sp, bp pop bp ret 000Ah; scoaterea de pe stiva a 10 octeti • Cod de iesire din functia B (linia 6): mov sp, bp pop bp ret 0002; scoaterea de pe stiva a 2 octeti

  23. Implementarea subprogramelor in Borland C. Cod de apel • Apelul este FAR sau NEAR in functie de modelul de memorie folosit • Parametrii se transmit numai prin valoare • Parametrii de pun in stiva de la dreapta la stanga • pe stiva se pune 1 cuvant pt. char, enum, int, pointer near • pe stiva se pune 2 cuvinte pt. date reprezentate pe 4 octeti ca long si pointeri far • parametrii reali (float, double si long double) si struct se copiaza pe stiva

  24. Cod de intrare • Compilatorul scutit de generare de cod care sa copieze local pe stiva parametrii transmisi prin valoare cu dimensiunea mai mare de 4 octeti • Intoarcerea rezultatului de catre functii se face asemanator cu intoarcerea rezultatului in Pascal

  25. Cod de iesire • Scoaterea parametrilor de pe stiva revine apelantului • Exemplu de cod iesire generat: mov sp, bp pop bp ret

More Related