栈是一种数据结构,栈是一种思想(后进先出),栈应用于栈内存的分配。
那么数据是如何存入栈中的呢?
栈的存储方向是从高地址往低地址,栈底永远在栈的最高地址,栈顶随压栈、出栈动态移动,一直指向栈的最低地址。
程序的运行实际上是不断的(变量声明、参数传递、函数调用、值返回)的过程。这个过程实际上就是一个压栈的过程。
最先调用的函数内存地址是最高的,函数嵌套调用过程中,被调用函数内存地址逐级变小,每一级栈中的函数也叫栈帧。函数内部的局部变量也随之被压入栈中,第一级函数中的局部变量地址绝对比第二级函数中的局部变量地址大。
在8086CPU中,入栈时,栈顶从高地址向低地址方向增长。任意时刻,SS:SP指向栈顶元素。
当栈满的时候,再次使用push指令入栈,或占空的时候再使用pop指令出栈,都将发生栈顶越界问题。
这里还有2个问题我还没想明白。
下面这个程序在网上找的,
1. 在linux环境下,运行结果是2,3,0,为什么不是2,2,0?
2. 既然参数压栈是从右向左,为什么函数print中形参a,b,c的地址是由大到小?而声明的变量x,y,z的地址是由小到大?
#include <stdio.h>
void print(int a, int b, intc)
{
Int x, y, z;
printf("%d\t%d\t%d\n", a, b, c);
}
int main(void)
{
int p = 0;
print(p++, ++p, p++);
return 0;
}