Programe mixte Turbo Pascal -- asamblare

In general un program poate fi alcatuit din module scrise in limbaje de programare diferite. In acest fel, fiecare modul poate fi scris intr-un limbaj adecvat cerintelor. Spre exemplu, un modul care are nevoie de operatii de nivel coborat poate fi scris in limbaj de asamblare, iar restul programului se poate scrie in Pascal.

Pentru a putea lega impreuna module scrise in limbaje diferite, trebuie respectate anumite conventii pentru ca modulele sa "se inteleaga" unul cu altul.

Conventii Turbo Pascal

1. Legarea modulelor

Intotdeauna programul principal trebuie sa fie scris in Turbo Pascal. Modulele pot fi unit-uri (scrise in Pascal) sau module scrise in limbaj de asamblare.

Modulele scrise in limbaj de asamblare se vor scrie si asambla (adica se vor genera fisiere obj. Pentru a le lega in executabilul final, pentru fiecare modul in asamblare se va pune in programul principal sau int-un unit o directiva {$L nume-modul.obj}.

Modulele scrise in asamblare vor avea:

2. Apelul procedurilor

Pentru o procedura scrisa in limbaj de asamblare si apelata din programul pascal, trebuie facute urmatoarele:

Pentru ca o procedura scrisa in pascal as poata fi apelata dintr-un modul scris in asamblare, este necesar ca in modulul in asamblare numele acelei proceduri sa faca obiectul unei decalratii extrn.

3. Variabilele globale

Variabilele globale Turbo Pascal se aloca in segmentul _DATA. Adresa acestui segment este incarcata la inceputul programului in ds.

Orice secventa de instructiuni in limbaj de asamblare trebuie sa conserve continutul lui ds (daca il modifica, trebuie sa-l refaca).

Din module scrise in asamblare se pot accesa variabilele globale declarate in pascal. Pentru aceasta, numele lor vor fi declarat in modulul in asamblare ca simboluri externe

4. Stiva de executie

Stiva este initializata de programul principal. Stiva este folosita de procedurile Pascal:

Procedurile scrise in Turbo Pascal folosesc stiva in modul urmator (vezi figura de mai sus):

  1. Procedura apelanta introduce pe stiva parametrii pentru apel.
  2. Procedura apelanta apeleaza procedura apelata prin executia unei instructiuni call. Aceasta instructiune introduce pe varful stivei adresa de revenire
  3. La inceperea executiei procedurii apelate, varful stivei este cel marcat in figura (adresa varfului stivei se tine in registrul SP).
  4. Procedura apelata incepe prin a salva pe stiva valoarea din registrul BP. Apoi copiaza valoarea registrului SP in registrul BP.
  5. In continuare, procedura apelata aduna la valoarea lui SP numarul de octeti necesari pentru memorarea variabilelor sale locale. In acest fel, pe stiva s-a creat loc pentru variabilele locale. Oricine va folosi in continuare stiva, va introduce noi obiecte pe stiva, si deci nu va folosi in alte scopuri spatiul rezervat pentru variabilele locale ale procedurii curente
  6. Adresele parametrilor si adresele variabilelor locale se calculeaza relativ la valoarea lui BP
  7. Secventa de terminare a procedurii apelate incepe prin a copia in registrul SP valoarea din BP. In acest fel varful stivei revine la adresa la care a fost salvat vechiul continut al lui BP in timpul pasului 4, si ca urmare spatiul alocat variabilelor locale este eliberat
  8. Apoi procedura apelata ia de pe stiva valoarea registrului BP.
  9. In final, prin instructiunea ret, varianta cu parametru, procedura apelata reda controlul secventei apelante, eliberand totodata zona in care au fost pusi parametrii de apel.
Programul apelant pune pe stiva parametrii de trimis. Parametrii de tip byte, shortint, word, integer, char, boolean sau enumerat transmisi prin valoare se pun direct pe stiva, pe 2 octeti. Parametrii de tip longint sau pointer, transmisi prin valoare, se pun pe stiva pe 4 octeti. Pentru parametrii de alte tipuri, sau pentru parametrii transmisi prin referinta, se pune pe stiva adresa (far) a parametrului actual. Daca este vorba de un parametru transmis prin valoare, procedura apelata il va copia local daca este cazul (adica daca il modifica).

Parametrii sunt pusi pe stiva in ordinea in care figureaza in declaratia procedurii (primul parametru este primul pus pe stiva, si deci este cel mai "adanc" in momentul in care functia primeste efectiv controlul.

Un exemplu

Un exemplu este continut in fisierele pp.pas si suma.asm.

De notat ca pentru a accesa parametrii pasati de programul principal, se pune in registrul bp adresa varfului stivei si apoi toti parametrii se adreseaza relativ la bp.

De notat de asemenea ca procedura apelata trebuie sa descarce parametrii de pe stiva.

Asamblorul integrat

Turbo Pascal permite inserarea de secvente de instructiuni in limbaj de asamblare printre instructiunile pascal. Aceste secvente se introduc in blocuri delimitate de cuvintele-cheie asm si end. Sintaxa lor este putin diferita fata de sintaxa "obisnuita" a limbajului de asamblare: spre exemplu comentariile trebuie sa fie dupa regulile pascal (intre { si }), etc.

De asemenea, exista cateva restrictii suplimentare de "colaborare" cu compilatorul: nu avem voie sa modificam (sau daca modificam, trebuie sa refacem) registrii cs, ds, ss, bp.

Variabilele globale sunt accesibile atat timp cat nu modificam registrul ds. Variabilele locale sunt accesibile atat timp cat nu modificam registrul bp.

Pentru mai multe amanunte, consultati help-ul mediului Turbo Pascal.

Un exemplu este disponibil in fisierul pp1.pas.