In cele mai multe cazuri trebuie transmisi spre subprograme un numar mare de parametrii si numai pot fi folosite registrele care sunt într-un numar foarte mic. Atunci se foloseste transmisia parametrilor printr-o zona de memorie. Metoda este mai putin performanta decât transmiterea parametrilor prin tabela de adrese, deoarece toti parametrii trebuie grupati în zona de memorie ( nu pot fi dispersati în program).
Zona de memorie pentru parametrii se aloca în programul principal si trebuie sa fie un spatiu continuu în care sa se memoreze toti parametrii. Structura zonei este cea ceruta la definirea procedurii care implementeaza algoritmul de calcul. Daca se utilizeaza mai multe tablouri trebuie stabilite dimensiuni maxime pentru fiecare tablou. Daca se utilizeaza un singur tablou se plaseaza ultimul dintre parametrii si poate fi de dimensiune variabila. La chemarea subprogramului adresa zonei de parametrii, din programul principal se va încarca într-un registru (ex.BX). In subprogram se descrie structura zonei de memorie ce contine parametrii, care vor fi apelati indirect prin registru (BX).
Pentru exemplificare se considera un subprogram care calculeaza media elementelor unui tablou de N numere întregi cu semn. Parametrii transmisi subprogramului vor fi:
Media elementelor calculata ca parametru de iesire din procedura (S)
Numarul de elemente ale tabloului (N)
Tabloul de X de N elemente pentru care se calculeaza media
|
X | |||||
Zona memorie |
S |
N |
X(1) |
X(2) |
X(3) | |
(parametrii) |
In programul prezentat se considera tabloul X cu 5 elemente, dar el poate avea oricâte, deoarece el este ultimul parametru. La chemarea procedurii in se încarca în BX adresa zonei de memorie care contine parametrii. In procedura se descrie structura zonei de parametrii prin adresa lor relativa in zona cu directiva EQU. Mnemonicele S1, N1, X1 vor fi folosite în procedura pentru referirea indirecta prin BX a parametrilor. Adresarea lui S pentru initializare se face prin:
mov word ptr [bx+s1],0 ; s = 0
Trebuie folosit word ptr fiindca nu se utilizeaza registru si trebuie precizata lungimea operanzilor folositi. Adresa BX + s1 este echivalenta cu BX +0. Pentru a referi un element de tablou direct în programul principal se foloseste si indexarea cu SI:
c1: mov ax,[bx+x1+si] ; x[i]
; -------- ----- ------ -----Lab7_0
; Calcul medie elemente tablou X
; Parametrii spre subpr. transmisi prin zona de memorie
DOSSEG
.MODEL SMALL
.STACK 256
.286C
.DATA
s dw 0 ; s = media
n dw 5 ; nr. elem. din tabloul x
x dw 1,-92,83,-424,53
.CODE
st1: mov ax,@DATA
mov ds,ax
mov bx,offset s ; adresa zona parametrii
call sp1 ; chemare subprogram
int 3 ; valoarea medie s-a memorat in S de catre procedura
; Procedura calcul medie elemente tablou
; Intrare: BX adresa zona parametri
sp1 PROC near
; Adrese in zona de parametrii
s1 equ 0 ; Suma rezultata
n1 equ 2 ; numar de elemente
x1 equ 4 ; Tabloul de elemente
pusha ; salvare registre
mov si,0 ; i = 1
mov word ptr [bx+s1],0 ; s = 0
mov cx,[bx+n1] ; numar elemente
c1: mov ax,[bx+x1+si] ; x[i]
add [bx+s1],ax ; s=s+x[i]
add si,2 ; i=i+1
loop c1
mov ax,[bx+s1] ; AX = suma elemente
cwd ;extindere pentru impartire
idiv word ptr [bx+n1] ; s = s/n media
mov [bx+s1],ax ; memorare medie
popa ; refacere registre
ret
sp1 endp
end st1
Definirea structurii unei zone de memorie se poate face cu directiva STRUC, care creeaza o macheta si ataseaza fiecarei etichete o adresa relativa la începutul zonei. Definirea echivalenta pentru zona de parametrii din procedura anterioara se poate face:
Zona STRUC ; definire macheta pentru structura zonei
S1 DW
N1 DW ?
X1 DW 50 dup (?) ; definire tablou virtual pentru care nu se aloca spatiu
ENDS ; sfarsit definire structura
Pentru variabilele din structura nu se rezerva spatiu de memorie. Directiva DW este utilizata numai pentru a preciza lungimile operanzilor si a calcula adresele relative atasate etichetelor. Folosind acest mod de definire pentru o structura nu trebuie sa calculam pozitiile parametrilor în zona. Daca adaugam noi parametrii sau le modificam lungimea, nu trebuie sa ne preocupe ce adrese se genereaza, ca în cazul utilizarii directivei EQU.
O structura de date defineste un tip ca o colectie de una sau mai multe variabile, de tipuri diferite, grupate sub un singur nume pentru utilizare.
nume_struc STRUC
-------- ; definitie variabile formale
-------- ; care compun structura
nume_struc ENDS
Variabilele dintr-o structura pot fi declarate cu sau fara valori initiale. Valorile initiale sunt cele implicite care servesc la generarea unei zone cu acea structura.
Putem defini tipul compus data pe 4 octeti format din zi, luna, an;
date STRUC ; definire structura data
zi db 0 ; ziua
luna db 0 ; luna
anul dw 0 ; anul
date ENDS
Putem defini o variabila structurata de tip date si cu valori ale câmpurilor:
D1 date <15,2,1978> ; 15 februarie 1978
Vom declara structura STUDENT care contine date personale:
Student STRUC
Nume db 15 dup(20H) ; nume student
Adresa db ' Timisoara ' ; adresa (implicit Timisoara)
Varsta db 18 ; varsta
Datan db 0,0,0 ; zi luna, an
Cods db 5 dup(0) ; cod student fac,sectie,an,grupa,nr
Student ENDS
Pentru a genera datele personale pentru un student vom scrie:
Radu <'Radu','Arad,25,15,9,75,'AC34F'> ; nume,adresa,varsta,datan,Cods
Valorile câmpurilor dintr-o structura pot fi referite în instructiunile programului:
MOV BX,D1.Anul ; se încarca 1978
MOV AL,Radu.Varsta ; se încarca 25
MOV DX, offset Radu.Adresa ;se încarca ARAD
Toate limbajele de nivel înalt folosesc transmiterea parametrilor prin stiva, care este un caz particular de transmitere a parametrilor printr-o zona de memorie. In procedura trebuie definita structura datelor din stiva.
In stiva procedura va gasi mai multe tipuri de date:
Pentru orice procedura se începe cu proiectarea structurii stivei si definirea ei printr-o structura de date, care se va folosi la adresarea parametrilor si variabilelor locale.
Vom concepe un program care utilizeaza o procedura de calcul a mediei numerelor pozitive si cele negative dintr-un tablou de numere întregi cu semn.
Cu aceste precizari structura stivei vazuta de procedura va fi:
|
Stiva procedurii |
|||
S1 |
Suma pozitive |
|||
K1 |
Nr.elemente pozitive |
|||
S2 |
Suma negative |
|||
K2 |
Nr.elemente negative |
|||
CX | ||||
FLAGS |
Registre salvate |
|||
BX | ||||
|
BP |
BP registru de baza adresare stiva |
||
IP |
Adresa instructiunii urmatoare |
|||
CS |
Adresa segment |
|||
Adresa tablou |
MP |
Adresa tabel (medie pozitive) |
||
N |
MN |
Nr elemente (medie negative) |
In programul principal s-au pus în stiva adresa tabloului X si N numarul de elemente. Se apeleaza subprogramul prin CALL far ptr care pune în stiva CS si IP. La revenirea din procedura se iau din stiva rezultatele MP(medie elemente pozitive) si MN (medie elemente negative).
In procedura se fac secventele de operatii;
Daca la revenirea din procedura mai ramân parametrii reziduali în stiva se utilizeaza
RET N unde N este valoarea cu care se incrementeaza SP.
La revenirea în programul principal trebuie ca stiva sa fie goala adica sa aiba aceeasi pozitie ca la apelul procedurii.
; -------- ----- ------ --------Lab8_1
; Transmiterea parametrilor prin stiva
; Subprogram calcul medie elemente pozitive
si negative dintr-un tablou X
NAME MEDIA1
SSTIVA segment 'stack'
dw 100 dup (?)
stiva equ $ ; virful stivei
SSTIVA ends
;segment date
SDATA segment
MP dw 0 ; medie elemente - pozitive
MN dw 0 ; - negative
N dw 10 ; numar elemente tabel X
X dw 15,-12,-6,19,-7,17,18,0,-1,1
SDATA ends
;segment program principal
SPR segment
assume cs:SPR,ds:SDATA,ss:SSTIVA
st1: mov ax,SDATA ; initializare registre segment
mov ds,ax
mov ax,SSTIVA
mov ss,ax
mov sp,offset stiva
; Chemare subprogram
push N ; depune in stiva - nr.elemente
mov ax,offset X ; - adresa tablou
push ax
call far ptr medie ; chemare subprogram
; rezultatele s-au depus in stiva peste parametrii de intrare
pop MP ; extrage medie elem. - pozitive
pop MN ; - negative
int 3
; Subprogram calcul medie elemente pozitive
; si negative dintr-un tablou X
MEDIE proc far
; Pregatire stiva
push bp ; salvare reg BP
mov bp,sp ; reg bp baza in stiva
push bx ; salvare registre
pushf
push cx
sub sp,8 ; alocare spatiu variabile locale
; Corp procedura
; Structura stiva relativ la adr. de baza din BP
Zona variabile locale
s1 equ -14 ; suma elemente pozitive
k1 equ -12 ; contor elemente pozitive
s2 equ -10 ; suma elemente negative
k2 equ -8 ; contor elemente negative
z struc ; descriere structura parametrii
bpv dw ? ; reg BP vechi
ipv dw ? ; reg IP - adresa de revenire
csv dw ? ; CS - adresa segment prog.principal
atx dw ? ; adresa tabel X
nv dw ? ; nr. de elemente tablou X
z ends
; initializare variabile
mov cx,word ptr [bp+nv] ; contor cicluri
mov bx,word ptr [bp+atx] ; BX adresa tablou X
mov ax,0 ; initializari
mov si,0 ; index adresare in X
mov [bp+s1],ax ; variabile locale
mov [bp+k1],ax
mov [bp+s2],ax
mov [bp+k2],ax
; Ciclu de calcul sume elemente pozitive si negative
c1: mov ax,word ptr [bx+si] ; element X(I)
or ax,ax ; pozitionare indicatori
jl minus ; X(I) < 0
add word ptr [bp+s1],ax ; S1 = S1 + X(I)
inc word ptr [bp+k1] ; K1 = K1 + 1
jmp short c2
minus: add word ptr [bp+s2],ax ; S2 = S2 + X(I)
inc word ptr [bp+k2] ; K2 = K2 + 1
c2: add si,2 ; urmatorul element din tabel
loop c1
; Secventa calcul medii
mov ax,word ptr[bp+s1]
cwd
idiv word ptr [bp+k1] ; S1 = S1/K1
mov [bp+6],ax ; memorare medie in stiva
mov ax,[bp+s2]
cwd
idiv word ptr [bp+k2] ; S2 = S2/K2
mov [bp+8],ax ; memorare medie negative
;secventa iesire
add sp,8 ; eliberare spatiu variabile locale
pop cx ; refacere registre salvate
popf
pop bx
pop bp
ret ; iesire din subprogram
MEDIE endp ; rezultatele MP si MN in stiva
SPR ends
end st1
|