Vous êtes sur la page 1sur 14

Last updated on: 03.12.

2016
 Recapitulare laborator 4

 Transferul parametrilor către proceduri


Transfer prin valoare
Transfer prin referință
Transfer prin zonă de date
Transfer prin stivă

 Întoarcerea datelor de către proceduri

 Aplicații practice
Forma generală pentru definirea unei proceduri este:
nume_proc PROC [FAR | NEAR]
……
RET
nume_proc ENDP

Instrucţiunea CALL (Apel de procedură)


CALL nume_proc ;salveaza adresa de revenire (IP) in stiva
Instrucţiunea RET (Return - Revenire din procedură)
RET
Instrucţiunea JMP (Jump - Salt)
JMP tinta
 Codul este copiat  Codul este apelat
 Acelasi cod este  Aceeași procedură este
duplicat în mai multe refolosită
porțiuni de cod
 Mai rapid  Se efectuează salt
 Greu de făcut debug  Ușor de făcut debug
 Sintaxa  Sintaxa
 Poate primi  Nu poate primi direct
parametrii parametrii
.data
n1 dd 12345H
n2 dd 54321H
 Implica transmiterea rez dd ?
.code
conținutului unei aduna proc near
variabile. add ax, bx
adc dx, cx
ret
aduna endp
 Se utilizează dacă ……
variabila ce trebuie mov ax, word ptr n1
mov dx, word ptr n1+2
transmisă nu este mov bx, word ptr n2
alocată în memore, ci mov cx, word ptr n2+2
call near ptr aduna
într-un registru. mov word ptr rez, ax
mov word ptr rez+2, dx
.data
n1 dd 12345H
n2 dd 54321H
 Implică transmiterea rez dd ?
.code
adresei de memorie a aduna proc near
unei variabile; mov ax, [si]
add ax, [di]
mov dx, [si+2]
 Se utilizează când adc dx, [di+2]
trebuie transmise ret
aduna endp
structuri de date de ……
volum mare (structuri, lea si, n1
tablouri). lea di, n2
call near ptr aduna
mov word ptr rez, ax
mov word ptr rez+2, dx
 Se pregăteste anterior .data
o zonă de date; zona label dword
n1 dd 12345H
 Se transmite către n2 dd 54321H
rez dd ?
procedură adresa
.code
acestei zone de date. aduna proc near
mov ax, [bx]
add ax, [bx+4]
mov dx, [bx+2]
 În exemplul următor
adc dx, [bx+6]
transferul ret
parametrilor către aduna endp
procedura aduna se ……
face printr-o zonă de lea bx, zona
date: call near ptr aduna
.data
zona label dword
n1 dd 12345H
n2 dd 54321H
 Transferul parametrilor prin stivă este cea rez dd ?
mai utilizată modalitate de transfer. .code
 Avantajele acestei metode sunt aduna proc far
uniformitatea si compatibilitatea cu push bp
limbajele de nivel înalt. mov bp, sp
mov ax, [bp+10]
Stivă add ax, [bp+6]
mov dx, [bp+12]
BP+12 N1 octet
adc dx, [bp+8]
BP+10 N1 octet pop bp
BP+8 N2 octet ret
aduna endp
BP+6 N2 octet
……
BP+4 Segment push word ptr n1+2
BP+2 Offset push word ptr n1
push word ptr n2+2
BP BP
push word ptr n2
call far ptr aduna
Modalităţi de întoarcere a datele de către proceduri:
1. În lista de parametri apar adresele rezultatelor sau adresa
zonei de date care conţine câmpuri pentru rezultate;
În interiorul procedurii se depun explicit rezultatele la
adresele conţinute în parametrii formali respectivi.
2. Rezultatele se întorc prin registre;
Transferul rezultatelor prin registre, se foloseste cel mai
frecvent. De obicei se foloseste registrul acumulator,
eventual extins (AL, AX, respectiv DX:AX, după cum
rezultatul este pe 1, 2 sau 4 octeţi).
3. Rezultatele se întorc în vârful stivei.
Transferul rezultatelor prin stivă, se foloseste destul de rar,
fiind total nestandard.
 Să se scrie un program care determină numărul
biţilor 1 dintr-un număr pe 32 de biţi citit de la
tastatură (se vor folosi instrucţiunile SHL si ADC);

 Notă:
SHL(Shift Logic- Deplasează logic/aritmetic la stânga)
SHL operand, contor
Bitul cel mai semnificativ trece în CF, după care toţi biţii
se deplasează la stânga cu o poziţie. Bitul cel mai puţin
semnificativ devine 0. Numărul operațiilor este dat de contor.
Instrucţiunea ADC (Add with Carry – Adună cu transport)
ADC dest, sursa ----- dest ← dest + sursa + CF
1. Definim procedura numără de tip near:
nume_procedură proc near;
2. Verificăm daca în registrul AL (valoarea citită de la
tastatură) avem valoarea zero;
3. Daca în registrul AL avem valoarea zero sărim la
sfârșitul procedurii;
4. Siftăm numărul la stanga cu o poziție (SHL);
5. Adunăm cu transport (ADC) valoarea zero intr-o
variabila ‘rezultat’
definită; transportul / CF o sa fie adunat la rezultat.
5. Facem salt la punctul 2;
6. Sfarsit procedură: ret endp
ASCII Decimal Hex

0 48 30

citire_ch proc near 1 49 31

mov AH,01h 2 50 32
int 21h 3 51 33
sub al, 30h ; ‘0’
4 52 34
ret
endp 5 53 35

6 54 36
Pas Instrucțiune
1 AH <- 1h 7 55 37

2 INT 21h 8 56 38
3 AH <- cod ASCII caracter
9 57 39
4 AH – 30h – cifra
 Să se scrie o procedură care realizează
adunarea a două valori citite de la tastatură.
Numerele sunt formate din maxim 32 de
cifre.

Vous aimerez peut-être aussi