Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Foros > Ensamblador > ¿como vaciar la pila?
-Foros de debate

Ensamblador
Lista de foros | Lista de mensajes de este foro

Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.

¿como vaciar la pila?
Enviado por rodrigo lezama el día 7 de marzo de 2005

Hola y gracias por leer esto de antemano.
¿Alguien sabe algun metodo para vaciar la pila totalmente en
un programa de ensamblador?
Gracias, un saludo.

 
Re: ¿como vaciar la pila?
Enviado por hiei el día 9 de marzo de 2005

No se si entiendo lo que quieres pero espero que sea esto:
Ha, esto vale para arquitectura X86, no para otras arquitecturas.
Si lo que quieres es sacar todos los datos que hay en la píla puestos con push, calls, int o algo asi deves manegar el SP (Stack pointer) sumandole la cantidad de bytes que has utilizado.
Si lo que quieres es restaurar el SP para que ahora apunte al retornolo deves hacer:
add sp, nbytes
donde nbytes es la cantidad de bytes que ocupan los datos que se apilaron antes. Si haz echo por ejemplo:
push ax
push bx
push dh
Tienes 2+2+1=5 bytes apilados y habra que sumar 5 al SP para vaciar los tres push que haz echo o hacer tres pop con los mismos datos.
Cuidado!!! En la pila estan los retornos de las interrupciones y los call si apuntas el SP mas alla de lo devido de forma que quede por ensima de estos datos retornara a cualquier parte....!!!!!!
Ahora... vaciar TODO el STAK es algo muy relaitvo... (y peligroso pues tambien vaciarias los retoirnos de tu propio programa) Si la intencion es que el programa nunca regrese o que regrese a cualquier otra parte que no sea el llamante aconsejo cambiar la pila por otra alterando el SP y el SS (Stak Segment) por otra ya prearmada con los valores y los punteros a lo que queremos que retorne...

 
Re: Re: ¿como vaciar la pila?
Enviado por xast el día 12 de marzo de 2005

Si quieres vaciar la parte de la pila utilizada por una función puedes hacer lo siguiente:

mi_funcion:
mov ebp,esp ; guardas el valor del registro de pila en ebp
.
.
.
codigo funcion
mov esp,ebp ; recuperas el valor del registro de pila
;antes de entrar
ret

-- Un vacio o limpieza "total" de la pila supondria que el programa dejara de funcionar.

 


Re: ¿como vaciar la pila?
Enviado por wilfredo el día 14 de marzo de 2005

Sobre que plataforma quieres hacer esto, si es un .exe para Dos debes saber que donde destruyas el stack o su información, no la recuperarás más, por tanto donde la destruyas debe ser desde el programa principal y dentro de un módulo llamado por Call, pues al hacer ret se bloquearía o sabe Dios a donde iría a parar el puntero de intrucción, puedes desapilar cuantos datos quieras, pero si lo quieres hacer desde el principio, lo mejor es cuando comiences en tu programa guardes en una variable tuya el valor del registro SP y cuando quieras recuperar o vacear la pila debes poner:

CLI
mov sp, [cs:CopySP]
STI

Te activo y desactivo las interrupciones de hard por si acaso, aunque con una sola intrucción a ajecutar no hay problemas, pero es mejor así. Pero OJO donde restableces esta copia, debes saber que no funcionará un RET sin un CALL posterior a este restablecimiento y ningún pop sin un Push previo

 


Tienda
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network