2011-12-02 28 views
16

Actualmente estoy aprendiendo ensamblaje para procesadores Intel. Desde la pila 'crece hacia abajo', ¿por qué tenemos que añadir con el fin de acceder a un elemento específicoregistros de ensamblaje esp y ebp

[ebp + 8] ;; This will access the first param 

I konw tenemos que omitir el valor ebp de edad y la dirección de retorno y es por eso que utilizamos 8 (porque cada uno tiene 4 bytes de longitud). Esto es un poco extraño.

Además, si ebp es una copia de seguridad de esp, ¿cuál es el valor de EBP en la función principal Ex:

_start: 

;; what's ebp value here ? 

push eax 
push ebx 
call someFunction ;; this will create a stack frame 

+-----------+ 
| param1 | 
+-----------+ 
| param0 | <--- this is [ebp + 8] (assuming mov ebp, esp) 
+-----------+ 
|ret_address| 
+-----------+ 
| ebp | 
+-----------+ <--- esp 

y también cuando nos asignar memoria para los locales, tenemos que restar desde ebp ... Por favor, brinde una respuesta no ambigua. ¡Gracias!

+1

Una función main() no es diferente de una función normal, tiene un prólogo también. No mostró uno en su fragmento de ensamblaje, no estoy seguro por qué. El espacio para los locales se crea ajustando esp, no ebp. –

+0

Hay las mismas preguntas: http://stackoverflow.com/questions/1395591/what-is-excaly-the-base-pointer-and-stack-pointer-to-what-do-theypoint, y otras vinculadas a es – Abyx

Respuesta

2

Como dijiste, la pila crece. Entonces, restas para hacer crecer la pila para los locales. Usted agrega mirar hacia atrás en la pila para ver los elementos almacenados allí.

13

El valor inicial para %ebp es generalmente 0. Esto es para que los depuradores sepan cuándo finalizar siguiendo la cadena de enlace en una traza inversa.

Deberías pensar en %ebp como punto de referencia. Para mayor comodidad, se coloca entre los argumentos de la función y las variables locales. De esta forma, accedes a argumentos con un desplazamiento positivo y variables con un desplazamiento negativo, por lo que es fácil saber si estás accediendo a una variable o un argumento.

+0

¿Por qué 0? Inicial cuando la CPU está encendida? – Abyx

+0

'% ebp' generalmente se inicializa a 0 con el cargador o la biblioteca de tiempo de ejecución. Esa inicialización a 0 a veces se especifica en un documento formal (por ejemplo: IIRC el ELF x86 psABI lo especifica). – ninjalj

+0

¿qué cargador o qué tiempo de ejecución? Si está hablando de un sistema operativo específico, explíquelo. En mi sistema operativo, 'ebp' no se inicializa en 0, al menos en modo usuario. Además, para ser precisos, el nombre de registro es 'ebp', no'% ebp'. '%' es un prefijo para el nombre de registro. – Abyx

Cuestiones relacionadas