Viernes 15 de Noviembre de 2024, 12:25
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
ASM (Ensamblador)
(Moderador:
Eternal Idol
) »
Liberar Memoria al desinstalar
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Liberar Memoria al desinstalar (Leído 1916 veces)
jekeyeke
Nuevo Miembro
Mensajes: 2
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
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:
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
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
Tweet
jekeyeke
Nuevo Miembro
Mensajes: 2
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
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
ASM (Ensamblador)
(Moderador:
Eternal Idol
) »
Liberar Memoria al desinstalar