Esta es la razón por la cual los argumentos son empujados en orden inverso en la convención de llamada C, por ejemplo:
Si llama:
printf("%s %s", foo, bar);
La pila termina como:
...
+-------------------+
| bar |
+-------------------+
| foo |
+-------------------+
| "%s %s" |
+-------------------+
| return address |
+-------------------+
| old frame pointer | <- frame pointer
+-------------------+
...
Los argumentos se acceden indirectamente utilizando su desplazamiento desde el puntero de marco (el puntero de marco puede omitirse mediante compiladores inteligentes que saben cómo calcular cosas desde el puntero de pila). El primer argumento siempre se encuentra en una dirección conocida en este esquema, la función accede a tantos argumentos como le indiquen sus primeros argumentos.
intente lo siguiente:
printf("%x %x %x %x %x %x\n");
Esto volcar parte de la pila.
Para 'printf' * et al *, usted sabe cuántos argumentos adicionales esperar dependiendo de la cadena de formato. –
Esperaría que se empuje una cantidad similar a la cantidad de argumentos después de todos los argumentos, pero ese no es el caso en las listas a las que se vincula. – sharptooth