Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Utilizarea de subrutine (proceduri)

calculatoare



+ Font mai mare | - Font mai mic



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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1967
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved