Sunteți pe pagina 1din 8

6.

TRANSMITEREA PARAMETRILOR SPRE SUBPROGRAME


6.1. Subprograme
Subprogramele asigur o dezvoltare sistematic a programelor pentru aplicaii prin:
Programarea modular descompunerea aplicaiei pe funciile realizate i
posibilitatea de a lucra mai muli programatori, coordonai de un programator ef
care stabilete structura de ansamblu a programului;
Posbl!a!ea de reu!l"are a subprogramelor existente pentru alte aplicaii;
#lar!a!ea programelor care permite o corectare, modificare sau dezvoltare
uoar a aplicaiei.
Subprogramele se pot considera nite cutii negre legate ntre ele, care realizeaz o
funcie prin prelucrarea parametrilor formali de intrare i returneaz rezultate transmise
programului cemtor prin parametrii formali de ieire. !entru a realiza funcia dorit se
pot folosi algoritmi diferii care sunt transpareni pentru utilizator. "ceeai funcie poate
fi implementat prin subprograme diferite, care pot fi ecivalente.
#$
#% &$'#$,#%,...#n(
... &%'#$,#%,...#n(
..........
#n
$e%&rea u&u subprogram se face formal pe baza unui algor!m care primete
variabile formale de intrare, care sunt prelucrate de o secven de instruciuni care
calculeaz variabilele de ieire.
U!l"area subprogramulu presupune cemarea subprogramului, transmiterea
valorilor parametrilor efectivi de intrare i preluarea rezultatelor transmise prin parametrii
de ieire. )n limba*ele de nivel nalt parametrii de intrare pot fi expresii de acelai tip cu
parametrii formali de intrare. !e programator nu+l intereseaz modul de transmitere a
parametrilor ntre program i subprograme.
,n limba* de asamblare transmiterea parametrilor spre subprograme este mai
complicat fiindc nu exist tipuri definite de date ci numai date de o anumit lungime
'$,%,- octei(. .ipul datelor este dat de instruciunile care se aplic asupra lor. "ici se
permite ca date care sunt de tip caractere "S/)), sau ciar instruciuni s fie prelucrate cu
instruciuni aritmetice 'adunare, scdere, nmulire, ..( cu rezultate imprevizibile dar fr
s dea erori dac nu apar depiri.
#'emarea unui subprogram este un simplu #ALL care pune registrele IP i eventual
#S (& s!) i face un sal! la adresa indicat din acelai segment sau din alt segment.
Subprogramul stabilete convenia de transmitere a parametrilor de intrare i de returnare
a rezultatelor. !rogramul cemtor care poate fi ciar subprogram trebuie s pregteasc
parametrii de intrare nainte de cemare i s preia rezultatele la ieirea din subprogram.
)nstruciunea 01. reface numai din stiva adresa de revenire 'registrele )! i /S(.
$
Subprogram
2up posibilitile de utilizare subprogramele pot fi:
Normale pot cema alte subprograme dar nu se pot cema pe ele nsele
Re*urs)e care se pot cema pe ele nsele direct sau indirect '34536'37$(4(
Ree&!ra&!e care pot fi folosite simultan de mai muli utilizatori 'editare texte(
!arametrii se pot transmite spre subprograme:
pr& +aloare caz n care valoare parametrului se transmite subprogramului
pr& Adres c8nd sunt tabele cu multe elemente i adresa tabelului se transmite
subprogramului, care va folosi metode de adresare indirect sau9i indexat.
.ransmiterea parametrilor spre subprograme se poate face:
Pr& regs!re n cazul n care sunt puini parametrii ide lungime redus
Pr&!r,o "o& de memore cu structur cunoscut i a crei adres se d ntr+un
registru 'recomandabil :#(
Pr& s!) care este un caz particular de zon de memorie
Pr& !abel de adrese care este cea mai eficient dar nu poate fi folosit la
procesoarele )ntel care nu au adresare indirect prin adres de memorie.
6.-. Tra&sm!erea parame!rlor pr&!r,o !abel de adrese
"ceast metod presupune memorarea adreselor parametrilor ntr+o tabel .".
"dresa .abelei ." se ncarc ntr+un registru i se transmite subprogramului.
Subprogramul transfera tabela de adrese ." ntr+o zon de memorie proprie rezervat
pentru adresele parametrilor. ;a apelarea unui parametru formal se apeleaz indirect
adresa parametrului din tabela de adrese. 1lementele tabelei funcioneaz ca parametrii
formali apelai ca i variabilele locale, dar indirect '6(.
1x:
3# d< %= ; numr elemente tablou #
S d< = ; suma elemente tablou
# d< ->,?%@,AB=,>@-,..........
." d< #,3,S ; adresa tablou #, 3# i suma S
......
MO+ SI.o%%se! TA ; adresa tabela de adrese ."
#ALL PSUMA ; cemare subprogram
; suma s+a transmis direct in variabila S din program
PRO# %ar
CDE 2),offset .ab ; tabela de adrese rezervata local
CDE cx,F ; lungime tabela de adrese '@ param6% octei(
REP MO+SB , transfer tabela de adrese din program in subprogram
Cov /#,63 ; ncarcare indirect numar de elemente
Cov S),= ; )5$
Cov "#,= ; Suma5=
/% "22 "#,6.GS)H ; element #i
"22 S),% ; )5)7$
;DD! /%
CDE 6Suma,"# ; memorare suma
%
RET ; revenire din subprogram
; tabela de adrese locala
. d< = ; adresa tablou
3 d< = ; adresa numr de elemente
Suma d< = ; adresa suma n programul principal
2in pcate nu exist adresare indirect prin memorie i subprogramul nu se poate
implementa n acest mod. S+ar permite exploatarea variabilelor plasate n diferite locuri
n programul principal direct din subprogram. ;a calculatoarele clasice toate limba*ele de
programare foloseau aceast metod de transmitere a parametrilor spre subprograme.
6./. Tra&sm!erea parame!rlor pr& regs!re
1ste cea mai simpl metod de transmitere a parametrilor, dar este limitat pentru
numr redus de parametrii. )n subprogram se recomand s se salveze registrele care se
modific i s se refac nainte de revenirea din subprogram '01.(. 1ste mai simpl
salvarea tuturor registrelor la nceput prin !ISJ" i refacerea la sf8rit prin !D!". ,n
registre se pot ncrca valorile parametrilor sau adresa lor. )n cazul subprogramelor de
conversie zecimal+binar i binar+zecimal discutate de*a, s+a transmis n :# adresa
irului de cifre zecimale codificate n "S/)) i n "# numrul binar iniial sau rezultat.
Program de a%0are "o& de memore (& 'e1a.
Se prezint mai *os un program de afiare a unei zone de memorie n exazecimal.
!entru aceasta se ia o zon de memorie i se ncarc succesiv n "# c8te % octei din care
vor rezulta - cifre exa. Krupele de - cifre exa se despart printr+un spaiu.
!roblema se reduce la a scrie o procedur '!3IC( care afieaz n exa
coninutul registrului "# folosind succesiunea de operaii:
Se va selecta pe r8nd c8te o cifr exa 'seturi de - bii( din st8nga spre dreapta,
ntr+un ciclu prin deplasarea registrului "# cu $%, A, -, = bii spre dreapta.
/ifra exa din dreapta registrului "; se transform n caracter "S/)) n
procedura !3): adug8ndu+i @=J. 2ac caracterul rezultat nu este cifr ' B( se
face o corecie prin care i se adaug =?J. "stfel din caracterul exa " va rezulta
@"J7=?J5-$J, care este codul caracterului " n "S/)) i care poate fi afiat.
/aracterul "S/)) rezultat se va afia n procedura !I./ folosind funcia 2DS
=%J, care afieaz coninutul registrului 2;.
;a unele monitoare trebuie adugat o secven de nt8rziere pentru a asigura
sincronizarea ntre viteza de transfer din memorie i viteza perifericului.
)nt8rzierile se pot realiza prin decrementarea ciclic a unor registre, ciar prin %
cicluri suprapuse. Se pot obine timpii de nt8rziere dorii, care depind de valoarea
iniial ncrcat n registre.



