2010-11-29 21 views
6

Aloempujar variables locales

Después de que he leído sobre la función y la pila de http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames Tengo una pregunta acerca de las variables locales.

Instantánea del artículo:


push ebp  ; save the value of ebp 
mov ebp, esp ; ebp now points to the top of the stack 
sub esp, 12 ; space allocated on the stack for the local variables 

Esto significa que las variables locales se puede acceder haciendo referencia ebp. Considere el siguiente fragmento de código C y el correspondiente código de montaje:

a = 10; 
b = 5; 
c = 2; 

mov [ebp - 4], 10 ; location of variable a 
mov [ebp - 8], 5 ; location of b 
mov [ebp - 12], 2 ; location of c 

Recuerde que empujar básicamente hace lo siguiente:

sub esp, 4 ; "allocate" space for the new stack item 
mov [esp], X ; put new stack item value X in 


¿Por qué son las variables locales no empuja en la pila de la siguiente manera:

push 10 
push 5 
push 2 

en lugar de

sub esp, 12 

mov [ebp - 4], 10 ; location of variable a 
mov [ebp - 8], 5 ; location of b 
mov [ebp - 12], 2 ; location of c 
+0

Puede hacerlo en boats, ¡pero tenga cuidado con el orden! –

+0

Es sub esp, 4 - mov [esp], 10 no es igual a mov [ebp-4], 10? – chitech

Respuesta

1

Es más una cuestión de semántica que de corrección técnica: push y pop se utilizan para guardar y restaurar registros o valores; pero proporcionar variables locales para una función no corresponde a este propósito regular de push/pop. Entonces, la pila se maneja manualmente aquí (excepto push ebp y pop ebp, porque aquí realmente queremos guardar y restaurar ebp en el verdadero sentido de push/pop).

+0

Thx para la explicación. La instantánea es para variables locales en una función y no para una función. En el artículo utilizan push para parámetros a una función, por lo que me confunden por qué las variables locales no son parámetros como push en la función – chitech

+0

Ups, confundí. Quise decir variables locales. Lo siento. Edité la publicación ahora. – Flinsch

1

Hablando en términos prácticos, si sabe cuánto espacio de pila necesita y lo reserva en una sola operación, puede usar la instrucción mov que se ejecuta más rápido que un impulso (especialmente ahora que el cálculo de desplazamiento tiene hardware dedicado). También hay quizás un componente heredado que tiene que ver con el hecho de que push immed no estuvo disponible en el x86 hasta el lanzamiento de los procesadores 80186/80188. En ese momento, la convención sub/mov se había convertido en un patrón bien establecido.

+0

Ya veo. No creo que el problema del legado sobre push sea un problema para mí. Pero veo que el rendimiento puede tener un impacto usando push. La inserción utiliza una instrucción extra [sub esp, 4] para cada variable local – chitech

Cuestiones relacionadas