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 ?