在计算机系统中,栈是一个后进先出的动态内存区域。程序可以将数据压入(push)栈中,也可以将数据从栈弹出(pop)。压栈操作使得栈增大,而弹出操作使栈减小。在经典的操作系统里,栈总是向下增长的。在 i386 里,栈顶由称为 esp 的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶地址增大。

本文将讲解栈与函数调用的密切关系。

一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。大多数机器,包括 IA32(Intel Architecture x32),只提供转移控制到过程 (call) 和从过程中转移出控制 (ret) 这种简单的指令。数据传递、局部变量的分配和释放通过操纵程序栈来实现。

C 语言中的数组是一种将标量数据聚集成更大数据类型的方式。C 语言实现数组的方式非常简单,因此很容易翻译成机器代码。C 语言一个不同寻常的特点是可以产生指向数组中元素的指针,并对这些指针进行运算。在机器代码中,这些指针会被翻译成地址计算。

C语言中的某些结构,比如条件语句、循环语句和分支语句,要求有条件的执行。根据数据测试的结果来决定操作执行的顺序。机器代码提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流或者数据流。