Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Transmiterea parametrilor printr-o zona de memorie

Informatica


Transmiterea parametrilor printr-o zona de memorie

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

BX

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

6.5. Definire si utilizare structuri de date

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



6.6. Transmisia parametrilor spre subprograme prin stiva

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:

  • Parametrii subprogramului transmisi de programul principal
  • Adresa de revenire în programul principal (dupa CALL) - valoare lui IP si CS
  • Registrele salvate de procedura
  • Variabilele locale ale procedurii
  • Stiva procedurii, care poate si ea sa cheme subprograme

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.

  • Parametrii de intrare vor fi adresa tabloului (atx) si numarul de elemente (nv)
  • Parametrii de iesire sunt media elementelor pozitive MP si negative MN
  • Variabile locale suma si numarul elementelor pozitive si negative(S1,K1,S2,K2)
  • Se vor salva în stiva registrele BP, BX, FLAGS si CX.

Cu aceste precizari structura stivei vazuta de procedura va fi:

SP

Stiva procedurii

S1

Suma pozitive

K1

Nr.elemente pozitive

S2

Suma negative

K2

Nr.elemente negative

CX

FLAGS

Registre salvate

BX

BP

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;

  • Se salveaza registrele si se memoreaza SP în BP, care va deveni referinta pentru adresarea elementelor din stiva.
  • Se aloca spatiu în stiva pentru cele 4 variabile locale (S1,K1,S2,K2) prin decrementarea cu 4*2=8 a lui SP
  • Registrul SP va adresa în continuare stiva procedurii
  • Se defineste structura Z si adresele variabilelor locale fata de BP
  • Se initializeaza variabilele locale
  • Se calculeaza printr-un ciclu suma elementelor pozitiveS1, a celor negative S2 si numarul lor k1 respectiv k2
  • Se calculeaza media elementelor pozitive peste adresa tablou(ATX) si negative peste N
  • Se elibereaza spatiul ocupat de variabilele locale prin incrementarea lui SP cu 8
  • Se refac registrele salvate
  • Se revine în programul principal cu RET care încarca din stiva IP si CS

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




Document Info


Accesari: 1576
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )