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.
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:
Pentru o procedura scrisa in limbaj de asamblare si apelata din programul pascal, trebuie facute urmatoarele:
assume cs:_TEXT assume ds:_DATA
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.
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
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):
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 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.
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.