assembly intel cpu-registers

assembly - registros de montaje esp y ebp



intel cpu-registers (2)

Actualmente estoy aprendiendo ensamblaje para procesadores Intel. Dado que la pila ''crece'', ¿por qué tenemos que agregar para acceder a un elemento específico?

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

Sé que debemos omitir el valor antiguo de ebp y la dirección de retorno y por eso usamos 8 (porque cada uno tiene 4 bytes de longitud). Esto es un poco extraño.

Además, si ebp es una copia de seguridad para 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 asignamos memoria a los locales, tenemos que restar de ebp ... Por favor, dé una respuesta no ambigua. ¡Gracias!


El valor inicial para %ebp suele ser 0. Esto es para que los depuradores sepan cuándo terminar después de la cadena de enlaces en un backtrace.

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


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