@
; ++++++++++++++++++++++++++++++++++++++Eexa.doc
2 A%sare "o&a de memore & 'e1a
; ++++++++++++++++++++++++++++++++++++++
.%AFc ; set comun %AF
dosseg
.model small
.data
date d< F>%?A,$%@-,%-,%F,F%,?%$
.*ode
st$: mov ax,Ldata
mov ds,ax
mov cx,F ; numar de cuvinte
mov si,= ; index in zona
l$: mov ax,dateGsiH
call far ptr pnum; afisare exa continut "#
add si,% ; cuvintul urmator
loop l$
; .erminare program
mov ax,-/==
int %$
2 Pro*edura a%sare 'e1a *o&!&u! reg A3
p&umpro* %ar
; la intrare "#5$F biti
; la iesire - cifre exa pe ecran
pusa ; salvare registre
mov cl,$% ; contor deplasari
nib%: pus ax ; salvare "#
sr ax,cl ; deplasare dreapta cu $%,A,-,=
call pnib ; afisare cifra exa din ";
sub cl,- ; urmatoarea cifra exa
cmp cl,+-
pop ax ; refacere "# initial
*nz nib%
mov al,M M ; afisare spatiu intre - cifre exa
call far ptr putc
popa ; refacere registre
ret ; terminare procedura
-
p&ume&dp
2 Pro*edura a%sare *%ra 'e1a d& AL dreap!a
p&b pro* &ear
and al,=f ; selectie - biti dreapta
add al,@= ; corectie cifra "S/))
cmp al,@a ; cifra N B
*l p@
add al,=? ; corectie cifra N B
p@: call far ptr putc ; afisare caracter "S/))
ret
p&b e&dp
2 Pro*edura a%sare *ara*!er d& AL
pu!* pro* %ar
pusa
mov dl,al ; functie 2DS afisare 2;
mov a,%
int %$
re!
2 se*)e&!a de &!ar"ere
mov cx,=f ; secventa de asteptare afisare
del: pus cx
mov cx,=ff ; ciclul % de asteptare
del%: nop
loop del%
pop cx
loop del
popa
ret
pu!* e&dp
end st$
;+++++++++++++++++++++++++++++++++++++++
>
Program de sor!are *ara*!ere d&!r,u& !e1! &!rodus de la !as!a!ur
Se introduce de la tastatur un ir de maxim A= caractere de lungime variabil,
care se memoreaz ntr+un buffer. Se ceam o procedur de sortare care utilizeaz
metoda inversiunii i ordoneaz caracterele din buffer funcie de valoarea codului "S/)).
!rocedura se poate modifica pentru a primi ca parametru n :# adresa unui text oarecare
precedat de lungimea lui 'lungimea poate fi transmis n /#(.
6 555555555555555555555555555555555555SD0..doc
6 Sorteaza un sir de caractere prin metoda inversiunii
6 555555555555555555555555555555555555
sda!e segme&! ; segmentul de date
dim eOu A= ; lungime maxima tabel
buf db A=,=,dim dup'P( ; buffer pentru sirul de caractere
inQmsg db Mintroduceti sirul de caractere:M,$=,$@,MRM ; mesa* dialog
outQmsg db Msirul sortat:M,$=,$@,MRM ; mesa* de dialog
cr db $=,$@,MRM ; carriage return si line feed
sda!e e&ds ; sfarsit segment date
ss!)a segme&! s!a*4 ; segment de stiva
db $== dup'P( ; rezervare spatiu stiva
stiva eOu R ; eticeta baza stiva
sstiva ends ; sfarsit segment stiva
*od segme&! ; segment de cod
assume cs:cod,ss:sstiva,ds:sdate,es:sdate ; afectare reg.segment
start: mov ax,sdate ; incarcare adresa segment date in registrul 2S
mov ds,ax
mov es,ax ; incarcare adresa segment date in registrul 1S
mov ax,sstiva
mov ss,ax ; incarcare adresa segment stiva in registrul SS
mov sp,offset stiva ; incarcare adresa top stiva in registrul S!
mov a,=B ; cod functie 2DS afisare mesa*
mov dx,offset inQmsg ; adresa mesa*
int %$ ; intrerupere 2DS
mov a,=a ; cod asteptare sir de la tastatura
mov dx,offset buf; adresa buffer intrare
int %$
mov a,=B ; afisare /0,;S
mov dx,offset cr
int %$
; pregatire cemare procedura
call sortare ; cemare procedura de sortare sir
F
mov a,=B ; afisare mesa* + sirul sortat:
mov dx,offset outQmsg
int %$
mov a,=B ; afisare sir sortat
mov dx,offset bufG%H
int %$
mov a,-c ; terminare program, iesire in 2DS
int %$
6 55555555555555555555555555555555
6 Pro*edura sor!are sr de *ara*!ere & "o&a bu%
6 55555555555555555555555555555555
sor!are pro* &ear ; declaratie procedura
sta: mov dx,=
mov cx,=
mov cl,bufG$H ; lungime sir introdus in /;
dec cx ; numar cicluri ;+$
*z sQend ; nu s+au introdus caractere
next: mov al,bufGsiH ; primul element considerat cel mai mare
cmp al,bufGsi7$H ; se compara cu urmatorul
*le cont ; sunt in ordine
xcg al,bufGsi7$H ; se inverseaza
mov bufGsiH,al
mov dx,$ ;marcarea unei inversari
cont: inc si
loop next ; cx 5 cx + $ si salt daca cx N =
; pregatire urmatoarea trecere
cmp dx,=
*nz sta
sQend: mov bl,bufG$H ; lungime sir
mov b,=
mov bufGbx7%H,MRM ;inserarea R dupa sirul sortat
re! ; iesire din procedura
sor!are e&dp ;sfarsit procedura
cod ends ; sfarsit segment
end start ; adresa de lansare si sfarsit program
6 55555555555555555555555555555555555555555
?

A

S-ar putea să vă placă și