• Viernes 29 de Marzo de 2024, 16:28

Autor Tema:  Liberar Memoria al desinstalar  (Leído 1851 veces)

jekeyeke

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Liberar Memoria al desinstalar
« en: Martes 25 de Mayo de 2010, 10:10 »
0
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.

Código: ASM
  1.  instalar proc
  2.        
  3.     ; Guardamos la dirección actual que está en el vector de interrupciones
  4.     mov ah, 35h
  5.     mov al, 1Ch ; En AL se guarda la interrupcion relacionada
  6.     int 21h
  7.    
  8.     ;Guardamos el desplazamiento y el segmento original, para poder retornar ES:BX
  9.     mov segme, es
  10.     mov despla, bx
  11.    
  12.     ;Colocamos nuestra rutina, en el vector de interrupciones
  13.     mov ax, seg funcion_interrupcion
  14.     ;Guardamos dicho segmento en el registro de segmento de datos
  15.     mov ds, ax
  16.     mov dx, offset funcion_interrupcion
  17.     mov ah, 25h
  18.     mov al, 1ch
  19.     int 21h
  20.        
  21.     ;EN DX INDICAMOS QUE QUEREMOS GUARDAR TANTO EL PSP, COMO EL CÓDIGO DE INSTALACIÓN
  22.     ;Guardamos en dx el desplazamiento de instalar, ya que debemos guardar esta parte también en memoria
  23.     mov dx, offset instalar
  24.     ;Colocamos en dx 100, para indicarle cuanto debemos guardar, contando desde el PSP
  25.     add dx, 100h
  26.    
  27.     ;Salimos, indicando que queremos dejar residente, lo que colocamos en la memoria
  28.     retf
  29. endp
  30.  

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:
Código: ASM
  1. desinstalar proc
  2.     ;Limpiamos la pantalla para eliminar el reloj
  3.     mov ah,00h
  4.     mov al,03h
  5.     int 10h
  6.    
  7.     ; Guardamos la dirección actual que está en el vector de interrupciones
  8.     mov ah, 35h
  9.     mov al, 1Ch ; En AL se guarda la interrupcion relacionada
  10.     int 21h
  11.    
  12.     ; Restauramos el segmento y desplazamiento del vector original. En DS:DX colocamos la dirección de la rutina de servicio
  13.     mov ax, es:segme
  14.     mov ds, ax
  15.     mov ax, es:despla
  16.     mov dx, ax
  17.    
  18.     ;Restablecemos el anterior vector de interrupciones
  19.     mov al, 1ch
  20.     mov ah, 25h
  21.     int 21h
  22.    
  23.     ;Liberamos la memoria
  24.     ;mov ax, psp
  25.     ;mov es, XX ;-> es = segmento a liberar
  26.     mov ah, 49h
  27.     int 21h
  28.    
  29.     ret
  30. endp
  31.  

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

jekeyeke

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Liberar Memoria al desinstalar
« Respuesta #1 en: Jueves 27 de Mayo de 2010, 10:25 »
0
Bueno, me autorespondo:

debo poner 'es:psp' para que el programa pille la variable psp, que se encuentra en el segmento anterior, tal y como hice con segme y despla.

Saludos