|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Rutine reentrante/nereentrante - limbaje de asamblare | ||||||
|
||||||
O subrutina e reentranta daca executia ei poate fi intrerupta (hard sausoft)
si rutina de tratare a intreruperii apeleaza cu succes (direct sauindirect)
aceasta rutina reentranta. Reentranta e corecta daca subrutina nuare nici un
fel de efecte laterale: nu afecteaza nici indicatorii de conditii,nici registri
generali, nici zone de memorie statice. De obicei, sintproiectate reentrante
rutinele cu utilizare duala: sistem deoperare/programator. In ceea ce priveste
INT 21H, nu toate functiile DOS sint reentrantedatorita utilizarii unor zone
statice de memorie pentru operatiile de transfercu discul. Rutina de tratare
a unei intreruperi hard poate utiliza functii DOSnumai daca intreruperea hard
nu a survenit pe durata executiei unei altefunctii DOS. Exista insa o functie
DOS, (AH=34H), care imi intoarce in ES:BX,adresa unei variabile numita simbolic
IN_DOS. Daca valoarea acestei variabileeste nula (0) inseamna ca nu se executa
nici o alta functie DOS. Dar aceastavariabila are o valoare diferita de 1 si
in timpul cit COMMAND.COM asteaptaapasarea unei taste (deci, practic tot timpul).
Ca urmare, daca gasim variabila pe 1 nu vom astepta intr-o bucla trecerea ei
pe 0 ci vom utiliza INT 28H, careeste apelata periodic cit timp DOS-ul este
in asteptare si deci redirectind INT28H pot activa rutina reentranta cind am
o cerere nesatisfacuta (functie DOSactiva, adica IN_DOS > 1 -> valoarea
IN_DOS imi arata cite functii DOS sintactive in acel moment).
Recursivitate in limbaj de asamblare
O subrutina este recursiva daca:
a)- exista cel putin un drum de la codul initial la cel final pe parcursulcaruia se autoapeleaza sib)- exista cel putin un drum de la codul initial la cel final pe parcursulcaruia nu se autoapeleaza (deci o iesire din recursivitate). Observatii: 1. Daca conditia a) nu este indeplinita procedura este o procedura obisnuita.2. Daca conditia b) nu este indeplinita procedura este o procedura infinita. Autoapelarea poate fi: 1. directa, cind in interiorul subrutinei se apeleaza chiar aceasta subrutina.2. indirecta, cind in interiorul subrutinei se apeleaza o alta subrutina carela rindul ei o apeleaza pe prima.Recursivitatea e corecta daca orice apel recursiv este facut pentru uncaz mai simplu si daca valorile calculate in anteapel si folosite in postapelnu sint alterate de efectele laterale ale subrutinei. Din acest punct devedere, solutia cea mai simpla este salvarea in stiva a registrelor(variabilelor) calculate in apel si folosite in postapel (deci, atentie lanumarul valorilor salvate pe stiva, incit sa nu depasesc capacitatea stivei!!) In concluzie, fiecare postapel imi depune pe stiva cite o informatiepentru postapel ca si adresa de revenire (adresa de dupa apelul recursiv) Aplicatii: 1. Analizati cu TurboDebuggerul cele doua programe CONV1.ASM si CONV2.ASM deconversie recursiva din hexazecimal in zecimal cu afisarea rezultatului. Cediferente de implementare a rutinelor recursive exista intre cele douaprograme? 2. Sa se scrie o rutina recursiva care va calcula si afisa n!, cu n introdusde la tastatura (functia 1 - int 21H). 3. Scrieti o rutina recursiva pentru inversarea unui sir de caractere: INV('ABCD') = 'D' + INV('ABC') 4. Sa se scrie o rutina recursiva care va calcula si afisa, in mod grafic,primele n elemente ale sirului lui Fibonacci: 1, , pentru n = 0, 1bn = b(n-1) + b(n-2), pentru n > 1 |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|