CATEGORII DOCUMENTE |
Utilizarea de subrutine (proceduri)
1 Chemarea si revenirea din subrutina
Atunci cand anumite portiuni dintr-un program apar de mai multe ori in cuprinsul acestuia, este avantajos ca ele sa fie scrise o singura data, ca subrutine, si sa fie apelate atunci cand sunt necesare.
Subrutinele se mai numesc in limbaj de asamblare si proceduri (ca si in alte limbaje de programare).
O subrutina incepe cu o eticheta si se termina cu instructiunea RET. Apelul subrutinei se face cu instructiunea CALL avand ca operand eticheta respectiva.
Utilizarea subrutinelor modularizeaza programele si le face mai compacte, mai usor de inteles si de dezvoltat. Totusi utilizarea lor ridica unele probleme, in special cele legate de transmiterea parametrilor si modificarea de catre subrutine a unora dintre registre.
Exemplul 1:
Vom relua un program din lucrarea precedenta, pentru a trasa doua linii orizontale in pozitii diferite: x1=100, y1=50 si x1=100 si y1=150.
.MODEL SMALL
.STACK 200H
.DATA
x1=100 ;Aici se declara parametrii liniilor
y1=50
lung1=200
culoarea1 =5
x2=100
y2=150
lung2=200
culoarea2 =3
.CODE
Start:
;Mod video 320x200
mov ah,0
mov al,13h
int 10h
MOV AX, 0A000H; Adresa segmentului ecran mod 13
MOV ES, AX ; in ES
;De aici se cheama scrierea primei linii
mov di,x1 ;Parametrii primei linii
mov bp,y1
mov cx,lung1
mov al,culoarea1
call linieo ;Cheama subrutina de linie
;De aici se cheama scrierea celei de a doua linii
mov di,x2 ;Parametrii celei de a doua linii
mov bp,y2
mov cx,lung2
mov al,culoarea2
call linieo ;Cheama subrutina de linie
oprire:
jmp oprire
;*********** Subrutine ** ** ******
Linieo:
;Subrutina de trasare a unei linii orizontale cu ;parametrii DI=x,BP=y,CX=lungimea si AL= culoarea
;Modifica registrele: DX,BP,DI si CX (in STOSB)
mov dx,bp
shl dx,8
shl bp,6
add dx,bp
add di,dx ;S-a stabilit adresa primului punct
repz stosb ;Aici se scriu punctele liniei
ret ;Reantoarcere in programul apelant
END Start
Instructiunile subrutinei si apelurile catre ea au fost scrise cu caractere bold pentru a se evidentia procedeul. La inceputul subrutinei s-au scris in comentarii registrele care contin parametrii necesari, precum si registrele modificate in urma executiei. Aceste precizari, desi par consumatoare de timp, sunt extrem de utile in dezvoltarea programului.
Se observa ca inainte de apelul subrutinei, registrele au fost incarcate corespunzator, cu parametrii specifici punctului de apel. Instructiunile de initializare au fost deci scoase din blocul de trasare a unei linii folosit in programul din lucrarea precedenta, luand forme diferite pentru cele doua apeluri.
Se observa de asemenea ca blocul folosit anterior modifica pe AX si implicit pe AL, care in mod normal retine culoarea, de aceea si instructiunile de initializare a lui ES au fost scoase din subrutina.
P 1 Sa se ruleze pas cu pas programul din exemplul 1 si sa se observe evolutia registrelor si a ecranului (cu ALT+F5). Trecerea peste instructiunile repetitive REPZ STOSB se poate face punand cursorul pe linia imediat urmatoare si dand comanda 'Go to cursor' (F4) . Programul se va salva, fiind necesar la punctul 3.
P 2 Sa se dezvolte programul anterior pentru a trasa un dreptunghi cu varful din stanga sus la x1=100 si y1=50, lunginea=100 , inaltimea =50 si culoarea 5 pentru liniile orizontale si 1 pentru cele verticale.
Indicatii: Se va adauga o subrutina de trasare a unei linii verticale si se va apela corespunzator de 2 ori. Programul se va salva, fiind necesar la punctul 6.
Pentru ca liniile verticale sa nu se suprapuna peste cea orizontala de sus (dupa cum se poate observa), originea lor trebuie sa inceapa cu 320 de puncte mai departe si lungimea sa fie cu 1 mai mica. Deci inainte de chemarea subrutinei de trasare a liniilor verticale, DI trebuie adunat cu 320 iar CX decrementat.
2 Salvarea si refacerea registrelor afectate de subrutina
Corpul principal al subrutinelor modifica in general continutul unor registre. Daca subrutina este apelata in mod repetat, aceste modificari pot afecta modul de executie. De aceea este necesar ca registrele care sunt folosite de subrutina, si al caror continut este necesar mai tarziu, sa fie salvate in stiva cu instructiuni PUSH si sa fie refacute inainte de iesirea din subrutina cu instructiuni POP in ordine inversa, conform principiului de functionare al stivei.
De exemplu, atunci cand subrutina este apelata dintr-o bucla in care avem contorul in SI, iar subrutina modifica registrele DI si BX, se va proceda in felul urmator:
Exemplul 2:
.
.
.
mov di,50 ;Valoarea initiala a lui DI
mov bx,30 ;Valoarea initiala a lui BX
mov si,20 ;Contorul de chemari subrutina
et1: call subrutina ;Cheama subrutina
add di,5 ;Vechea valoare a lui DI se aduna ;cu 5
sub bx,3 ;Vechea valoare a lui BX se scade ;cu 3
dec si ;Decrementeaza contorul
jnz et1 ;Reia daca contorul nu a ajuns la 0
.
. ;Alte instructiuni
.
subrutina: ;Subrutina va modifica pe DI si BX
push di ;de aceea se salveaza DI
push bx ;si BX
. ;Urmeaza corpul subrutinei
.
.
inc di ;in care se modifica DI
dec bx ;si alte registre
.
.
.
pop bx ;La sfarsit se reface intai BX
pop di ;si apoi DI (deci in ordine ;inversa)
ret
Se observa ca valorile initiale din registrele DI si BX sunt necesare si in alte parti din programul apelant, dar ele vor fi modificate de subrutina. De aceea ele se vor salva in stiva si se vor reface apoi din stiva, dupa principiul ultimul intrat este primul iesit ('Last In First Out' - LIFO).
De multe ori, problema modificarii registrelor este dificila, de aceea se recomanda scrierea in faza initiala in preambulul subrutinei a registrelor afectate, ca in exemplul 1. Daca unele din ele contin valori care vor mai fi necesare, ele se vor salva si se vor reface.
Desigur, salvarea se poate face si imediat inainte de apelul subrutinei, iar refacerea imediat dupa revenirea din subrutina, sau in alte puncte convenabil alese.
P 3 Sa se dezvolte programul anterior pentru a afisa un dreptunghi plin cu x1=100,y1=50,l=120,h=60 si culoarea 5.
Indicatii:
Se va apela in mod repetat, de h ori, subrutina de trasare a unei linii orizontale. Contor poate fi de exemplu registrul BX, care nu este folosit in alta parte.
Deoarece subrutina modifica registrele CX, DI si BP, acestea se vor salva in stiva la inceputul subrutinei si se vor reface la sfarsitul ei, ca mai jos:
Exemplul 3:
linieo: ;Linie orizontala
push cx ;Salveaza
push di ;registrele
push bp ;care se vor modifica
mov dx,bp ;Incepe trasarea liniei
shl dx,8
shl bp,6
add dx,bp
add di,dx
repz stosb
pop bp ;Reface
pop di ;registrele
pop cx ;care s-au modificat
ret
P 4 Sa se dezvolte programul anterior pentru a afisa 20 de dreptunghiuri pline cu x1=20+8n ,y1=50+5n,l=20,h=60 si culoarea n, unde n este numarul dreptunghiului curent.
Indicatii: Se va scrie sirul instructiunilor de afisare a unui dreptunghi ca o subrutina, si se va apela in mod repetat, de n ori, schimband corespunzator parametrii. O posibilitate de realizare a unui program similar este cea de mai jos:
P 5 Sa se modifice programul anterior pentru a afisa 2000 de dreptunghiuri pline cu parametri aleatori cititi din memorie incepand de la adresa DS:500h in felul urmator: x1=[500h+n] ,y1=[500h+n+1],l=[500h+n+2],h=60 si culoarea [500h+n+3], unde n este numarul dreptunghiului curent.
Indicatii: Bucla de afisare a dreptunghiurilor va citi din memorie parametrii fiecarui dreptunghi, deci ei nu mai trebuiesc salvati in subrutina chemata. O posibilitate de realizare a acestei bucle este cea de mai jos:
Exemplul 4:
mov bx,500h ;Inceputul zonei de memorie
mov si,2000 ;Numarul total de dreptunghiuri
dreptnou: ;Mai intai parametrii primei linii
mov di,[bx] ;DI e aici maxim FFFFh=65535
sub di,65536-320;x1 e acum maxim 320
mov bp,[bx+1] ;BP e initial maxim 65535
sub bp,65536-200;y1 e acum maxim 200
mov cx,[bx+2] ;CX e initial maxim 65535
and cx,01fh ;Lungimea e acum maxim 32
mov al,[bx+3] ;AL (culoarea) e maxim 255
mov ah,h ;Dreptunghiurile au inaltimea h
call dreptunghi ;Afiseaza dreptunghiul
add bx,4 ;Indexul in memorie e crescut cu 4
dec si ;Numarul de repetari scazut cu 1
jnz dreptnou ;Daca nu s-a ajuns la 0, repeta
P 6 Sa se combine programul anterior cu cel de la punctul 3 pentru ca dreptunghiurile sa fie incadrate de un chenar negru.
Indicatii: Pentru parametrii dati, se va trasa mai intai un dreptunghi din patru linii negre si apoi unul colorat cu parametri : x1c =x1+1 (x stanga sus color), y1c=y1+1, lc=l-2, hc=h-2. Deoarece parametrii primului dreptunghi sunt necesari si pentru al doilea, registrele care ii contin se vor salva si apoi reface.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1967
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved