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