2010-09-03 120 views
37

utilicé la pila en el ensamblaje pero no tuve idea sobre push ebp y pop ebp.explicación acerca de las instrucciones push ebp y pop ebp en el ensamblado

.intel_syntax noprefix 

.include "console.i" 

.text 

askl: .asciz "Enter length: " 
askb: .asciz "Enter breadth: " 
ans: .asciz "Perimeter = " 

_entry: 

    push ebp  # establishing stack-frame 
    mov ebp, esp 
    sub esp, 12 

    Prompt askl 
    GetInt [ebp-4]  # length 
    Prompt askb 
    GetInt [ebp-8]  # breadth 

    mov eax, [ebp-4] # eax = l 
    add eax, [ebp-8] # eax = l + b 
    add eax, eax # eax = 2 * (l + b) 
    mov [ebp-12], eax 

    Prompt ans 
    PutInt [ebp-12] 
    PutEoL 

    mov esp, ebp 
    pop ebp  # unwinding stack-frame 
    ret 

.global _entry 

.end 
+1

¿Por qué publicas todo el código cuando tienes dudas con solo 6 líneas? – Searock

+8

Siempre es mejor dar más contexto que menos. Dicho esto, la pregunta real es realmente vaga y usaría alguna explicación más. –

Respuesta

58

No estoy seguro de si este es su duda, pero tal vez usted se está preguntando acerca de esto:

push ebp 
mov ebp, esp 
sub esp, 12 

Las 2 primeras líneas se conocen como el funcionamiento del ensamblaje de prólogo. Almacena el puntero base anterior (ebp) y establece el puntero base ya que era la parte superior de la pila. Esto significa que todos los contenidos de la pila se guardan en la pila, por lo que la función puede hacer push/pop en la pila.

La línea sub esp,12 está ahorrando espacio para variables locales en la función.

Al final se tienen:

mov esp, ebp 
pop ebp 
ret 

Esta es la inversa el prólogo hace, por lo que el contexto anterior se puede restaurar.

¿Es esta su duda? :)

+5

También tenga en cuenta que tiene una instrucción llamada 'leave' que es exactamente lo que' mov esp, ebp' y 'pop ebp' hace. – jyz

37

ebp se conoce como el puntero base o el puntero de marco. Al ingresar a su función, la presione (para guardar el valor de la función de llamada). Luego, copie esp, el puntero de la pila, en ebp, de modo que ebp apunte ahora al marco de la pila de su función. Al final de su función, presione ebp para restablecer el valor de la función de llamada.

Para obtener alguna aclaración sobre lo que está sucediendo exactamente, la instrucción push coloca el valor del registro especificado (ebp en este caso) en la pila y disminuye el puntero de pila en la cantidad apropiada. La operación pop es lo contrario: incrementa el puntero de pila y toma un valor de la pila y lo coloca en el registro especificado.

Cuestiones relacionadas