Buenos dias.
Dispongo de un programa que se dispone tanto de un instalar, como de un desinstalar.
En el instalar lo que hago es guardar el antiguo vector de interrupciones, para colocar el de mi interrupcion.
-  instalar proc 
-          
-     ; Guardamos la dirección actual que está en el vector de interrupciones 
-     mov ah, 35h 
-     mov al, 1Ch ; En AL se guarda la interrupcion relacionada 
-     int 21h 
-      
-     ;Guardamos el desplazamiento y el segmento original, para poder retornar ES:BX 
-     mov segme, es 
-     mov despla, bx 
-      
-     ;Colocamos nuestra rutina, en el vector de interrupciones 
-     mov ax, seg funcion_interrupcion 
-     ;Guardamos dicho segmento en el registro de segmento de datos 
-     mov ds, ax 
-     mov dx, offset funcion_interrupcion 
-     mov ah, 25h 
-     mov al, 1ch 
-     int 21h 
-          
-     ;EN DX INDICAMOS QUE QUEREMOS GUARDAR TANTO EL PSP, COMO EL CÓDIGO DE INSTALACIÓN 
-     ;Guardamos en dx el desplazamiento de instalar, ya que debemos guardar esta parte también en memoria 
-     mov dx, offset instalar 
-     ;Colocamos en dx 100, para indicarle cuanto debemos guardar, contando desde el PSP 
-     add dx, 100h 
-      
-     ;Salimos, indicando que queremos dejar residente, lo que colocamos en la memoria 
-     retf 
- endp 
-   
En el desinstalar, hago justo lo contrario, es decir, recupero lo que guardé del antiguo vector y lo coloco nuevamente, para dejar el sistema como estaba.
Mi duda recae en el liberar memoria, que tengo que hacerlo con la int 21h:
- desinstalar proc 
-     ;Limpiamos la pantalla para eliminar el reloj 
-     mov ah,00h 
-     mov al,03h 
-     int 10h 
-      
-     ; Guardamos la dirección actual que está en el vector de interrupciones 
-     mov ah, 35h 
-     mov al, 1Ch ; En AL se guarda la interrupcion relacionada 
-     int 21h 
-      
-     ; Restauramos el segmento y desplazamiento del vector original. En DS:DX colocamos la dirección de la rutina de servicio 
-     mov ax, es:segme 
-     mov ds, ax 
-     mov ax, es:despla 
-     mov dx, ax 
-      
-     ;Restablecemos el anterior vector de interrupciones 
-     mov al, 1ch 
-     mov ah, 25h 
-     int 21h 
-      
-     ;Liberamos la memoria 
-     ;mov ax, psp 
-     ;mov es, XX ;-> es = segmento a liberar 
-     mov ah, 49h 
-     int 21h 
-      
-     ret 
- endp 
-   
Pero claro, falta un parámetro, que es 'es', que tiene que apuntar al segmento que debe liberar, en mi caso, PSP
Al principio del programa, yo guardo ds en psp, que es una variable mia, para guardar dicho contenido:
main:
;guardamos el registro DS, el cual contiene la direccion del segmento de datos, para poder retornar a DOS   
   mov psp, ds
   push ds
   mov ax, 0h
   push ax
    ;modificar la PSP para cambiar 20h por 27h ( en ds:[1]
   mov al,27h
   mov bx,01h
   mov ds:[bx],al    
   ;Inicializamos el registro de segmento de datos, con el contenido del registro del segmento de código
   mov ax,cs
   mov ds,ax      
   ;inicializamos variable contadora
   mov contador, 0d
        .
        .
        .
[/code]
Mi duda es: a la hora de liberar, puedo hacer directamento 'mov es, psp, o como hice para el segmento y desplazamiento, tengo que usar 'es:segme y es:despla'?
Espero haberme explicado bien.
Saludos y gracias