.model small .code org 100h int18: jmp body oldint dw 0,0 stck dw 0,0 execute proc near ; procedura a cui punta l'interrupt 18 ridirezionato sti ; riabilito gli interrupts push cs pop ds mov ah,4ah ; ridimensiono la memoria allocata per poter caricare la porzione transiente del COMMAND.COM mov bx,1000h int 21h push es ; mi salvo il registro di segmento dove risiede questa procedura mov stck,sp ; salvo i registri dello stack mov stck+2,ss mov si,80h ; eseguo il comando specificato sulla riga di comando al momento del caricamento del TSR int 2eh mov sp,stck ; ripristino i registri dello stack mov ss,stck+2 pop ax ; recupero in ax il registro es che avevo salvato prima della chiamata all'interrupt 2E add ax,4 ; ho reso residente 40h bytes di codice, pi— il PSP, quindi 4 paragrafi di memoria oltre il valore di es mov es,ax mov ah,49h ; libero la memoria allocata dal 49esimo byte in poi int 21h iret ; ritorno al programma chiamante execute endp error db "Copyright (C) 2002 by Peter2000 - Sintassi: INT18 comando",0dh,0ah,24h quitmsg db "INT18 Manager 1.0 disinstallato.",0dh,0ah,24h body proc near mov ax,3518h ; controllo dove punta l'interrupt 18 int 21h lea si,execute ; carico in si l'offset della procedura execute cmp si,bx ; se i 2 registri sono uguali significa che il TSR Š gi… presente in memoria e procedo alla disinstallazione jne check disinst: mov dx,es:oldint ; recupero la posizione a cui puntava l'interrupt 18 prima dell'installazione di questo TSR mov ds,es:oldint+2 mov ax,2518h ; ripristino l'interrupt 18 int 21h push es mov es,es:[2ch] ; libero il segmento di memoria indicato all'offset 2C del PSP mov ah,49h int 21h pop es mov ah,49h ; libero il segmento di memoria corrente int 21h cmp byte ptr cs:[80h],0 ; controllo all'offset 80 del PSP di quanti bytes Š composta la riga di comando jne install ; se Š 0 reinstallo il TSR con la nuova linea di comando push cs pop ds mov ah,9 ; stampo la stringa di chiusura lea dx,quitmsg int 21h int 20h check: cmp byte ptr cs:[80h],0 ; controllo all'offset 80 del PSP di quanti bytes Š composta la riga di comando jne install ; se Š 0 genero un errore mov ah,9 ; stampo la stringa di errore lea dx,error int 21h mov ax,4cffh ; restituisco l'error level FF int 21h install: mov cs:oldint,bx ; salvo l'indirizzo a cui punta l'interrupt 18 mov cs:oldint+2,es push cs pop ds lea dx,execute ; faccio puntare l'interrupt 18 alla procedura execute mov ax,2518h int 21h mov ax,3100h ; rendo residenti 40h bytes di codice, pi— i 100h del PSP mov dx,14h int 21h body endp end int18