Documente Academic
Documente Profesional
Documente Cultură
8 Programarea multimodul
Directiva PUBLIC - exporta simboluri definite n modulul asamblare n alte module PUBLIC [limbaj] simbol {,[limbaj] simbol}
nume de proceduri nume de variabile de memorie etichete definite cu ajutorul directivelor EQU sau =, ale cror valori se reprezint pe 1 sau 2 octei.
Directiva EXTRN - face vizibile n modulul curent simboluri definite n alte module EXTRN definiie {,definiie}
ABS, BYTE, DATAPTR, DWORD, NEAR, FAR, FWORD, PROC, QWORD, TBYTE, UNKNOWN, WORD
End start
End
End
- fiecare modul are n final o directiv END - numai directiva END a modulului ce conine instruciunea de la care programul trebuie s-i nceap execuia va conine specificarea adresei de start.
Exemplu
Modulul main.asm Declaratii variabile Sir1 db Sir2 db SirFinal db public SirFinal Modulul sub.asm Declaratii variabile extrn SirFinal: byte
Modulul secundar sub.asm: .MODEL SMALL .DATA EXTRN SirFinal:BYTE ; se poate nlocui cu GLOBAL SirFinal:BYTE .CODE PUBLIC Concatenare Concatenare PROC cld mov di, SEG SirFinal mov es, di mov di, OFFSET SirFinal ;es:di <- adresa irului final mov si, ax ; ds:si <- adresa primului ir Sir1Loop: lodsb ; al <- caracterul curent and al, al ; verific dac e zeroul final jz cont stosb ; dac nu, l pune n destinaie jmp Sir1Loop ; reia operaiile cont: mov si, bx ; ds:si <- adresa celuilalt ir Sir2Loop: lodsb stosb ; ncarc i zeroul final and al, al jnz Sir2Loop ret ; revenirea din procedur Concatenare ENDP END
.MODEL SMALL .STACK 200 .DATA Sir1 DB 'Buna ', 0 Sir2 DB 'dimineata!', '$', 0 SirFinal DB 50 DUP (?) PUBLIC SirFinal ; se poate nlocui cu GLOBAL SirFinal:BYTE .CODE EXTRN Concatenare:PROC Start: mov ax, @data mov ds, ax ; ncrcarea registrului ds mov ax, OFFSET Sir1 mov bx, OFFSET Sir2 call Concatenare ;SirFinal:=Sir1+Sir2 mov ah, 9 mov dx, OFFSET SirFinal int 21h ;tiprirea irului obinut mov ah, 4ch int 21h ; terminarea programului END Start
Cele dou module vor fi asamblate separat: TASM MAIN[.ASM] TASM SUB[.ASM] Editarea legturilor se va face: TLINK MAIN[.OBJ]+SUB[.OBJ] sau TLINK MAIN[.OBJ] SUB[.OBJ] Va rezulta un program executabil main.exe care, lansat n execuie, va tipri mesajul "Buna dimineata!".
Cerine ale editorului de legturi. Intrarea n procedur. Nealterarea valorilor unor regitri. Transmiterea i accesarea parametrilor. Alocarea de spaiu pentru datele locale (opional). ntoarcerea unui rezultat (opional). Revenirea din procedur.
- numele segmentelor sunt impuse de limbajele de nivel nalt cu care se face legtura; - orice simbol care este definit n modulul scris n limbaj de asamblare i se dorete a fi folosit n modulul scris n limbaj de nivel nalt trebuie fcut vizibil n acesta din urm, utiliznd directiva PUBLIC; - orice simbol care este definit n modulul scris n limbaj de nivel nalt i care va fi utilizat n modulul scris n limbaj de asamblare trebuie declarat ca extern n acesta din urm, utiliznd directiva EXTRN;
T u r b o A s s e m b l e r
Directiva de compilare $L (poate s apar oriunde n textul surs Pascal. ) {$L nume[.obj]} Fiierul nume.obj s ndeplineasc condiiile: - toate procedurile i funciile trebuie s se afle ntr-un segment numit CODE sau CSEG, sau ntr-un segment al crui nume se termin cu _TEXT; - toate datele iniializate trebuie s fie plasate ntr-un segment numit CONST sau ntr-un segment al crui nume se termin cu _DATA; - toate datele neiniializate trebuie s fie plasate ntr-un segment numit DATA sau DSEG, sau ntr-un segment al crui nume se termin cu _BSS; Declaraiilor de tip standard din Pascal le corespund, n limbaj de asamblare, urmtoarele tipuri: Integer WORD Real FWORD Single DWORD Pointer DWORD
*
T u r b o P a s c a l
T u r b o A s s e m b l e r
Turbo Pascal
- Un subprogram utilizat in programul Pascal dar definit ntr-un alt modul trebuie s fie declarat cu ajutorul directivei EXTERNAL (numai la nivelul cel mai exterior al programului sau unitii):
Turbo Assembler
Singurele obiecte care pot fi exportate dintr-un modul scris n limbaj de asamblare ntr-un program sau unitate Pascal sunt etichetele de instruciuni sau nume de proceduri declarate PUBLIC.
*
T u r b o P a s c a l
CODE SEGMENT AsmProc PROC NEAR PUBLIC AsmProc ... AsmProc ENDP AsmFunc PROC NEAR PUBLIC AsmFunc ... AsmFunc ENDP CODE ENDS END
T u r b o A s s e m b l e r
Turbo Assembler
- Un modul TASM poate accesa orice procedur, funcie, variabil sau constant cu tip declarat la nivelul cel mai exterior al unui program sau al unei uniti Pascal, inclusiv rutinele din biblioteci. Acest lucru se face cu ajutorul declaraiei EXTRN DATA SEGMENT ASSUME DS:DATA EXTRN A: BYTE EXTRN B: WORD EXTRN C: BYTE ... DATA ENDS CODE SEGMENT EXTRN ProcA:NEAR EXTRN FuncA:FAR ... ; aici pot fi utilizate variabilele a, b, c i pot fi apelate subprogramele ProcA, FuncA CODE ENDS
Turbo Pascal
... {variabile globale} Var a: Byte; b: Word; c: ShortInt; ... Procedure ProcA; ... {$F+} Function FuncA:Integer; ...
*
T u r b o P a s c a l
Intrarea n procedur.
Nealterarea valorilor unor regitri. Transmiterea i accesarea parametrilor. Alocarea de spaiu pentru datele locale (opional). ntoarcerea unui rezultat (opional). Revenirea din procedur.
- n momentul n care se face un apel de procedur sau funcie, apelatorul pune mai nti n stiv adresa de revenire, pe urm d controlul subprogramului apelat folosind pentru aceasta o instruciune CALL.
- Aceast adres de revenire poate s fie o adres FAR sau o adres NEAR, n funcie de modelul de memorie n care este compilat sau asamblat modulul.
- Este foarte important ca instruciunea de revenire din subprogram s execute o revenire care s corespund apelului.
- Dac se dorete apelarea dintr-un modul scris n limbaj de nivel nalt (respectiv limbaj de asamblare) a unui subprogram scris n limbaj de asamblare (respectiv limbaj de nivel nalt), editorul de legturi care leag cele dou module nu verific dac tipul apelului (far sau near) corespunde cu tipul revenirii. Aceast potrivire cade n sarcina programatorului.
- Limbajele de nivel nalt impun ca anumii regitri s-i pstreze la ieire valoarea cu care intr ntr-o procedur. - n acest scop, dac subprogramul, definit n limbaj de asamblare, modific unii dintre acetia, atunci valorile lor de intrare trebuie salvate (eventual n stiv). Ele vor fi restaurate nainte de revenirea din procedur.
Cerine ale editorului de legturi. Intrarea n procedur. Nealterarea valorilor unor regitri.
- prin referin NEAR: n stiv se pune, pe un cuvnt, offset-ul adresei; - prin referin FAR: n stiv se pun dou cuvinte; mai nti se pune segmentul, pe urm se pune offset-ul; - prin valoare: n stiv se pune valoarea parametrului.
BP=SP
offset j
adr. seg. j valoarea lui i
T u r b o A s s e m b l e r
Cerine ale editorului de legturi. Intrarea n procedur. Nealterarea valorilor unor regitri.
*
T u r b o P a s c a l
Real tip reprezentat n virgul flotant Pointer String tip mulime Array, Record
Cerine ale editorului de legturi. Intrarea n procedur. Nealterarea valorilor unor regitri. Transmiterea i accesarea parametrilor.
- Dac valoarea lor nu trebuie s se pstreze ntre dou apeluri consecutive ale procedurii atunci acestea vor fi alocate n segmentul de stiv i le vom numi date volatile. - n caz contrar spunem c este vorba despre date statice i spaiul pentru ele va fi alocat ntr-un segment diferit de segmentul de stiv, de exemplu n segmentul de date. Alocarea de spaiu pentru datele statice se face folosind directivele cunoscute DB, DW, DD .a. - Alocarea unui numr de n octei (n fiind numr par) pentru datele locale volatile se poate face cu urmtoarea instruciune: sub sp, n
Definire si alocare pt 2 variabile locale in cadrul unei proceduri externe TP (scrisa in limbaj de asamblare si utilizata in Turbo Pascal) push bp mov bp, sp sub sp, 4 minim EQU [bp-2] maxim EQU [bp-4] ... mov ax, 1 mov minim, ax mov maxim, ax
- prin intermediul registrilor, daca valoarea intoarsa este reprezentata pe mai putin de 4 octeti - exceptie: valorile de tip real, avnd lungimea de 6 octei, sunt returnate tot prin intermediul regitrilor (n DX:BX:AX). - dac valoarea ntoars este mai lung exist alte metode de transmitere a rezultatului ctre apelator
- rezultat real
- rezultat reprezentat n virgul flotant: n regitrii coprocesorului numeric; - rezultat string : ntr-o zon temporar alocat de Turbo Pascal n momentul compilrii programului care conine un apel de astfel de funcie; un pointer la aceast zon este pus n stiv nainte de a ncepe s pun parametrii. Acest pointer nu face parte din lista de parametri, deci nu afecteaz numrul de octei ce trebuie scoi din stiv la revenirea din procedur (vezi codul de ieire); - rezultat pointer: n DX se pune adresa de segment, iar n AX se pune deplasamentul.
Cerine ale editorului de legturi. Intrarea n procedur. Nealterarea valorilor unor regitri. Transmiterea i accesarea parametrilor. Alocarea de spaiu pentru datele locale (opional). ntoarcerea unui rezultat (opional).
- refacerea valorilor regitrilor - refacerea stivei astfel nct n vrf s conin adresa de revenire.
MOV SP, BP POP BP
- dac limbajul de nivel nalt pretinde apelatorului eliberarea spaiului ocupat n stiv de parametri, aceasta se face cu instruciunea ret n unde n este numrul de octei care sunt ocupai de ctre parametri
Exemplu
Modulul M1 (Turbo Pascal) Modulul M2 (asamblare)
Declaraii variabile
Declaraii variabile
function CitSir:string;far;
Apeluri subrutine
Apeluri subrutine
s:=CitSir; s := Asmf(s);
CitSir;
P.pas
directiva de compilare $L declararea funciei Asmf ca fiind extern; aceast funcie este definit n modulul scris n limbaj de asamblare dar va fi folosit n acest modul;
program TPandASM; var glob: string; s: string; {$L asmf.obj} function Asmf (s: string): string; far; external; function CitSir: string; far; var Strn: string; begin write ('Sirul: '); readln (Strn); CitSir := Strn; end; begin s := CitSir; glob := 'abc123'; s := Asmf(s); writeln(s); readln; end.
prezena directivei far indic modul de apel al acestui subprogram, i anume prin specificarea att a adresei de segment ct i a deplasamentului n cadrul acestui segment} nu este nevoie de prezena vreunei directive Turbo Pascal pentru a face aceast funcie vizibil n modulul scris n limbaj de asamblare, deoarece un modul scris n limbaj de asamblare poate accesa orice procedur, funcie, variabil sau constant cu tip declarat la nivelul cel mai exterior al unui program sau al unei uniti Pascal, inclusiv rutinele din biblioteci, prin folosirea declaraiei extrn n modulul asamblare
Asmf.asm
assume cs:_TEXT, ds:_DATA _DATA segment extrn glob:byte _DATA ends _TEXT segment declaraia variabilei glob, definit n modulul Turbo Pascal extrn CitSir: far Asmf proc far declaraia funciei CitSir, care a fost definit n modulul Turbo Pascal, dar public Asmf va fi folosit n modulul curent; tipul subrutinei este far push bp funcia Asmf este definit n acest modul dar va fi folosit n modulul mov bp, sp Turbo Pascal sub sp, 100h izolarea stivei sub sp, 100h rez equ dword ptr [bp+10] se aloc n stiv 100h octei pentru copia parametrului de tip copieSir equ byte ptr [bp-100h] string transmis prin valoare sloc equ byte ptr [bp-200h] push ds se aloc n stiv 100h octei pentru rezultatul de tip string ntors de ctre funcia CitSir, care va fi apelat n acest subprogram lds si, [bp+6] mov bx, ss mov es, bx lea di, copieSir cld mov cx, 00FFh rep movsb
pentru a se putea face legtura ntre acest modul i modulul scris n Turbo Pascal, modulul scris n limbaj de asamblare trebuie s ndeplineasc urmtoarele condiii: - toate procedurile i funciile trebuie s se afle ntr-un segment numit CODE sau CSEG, sau ntr-un segment al crui nume se termin cu _TEXT; - toate datele declarate trebuie s fie plasate ntr-un segment numit CONST sau ntr-un segment al crui nume se termin cu _DATA;
SP 256 octei pentru rezultatul de tip string ntors de funcia CitSir 256 octei pentru copia parametrului de tip string transmis funciei Asmf BP Adresa de revenire Adresa irului transmis ca parametru Adresa zonei de memorie unde va fi stringul rezultat ntors de ctre funcia Asmf BP iniial offset adr. revenire seg. adr. revenire offset s adr. seg. s offset rez adr. seg. rez
BP-200h (sloc) Efect al codului de intrare n Asmf, scris explicit de catre programator pentru ca procedura este scrisa in asamblare si codul de intrare nu este generat automat
BP-100h (copieSir)
Efect al codului de apel al funciei Asmf, generat automat de catre compilatorul Turbo Pascal pentru ca apelul subprogramului are loc in Turbo Pascal
Asmf.asm
push ss lea ax, sloc push ax call CitSir
spaiul pentru irul rezultat este alocat n stiv, aadar adresa de segment a irului rezultat este ss salvm n stiv aceast adres si deplasamentul apelul funciei CitSir, care citete un ir i l depune la adresa ss:sloc
. . . offset adr. revenire seg. adr. revenire offset sloc adr. seg. sloc (SS) . . .
Efect al codului de apel al funciei CitSir (fa de apelul funciei Asmf, aici lipsesc parametri deoarece CitSir nu are parametri), scris explicit de catre programator pentru ca procedura este apelata in asamblare si codul de apel nu este generat automat Stackframe-ul rutinei apelante Asmf (vezi figura 8.2.)
Asmf.asm
pop ax pop ax les di, rez cld mov bx, ss mov ds, bx lea si, copieSir mov ch, 0 mov cl, byte ptr [si] inc si push di inc di cmp cx, 10 jb et1 mov cx, 10 et1: rep movsb push ss pop ds lea si, sloc mov cl, byte ptr [si] inc si cmp cx, 10 jb et2
eliberarea zonei din stiv n care s-a pus adresa irului rezultat este responsabilitatea apelatorului alternativ add sp, 4
instruciunea movsb se va executa de cx ori; aceast instruciune copiaz la adresa es:di (unde se afl irul rezultat) un octet de la adresa ds:si (unde se afl copia irului transmis ca parametru)
n continuare vom copia n irul rezultat primele 10 caractere din irul returnat de ctre funcia CitSir (irul sloc) n acest scop, ncrcm n ds:si adresa de nceput a irului sloc
Asmf.asm
et2: rep movsb lea si, glob mov ax, _DATA mov ds, ax mov cl, byte ptr [si] inc si cmp cx, 10 jb et3 mov cx, 10 et3: rep movsb pop ax mov bx, di sub bx, ax dec bx les di, rez mov es:[di], bl pop ds mov sp, bp pop bp ret 4 asmf endp _TEXT ends end
refacem valorile lui sp i bp (parte a codului de ieire din subrutina Asmf cu aceast ocazie se elibereaz cei 200h octei alocai pentru stringul ntors de CitSir i pentru copia parametrului transmis ctre Asmf ieire din funcie cu scoaterea din stiv a 4 octei (este vorba despre scoaterea din stiv a parametrului 2 octei pentru adresa de segment i 2 octei pentru deplasament) eliberarea spaiului din stiv ocupat de parametri face parte tot din codul de ieire din subrutin
Cod de iesire din functia Asmf, scris explicit de catre programator, deoarece functia este scrisa in asamblare si codul de iesire nu este generat automat