2012-02-04 30 views
8

Estoy aprendiendo el lenguaje ensamblador. ¿Qué es exactamente el orden de empuje de argumento? Entiendo cómo se envían los argumentos a la pila, pero ¿qué significan las partes izquierda y derecha? izquierda o derecha de qué? O simplemente tiene que ver con la forma en que se escribe semánticamente el comando, es decir .:¿Qué es el argumento push order?

mov ebp, esp; esp se mueve a ebp, de derecha a izquierda.

¿Es correcto o alguien podría aclararme?

¡Muchas gracias!

Respuesta

11

El procesador no conoce los 'argumentos de funciones'. Por lo tanto, cuando quiera escribir f(a,b,c), realmente debe presionar los argumentos 'en algún lugar'.

Esto es una convención. Sé que en la mayoría de las máquinas x86, los argumentos de función se empujan en la pila de derecha a izquierda, es decir, primero c, luego b, luego a.

push c 
push b 
push a 
call f 

Ahora la función llamada puede utilizar ebx -1 para a, ebx - 2 para b y ebx - 3 para c.

También podría establecer una convención que diga: los primeros dos argumentos están en los registros ebx y ecx, el resto está en la pila. Mientras la persona que llama y el que está de acuerdo acuerden, usted está bien.

7

Además de la explicación de xtofl puede que desee echarle un vistazo a esta tabla de x86 calling conventions. Lo que notará, con respecto al orden de los argumentos es que casi todos de los argumentos se presionan de derecha a izquierda (el argumento de la derecha se empuja primero) con la excepción de Pascal.

Otro escenario que xtofl no abarca son los argumentos de registro: algunos ABI requieren que algunos argumentos estén en los registros en oposición a en la pila. En un sistema x86_64, por ejemplo, la función:

int add3(int a, int b, int c) 

pondrá argumentos:

a -> rdi 
b -> rsi 
c -> rdx 

En concreto, este se vería así (la sintaxis de Intel):

mov  rdi, [source-of-a] 
mov  rsi, [source-of-b] 
mov  rdx, [source-of-c] 
call add3 

Así los registros se llenan desde la lista de registros de izquierda a derecha y luego se usa la pila de derecha a izquierda.

Como xtofl dice, no importa lo que usted ha proporcionado la persona que llama y el destinatario de acuerdo - con claridad, sin embargo, si la persona que llama y la parte llamada no están de acuerdo que va a causar problemas de incompatibilidad y esto en realidad no es una preocupación solo para ensamblador, pero también para lenguajes de nivel superior; afortunadamente, los compiladores operan principalmente de derecha a izquierda. Para una lectura posterior, es posible que la limpieza del llamante/llamante de la pila sea interesante, y tenga en cuenta cómo se estandarizó con un método para x86_64.

Usted no dice que está utilizando x86 - su arquitectura seguramente tendrá una convención de llamadas estándar, ya que trabajar sin ella es difícil.

+0

Muchas gracias a los dos. Eso fue muy útil y lo entiendo mucho mejor ahora! Gracias mil! – Axolotl

Cuestiones relacionadas