¿como vaciar la pila?

rodrigo lezama
14 de Marzo del 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.

wilfredo
14 de Marzo del 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

hiei
14 de Marzo del 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...