assembly

assembly - ¿Qué son los registros ESP y EBP?



(3)

Encontré que el registro ESP es el puntero de pila actual y EBP es el puntero base para el marco de pila actual. Sin embargo, no entiendo estas definiciones (apenas estoy empezando a aprender a codificar en el ensamblador).

Lo que entiendo es que ESP apunta hacia la pila en sí y EBP apunta hacia lo que está en la parte superior de la pila. Pero estas son solo mis suposiciones y probablemente sean incorrectas. De lo contrario, ¿qué significaría una declaración como la siguiente?

MOV EBP, ESP

EDITAR: Creo que la declaración anterior es un error tipográfico de mi libro. Creo que debería ser EBX en lugar de EBP


EBP y ESP son remanentes de la era, donde los compiladores, por ejemplo, no tenían un análisis estático para detectar cuántos bytes de una pila se necesitan en una llamada de función. También se suponía que la pila crecía y se reducía dinámicamente durante la ejecución de una función, las interrupciones habrían permitido destruir toda la pila de 0 a SP, y el código de espagueti era el estándar de facto. En realidad, las interrupciones (y el paso de parámetros a través de registros solos) fueron el método diseñado para llamar a las funciones del kernel.

En este entorno, es necesario tener un punto fijo de la pila, donde siempre se encuentran la dirección de retorno al llamante, las variables locales y los argumentos de una función. Así se justificó el registro de bp . En esta arquitectura, se permitió la indexación de bp ([bp - 300h]), pero no de sp . Esos codificaciones de opcodes / instrucciones que podrían haberse interpretado como mov ax, [sp + 1111h] se reutilizaron para otros fines.

En 386+ y mediante la introducción de la ''E'', ESP ganó la propiedad de compensación. En este momento, EBP se liberó del único propósito, ya que esp fue capaz de manejar ambas tareas.

Tenga en cuenta que incluso ahora EBP apunta a la memoria a través del segmento de pila, al igual que ESP . EBX y BX usan DS.


Normalmente, EBP se usa para hacer una copia de seguridad de ESP, por lo que si el código de una función cambia ESP, todo lo que se necesita para restaurar ESP es mov ESP, EBP. Además, dado que el código en una función normalmente no modifica el EBP, se puede usar para acceder a parámetros o variables locales pasados ​​sin tener que ajustar las compensaciones.

Para el uso del "marco de pila", EBP se inserta en la pila al inicio de cualquier función, por lo que el valor de EBP empujado en la pila es el valor de EBP de la función que llamó a la función actual. Esto hace posible que el código o el depurador "retroceda" a través de todas las instancias en las que se colocó EBP en la pila, y cada instancia de un valor de EBP en la pila podría considerarse como el puntero base de un marco de pila .

Tenga en cuenta que algunos compiladores tienen una opción de "omitir los punteros de trama", en cuyo caso EBP no se utiliza para guardar ESP o como un puntero de trama de pila. En su lugar, el compilador realiza un seguimiento de ESP, y todas las compensaciones locales son compensaciones del valor actual de ESP.


esp es el puntero de la pila, ebp es / era para un marco de pila, de modo que cuando ingresó a una función, ebp podría obtener una copia de esp en ese punto, todo lo que está en la pila antes de eso sucede, la dirección de retorno, los parámetros, etc. que son globales para esa función (las variables locales) ahora estarán a una distancia estática del puntero del marco de la pila durante la duración de la función. esp ahora es libre de deambular según lo desee el compilador y se puede utilizar cuando se anida a otras funciones (cada una necesita preservar el ebp de forma natural).

Es una forma perezosa de manejar la pila. facilita mucho la depuración del compilador, facilita la comprensión del código generado por el compilador, pero graba un registro que de otro modo podría haber sido de propósito general.