In cele mai multe cazuri trebuie transmii spre subprograme un numr mare de parametrii i numai pot fi folosite registrele care sunt ntr-un numr foarte mic. Atunci se folosete transmisia parametrilor printr-o zon de memorie. Metoda este mai puin performant dect transmiterea parametrilor prin tabel de adrese, deoarece toi parametrii trebuie grupai n zona de memorie ( nu pot fi dispersai n program. Zona de memorie pentru parametrii se aloc n programul principal i trebuie s fie un spaiu continuu n care s se memoreze toi parametrii. Structura zonei este cea cerut la definirea procedurii care implementeaz algoritmul de calcul. !ac se utilizeaz mai multe tablouri trebuie stabilite dimensiuni ma"ime pentru fiecare tablou. !ac se utilizeaz un singur tablou se plaseaz ultimul dintre parametrii i poate fi de dimensiune #ariabil. $a c%emarea subprogramului adresa zonei de parametrii, din programul principal se #a ncrca ntr-un registru (e".&'. In subprogram se descrie structura zonei de memorie ce conine parametrii, care #or fi apelai indirect prin registru (&'. (entru e"emplificare se consider un subprogram care calculeaz media elementelor unui tablou de ) numere ntregi cu semn. (arametrii transmii subprogramului #or fi* Media elementelor calculat ca parametru de ieire din procedur (+ )umrul de elemente ale tabloului () ,abloul de ' de ) elemente pentru care se calculeaz media BX X Zona memorie S N X(! X("! X(#! ......... (parametrii! In programul prezentat se consider tabloul ' cu - elemente, dar el poate a#ea oricte, deoarece el este ultimul parametru. $a c%emarea procedurii in se ncarc n &' adresa zonei de memorie care conine parametrii. In procedur se descrie structura zonei de parametrii prin adresa lor relati#a in zon cu directi#a ./0. Mnemonicele +1, )1, '1 #or fi folosite n procedur pentru referirea indirect prin &' a parametrilor. Adresarea lui + pentru iniializare se face prin* mo# 2ord ptr 3b"4s15,6 7 s 8 6 ,rebuie folosit 2ord ptr fiindc nu se utilizeaz registru i trebuie precizat lungimea operanzilor folosii. Adresa &' 4 s1 este ec%i#alent cu &' 46. (entru a referi un element de tablou direct n programul principal se folosete i inde"area cu +I* c1* mo# a",3b"4"14si5 7 "3i5 $ --------------------------------------%ab&'( $ )alcul medie elemente tablou X $ *arametrii spre subpr. transmisi prin zona de memorie $ -------------------------------------- +,SS-. ./,+-% S/0%% 1 .ST0)1 "26 ."36) .+0T0 s d2 6 7 s 8 media n d2 - 7 nr. elem. din tabloul " " d2 1,-9:,;<,-=:=,-< .>?!. st1* mo# a",@!A,A mo# ds,a" mo# b",offset s 7 adresa zona parametrii call sp1 7 c%emare subprogram int # 7 #aloarea medie s-a memorat in + de catre procedura $ ----------------------------------------- $ *rocedura calcul medie elemente tablou 7 Intrare* &' adresa zona parametri 7 ----------------------------------------- sp *4,) near 7 Adrese in zona de parametrii s1 eAu 6 7 +uma rezultata n1 eAu : 7 numar de elemente "1 eAu = 7 ,abloul de elemente pus%a 7 sal#are registre mo# si,6 7 i 8 1 mo# 2ord ptr 3b"4s15,6 7 s 8 6 mo# c",3b"4n15 7 numar elemente c1* mo# a",3b"4"14si5 7 "3i5 add 3b"4s15,a" 7 s8s4"3i5 add si,: 7 i8i41 loop c1 mo# a",3b"4s15 7 A' 8 suma elemente c2d 7e"tindere pentru impartire idi# 2ord ptr 3b"4n15 7 s 8 sBn media mo# 3b"4s15,a" 7 memorare medie popa 7 refacere registre ret sp endp end st1 : 6.2. +e5inire 6i utilizare structuri de date +e5inirea structurii unei zone de memorie se poate face cu directi#a +,C0>, care creeaz o mac7et i ataeaz fiecrei etic%ete o adresa relati# la nceputul zonei. !efinirea ec%i#alent pentru zona de parametrii din procedura anterioar se poate face* Zona ST48) 7 definire mac%et pentru structura zonei +1 !D E )1 !D E '1 !D -6 dup (E 7 definire tablou #irtual pentru care nu se aloca spatiu .)!+ 7 sfarsit definire structura *entru 9ariabilele din structur nu se rezer9 spa:iu de memorie. !irecti#a !D este utilizat numai pentru a preciza lungimile operanzilor i a calcula adresele relati#e ataate etic%etelor. Folosind acest mod de definire pentru o structura nu trebuie s calculm poziiile parametrilor n zon. !ac adugm noi parametrii sau le modificm lungimea, nu trebuie s ne preocupe ce adrese se genereaz, ca n cazul utilizrii directi#ei ./0. , structur de date definete un tip ca o colecie de una sau mai multe #ariabile, de tipuri diferite, grupate sub un singur nume pentru utilizare. numeGstruc ST48) -------- 7 definiie #ariabile formale -------- 7 care compun structura numeGstruc -N+S Hariabilele dintr-o structur pot fi declarate cu sau fr #alori iniiale. Halorile iniiale sunt cele implicite care ser#esc la generarea unei zone cu acea structur. (utem defini tipul compus dat pe = octei format din zi, lun, an7 date ST48) 7 definire structura data zi db 6 7 ziua luna db 6 7 luna anul d2 6 7 anul date -N+S (utem defini o #ariabil structurat de tip date i cu #alori ale cmpurilor* !1 date I1-,:,19J;K 7 1- februarie 19J; Hom declara structura +,0!.), care conine date personale* Student ST48) )ume db 1- dup(:6L 7 nume student Adresa db M ,imisoara M 7 adresa (implicit ,imisoara Harsta db 1; 7 #arsta !atan db 6,6,6 7 zi luna, an >ods db - dup(6 7 cod student fac,sectie,an,grupa,nr Student -N+S < (entru a genera datele personale pentru un student #om scrie* Cadu ;<4adu<=<0rad="2=2=>=&2=<0)#4?<@ $ nume=adresa=9arsta=datan=)ods Halorile cmpurilor dintr-o structur pot fi referite n instruciunile programului* M?H &',!1.Anul 7 se ncarc 19J; M?H A$,Cadu.Harsta 7 se ncarc :- M?H !', offset Cadu.Adresa 7se ncarc ACA! 6.6. Transmisia parametrilor spre subprograme prin sti9 ,oate limbaNele de ni#el nalt folosesc transmiterea parametrilor prin sti#, care este un caz particular de transmitere a parametrilor printr-o zon de memorie. In procedur trebuie definit structura datelor din sti#a. In sti# procedura #a gsi mai multe tipuri de date* (arametrii subprogramului transmii de programul principal Adresa de re#enire n programul principal (dup >A$$ - #aloare lui I( i >+ Cegistrele sal#ate de procedur Hariabilele locale ale procedurii +ti#a procedurii, care poate i ea sa c%eme subprograme (entru orice procedur se ncepe cu proiectarea structurii sti#ei i definirea ei printr-o structur de date, care se #a folosi la adresarea parametrilor i #ariabilelor locale. Hom concepe un program care utilizeaz o procedur de calcul a mediei numerelor poziti#e i cele negati#e dintr-un tablou de numere ntregi cu semn. (arametrii de intrare #or fi adresa tabloului (at" i numrul de elemente (n# (arametrii de ieire sunt media elementelor poziti#e M( i negati#e M) Hariabile locale suma si numrul elementelor poziti#e i negati#e(+1,O1,+:,O: +e #or sal#a n sti# registrele &(, &', F$AP+ i >'. >u aceste precizri structura sti#ei #zut de procedur #a fi* +( -1Q +ti#a procedurii -1= +1 +uma poziti#e -1: O1 )r.elemente poziti#e -16 +: +uma negati#e -; O: )r.elemente negati#e -Q >' -= F$AP+ Cegistre sal#ate -: &' &( 46 &( &( registru de baz adresare sti# 4: I( Adresa instruciunii urmtoare 4= >+ Adresa segment 4Q Adresa tablou M( Adresa tabel (medie poziti#e 4; ) M) )r elemente (medie negati#e = In programul principal s-au pus n sti#a adresa tabloului ' i ) numrul de elemente. +e apeleaz subprogramul prin >A$$ far ptr care pune n sti#a >+ i I(. $a re#enirea din procedur se iau din sti# rezultatele M((medie elemente poziti#e i M) (medie elemente negati#e. In procedur se fac sec#enele de operaii7 +e sal#eaz registrele i se memoreaz S* An B*, care #a de#eni referina pentru adresarea elementelor din sti#. +e aloc spaiu n sti# pentru cele = #ariabile locale (+1,O1,+:,O: prin decrementarea cu =R:8; a lui +( Cegistrul +( #a adresa n continuare sti#a procedurii +e definete structura S i adresele #ariabilelor locale fa de &( +e iniializeaz #ariabilele locale +e calculeaz printr-un ciclu suma elementelor poziti#e+1, a celor negati#e +: i numrul lor T1 respecti# T: +e calculeaz media elementelor poziti#e peste adres tablou(A,' i negati#e peste ) +e elibereaz spaiul ocupat de #ariabilele locale prin incrementarea lui +( cu ; +e refac registrele sal#ate +e re#ine n programul principal cu C., care ncarc din sti# I( i >+ !ac la re#enirea din procedur mai rmn parametrii reziduali n sti# se utilizeaz 4-T N unde ) este #aloarea cu care se incrementeaz +(. $a re#enirea n programul principal trebuie ca sti#a s fie goal adic sa aib aceeai poziie ca la apelul procedurii. 7 -----------------------------------------%ab3' $ Transmiterea parametrilor prin sti9a 7 +ubprogram calcul medie elemente poziti#e 7 si negati#e dintr-un tablou ' 7 ----------------------------------------- )AM. M.!IA1 SSTIB0 segment CstacDC d2 166 dup (E sti#a eAu U 7 #irful sti#ei ++,IHA ends 7------------------ 7segment date 7------------------ S+0T0 segment M( d2 6 7 medie elemente - poziti#e M) d2 6 7 - negati#e ) d2 16 7 numar elemente tabel ' ' d2 1-,-1:,-Q,19,-J,1J,1;,6,-1,1 - +!A,A ends 7------------------------- $segment program principal 7------------------------- S*4 segment assume cs*+(C,ds*+!A,A,ss*++,IHA st1* mo# a",+!A,A 7 initializare registre segment mo# ds,a" mo# a",++,IHA mo# ss,a" mo# sp,offset sti#a 7 ------------------ $ )7emare subprogram 7 ------------------ pus% ) 7 depune in sti#a - nr.elemente mo# a",offset ' 7 - adresa tablou pus% a" call far ptr medie 7 c%emare subprogram 7 rezultatele s-au depus in sti#a peste parametrii de intrare pop M( 7 e"trage medie elem. - poziti#e pop M) 7 - negati#e int < $ ------------------------------------------ $ Subprogram calcul medie elemente poziti9e $ si negati9e dintr-un tablou X $ ------------------------------------------ /-+I- proc 5ar $ *regatire sti9a pus% bp 7 sal#are reg &( mo# bp,sp 7 reg bp baza in sti#a pus% b" 7 sal#are registre pus%f pus% c" sub sp,; 7 alocare spatiu #ariabile locale 7 -------------- $ )orp procedura 7 -------------- $ Structura sti9a relati9 la adr. de baza din B* 7 Sona #ariabile locale s1 eAu -1= 7 suma elemente poziti#e Q T1 eAu -1: 7 contor elemente poziti#e s: eAu -16 7 suma elemente negati#e T: eAu -; 7 contor elemente negati#e z struc $ descriere structura parametrii bp# d2 E 7 reg &( #ec%i ip# d2 E 7 reg I( - adresa de re#enire cs# d2 E 7 >+ - adresa segment prog.principal at" d2 E 7 adresa tabel ' n# d2 E 7 nr. de elemente tablou ' z ends 7 ------------- $ initializare 9ariabile mo# c",2ord ptr 3bp4n#5 7 contor cicluri mo# b",2ord ptr 3bp4at"5 7 &' adresa tablou ' mo# a",6 7 initializari mo# si,6 7 inde" adresare in ' mo# 3bp4s15,a" 7 #ariabile locale mo# 3bp4T15,a" mo# 3bp4s:5,a" mo# 3bp4T:5,a" $ )iclu de calcul sume elemente poziti9e si negati9e c1* mo# a",2ord ptr 3b"4si5 7 element '(I or a",a" 7 pozitionare indicatori Nl minus 7 '(I I 6 add 2ord ptr 3bp4s15,a" 7 +1 8 +1 4 '(I inc 2ord ptr 3bp4T15 7 O1 8 O1 4 1 Nmp s%ort c: minus* add 2ord ptr 3bp4s:5,a" 7 +: 8 +: 4 '(I inc 2ord ptr 3bp4T:5 7 O: 8 O: 4 1 c:* add si,: 7 urmatorul element din tabel loop c1 $ Sec9enta calcul medii mo# a",2ord ptr3bp4s15 c2d idi# 2ord ptr 3bp4T15 7 +1 8 +1BO1 mo# 3bp4Q5,a" 7 memorare medie in sti#a mo# a",3bp4s:5 c2d idi# 2ord ptr 3bp4T:5 7 +: 8 +:BO: J mo# 3bp4;5,a" 7 memorare medie negati#e 7--------------- $sec9enta iesire 7--------------- add sp,; 7 eliberare spatiu #ariabile locale pop c" 7 refacere registre sal#ate popf pop b" pop bp ret 7 iesire din subprogram /-+I- endp $ rezultatele /* si /N in sti9a +(C ends end st1 7 ----------------------------------------- ;