;7. Sa se redirecteze intreruperea 14h. Noul handler va trebui sa verifice ; daca functia este 00h, daca nu sa se apeleze vechiul handler iar daca ; da, sa afiseze mesajul 's-au initializat parametrii pentru COM1 !' ; La al treilea apel sa se refaca vechiul handler. assume cs:cod cod segment org 100h ; ca sa putem face un program COM trebuie sa rezervam primii 256 octeti pt. PSP start: jmp instalare ;partea rezidenta mesaj db "S-au initializat parametrii pentru COM1 ! $" minstalat db "Rutina a fost deja instalata $" Vechiip dw ? Vechics dw ? semnatura db "adi adi adi adi" nr db 0 handler: ;****RUTINA PROPRIE**** inc nr ; incrementam numarul de apeluri push ax ; salvam registrii pe care urmeaza sa-i modificam in interiorul handler-ului push ds push dx cmp ah,00h ; vedem daca functia cu care a fost apelata intreruperea este 00h, iar daca este apelez vechea rutina jnz ApelVecheaRutina mov ah,9h ; afisez mesajul cerut de problema ('s-au initializat parametrii pentru COM1 !') push cs pop ds lea dx,mesaj int 21h mov dl,nr ; testez daca numarul de apeluri este 3 (nr=3) cmp dl,3 jne sf ; dezinstalez noua rutina daca numarul de apeluri este 3 mov ax,2514h mov dx,word ptr Vechiip mov ds,word ptr Vechics int 21h sf: pop dx ; restaurez registrii salvati mai inainte pop ds pop ax iret ApelVecheaRutina: jmp dword ptr Vechiip ; apelez vechea rutina instalare: ;verifica daca noua RTI nu a fost deja instalata mov ah,35h mov al,14h int 21h ;in es:bx avem adresa rti14h mov word ptr Vechiip,bx mov word ptr Vechics,es ;compara adresele RTI vechi (ES:BX) cu adresa RTI nou (CS:[offset handler]) cmp bx,offset handler jne neinstal ;printr-o coincidenta stranie se poate intampla ca atat adresele de segment cat si offset-urile la cele doua rutine ;sa coincida. ca sa fim siguri ca nu coincid mai facem un test: comparam "semnaturile", semnatura este doar un sir ;de bytes definit de mine si al carui continut putin probabil sa mai existe in memorie. Daca continuturile offset-urilor ;respective nu coincid inseamna ca avem de-a face cu doua rutine diferite push cs pop ds lea si,semnatura ; ds:si contine adresa semnaturii ; es:si contine adresa semnaturii din vechea rutina mov di,si cld mov cx,handler-semnatura repe cmpsb jne neinstal mov ah,9h lea dx,minstalat int 21h ;terminare mov ax,4c01h int 21h neinstal: ;rutina noua nu a mai fost instalata; s-o instalam deci mov ah,25h mov al,14h push cs pop ds lea dx,handler int 21h ;terminam programul lasand rezidenta portiunea de la inceputul segmentului de cod pana la [offset instalare] ;facem acest lucru cu functia 31h a intreruperii 21h ;trebuie sa precizam in dx cate paragrafe (1 paragraf = 16 octeti) de la inceputul programului vor ramane rezidente ;alegem [offest instalare] la care mai adaugam 15 octeti pentru a fi sigur ca obtinem un numar de octeti care sa ;cuprinda tot handler-ul meu si apoi impartim la 16 retinand doar catul pentru a obtine numarul de paragrafe mov ah,31h mov al,00h lea dx,instalare add dx,15 mov cl,4 shr dx,cl int 21h cod ends end start