Programación General > ASM (Ensamblador)

 Liberar Memoria al desinstalar

(1/1)

jekeyeke:
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 --- 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    retfendp 
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 ---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        retendp 
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:
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

Navegación

[0] Índice de Mensajes

Ir a la versión completa