El comportamiento de la pila (creciendo o disminuyendo) depende de la interfaz binaria de la aplicación (ABI) y de cómo está organizada la pila de llamadas (también conocida como registro de activación).
A lo largo de su vida útil un programa está obligado a comunicarse con otros programas como el sistema operativo. ABI determina cómo un programa puede comunicarse con otro programa.
La pila para diferentes arquitecturas puede crecer de cualquier forma, pero para una arquitectura será consistente. Por favor, consulte el enlace de la wiki this. Pero, el crecimiento de la pila es decidido por el ABI de esa arquitectura.
Por ejemplo, si toma MIPS ABI, la pila de llamadas se define a continuación.
Consideremos que la función 'fn1' llama 'fn2'. Ahora el marco de pila visto por 'fn2' es el siguiente:
direction of | |
growth of +---------------------------------+
stack | Parameters passed by fn1(caller)|
from higher addr.| |
to lower addr. | Direction of growth is opposite |
| | to direction of stack growth |
| +---------------------------------+ <-- SP on entry to fn2
| | Return address from fn2(callee) |
V +---------------------------------+
| Callee saved registers being |
| used in the callee function |
+---------------------------------+
| Local variables of fn2 |
|(Direction of growth of frame is |
| same as direction of growth of |
| stack) |
+---------------------------------+
| Arguments to functions called |
| by fn2 |
+---------------------------------+ <- Current SP after stack
frame is allocated
Ahora puede ver que la pila crece hacia abajo. Entonces, si las variables se asignan al marco local de la función, las direcciones de la variable realmente crecen hacia abajo. El compilador puede decidir sobre el orden de las variables para la asignación de memoria. (En su caso, puede ser 'q' o 's' que primero se asigna la memoria de pila. Pero, en general, el compilador acumula la asignación de memoria según el orden de la declaración de las variables).
Pero en el caso de las matrices, la asignación solo tiene un puntero y la memoria necesita asignarse apunta en realidad con un solo puntero. La memoria debe ser contigua para una matriz. Entonces, aunque la pila crece hacia abajo, para las matrices la pila crece.
El orden es arbitrario. La brecha es probablemente para almacenar un resultado intermedio como & q o & s - mire el desmontaje y compruébelo usted mismo. –
Acepto, lea el código de ensamblaje. Si hace este tipo de preguntas, es hora de aprender a leerlo. –
este código no tiene nada que ver con la pila. – specializt