Documente Academic
Documente Profesional
Documente Cultură
8
Programarea
multimodul
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.
End start
Modul 2
End
Modul 3
End
Exemplu
Modulul main.asm
Modulul sub.asm
Declaratii variabile
Declaratii variabile
Sir1 db
Sir2 db
SirFinal db
public SirFinal
Declaratii subrutine
Declaratii subrutine
extrn Concatenare:near
Concatenare proc
(Sir1, Sir2): byte;
public Concatenare
Apeluri subrutine
SirFinal = Concatenare(Sir1, Sir2)
.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
.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
DATA SEGMENT
Sir1 DB 'Buna ', 0
Sir2 DB 'dimineata!', '$', 0
SirFinal DB 50 DUP (?)
PUBLIC SirFinal
DATA ENDS
ASSUME CS:CODE
CODE SEGMENT
EXTRN Concatenare:PROC
(sau EXTRN Concatenare:FAR)
Start:
mov ax, data
mov ds, ax
mov ax, OFFSET Sir1
mov bx, OFFSET Sir2
call FAR PTR Concatenare
(si atunci ramane call Concatenare)
;SirFinal:=Sir1+Sir2
mov ah, 9
mov dx, OFFSET SirFinal
int 21h
;tiprirea irului obinut
mov ah, 4ch
int 21h
END Start
EXTRN SirFinal:BYTE
PUBLIC Concatenare
CODE SEGMENT
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
Legarea de module
asamblare cu module scrise
n limbaje de nivel nalt
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
*
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.
T
u
r
b
o
A
s
s
e
m
b
l
e
r
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.
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):
T
u
r
b
o
P
a
s
c
a
l
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.
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
*
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.
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;
...
Intrarea n 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.
BP=SP
BP iniial
offset. adr. revenire
offset j
adr. seg. j
valoarea lui i
BP+2
BP+4
BP+6
BP+8
T
u
r
b
o
A
s
s
e
m
b
l
e
r
CE SE PUNE N STIV
Char
- octet fr semn
Boolean
tip enumerare
T
u
r
b
o
Real
tip reprezentat n
virgul flotant
Pointer
- 2 cuvinte n stiv
String
P
a
s
c
a
l
tip mulime
Array, Record
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
1 octet n AL
2 octei n AX
4 octei n DX:AX (DX conine partea high)
- rezultat real
n DX:BX:AX
- 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)
Declaraii variabile
Modulul M2 (asamblare)
Declaraii variabile
var glob:string;
s:string;
function Asmf
(s:string):string; far; external;
Asmf proc
(s:string):string; far; public;
extrn CitSir: far
function CitSir:string;far;
Apeluri subrutine
Apeluri subrutine
s:=CitSir;
s := Asmf(s);
CitSir;
P.pas
directiva de compilare $L
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.
Asmf.asm
assume cs:_TEXT, ds:_DATA
_DATA segment
extrn glob:byte
_DATA ends
_TEXT segment
extrn CitSir: far
Asmf proc far
public Asmf
push bp
mov bp, sp
sub sp, 100h
sub sp, 100h
rez equ dword ptr [bp+10]
copieSir equ byte ptr [bp-100h]
sloc equ byte ptr [bp-200h]
push ds
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;
declaraia variabilei glob, definit n modulul Turbo Pascal
declaraia funciei CitSir, care a fost definit n modulul Turbo Pascal,
dar va fi folosit n modulul curent; tipul subrutinei este far
funcia Asmf este definit n acest modul dar va fi folosit n modulul
Turbo Pascal
izolarea stivei
se aloc n stiv 100h octei pentru copia parametrului de tip
string transmis prin valoare
se aloc n stiv 100h octei pentru rezultatul de tip string ntors
de ctre funcia CitSir, care va fi apelat n acest subprogram
BP-200h
(sloc)
BP-100h
(copieSir)
BP iniial
offset adr. revenire
BP+0
BP+2
BP+6
adr. seg. s
offset rez
adr. seg. rez
BP+10
Asmf.asm
push ss
lea ax, sloc
push ax
call CitSir
.
.
.
offset adr. revenire
seg. adr. revenire
offset sloc
adr. seg. sloc (SS)
.
.
.
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
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