程序存储器分为:text,data,bss,heap,stack
text:代码段,存储汇编后程序机器语言指令,该段内执行是非线性的。text段禁用写权限。
data:存储程序运行过程中要使用的全局变量,字符串和其他常量。
bss:存储未初始化的内容。
heap:heap段的大小是可变的。heap段中的所有存储单元又配器和回收器算法管理。分配器在堆中预留一部分区域,回收器取消预留的存储器,使该区域可以被下一次预留重新使用。堆从存储器的低地址向高地址增长。
stack(先进后出):stack段的大小是可变的。stack段用作中间结果暂存器来存储断点信息。当一个程序运行时,函数将有它自己的传递变量集,并且函数的代码会在文本段(代码段)的不同存储单元内。函数调用时,程序的运行环境和EIP必须改变,堆栈存储所有被传递的变量,以及函数执行后EIP应该返回的地方。数据被存入堆栈中时成为压栈(Push),数据取出被称为出栈(POP).
void test_function(int a,int b,int c,int d) { char flag; char buffer[10]; } void main() { test_function(1,2,3,4); }
这一段代码声明了一个具有4个参数的test函数。
当主函数调用时,值被压入堆栈以创建下述堆栈帧。当调用test_function()时,逆序将函数压入堆栈,函数的参数是1,2,3,4,因而随后的压栈指令压入4,3,2,1.
当汇编call执行执行时,为了将执行环境变成test_function(),返回地址被压入堆栈。这个值是紧跟在当前EIP之后的那一条指令。
紧随返回地址的是帧指针,这个值用来恢复EBP原来的值。然后,把ESP的值复制到EBP中。
当函数调用时,EIP的值被修改为函数在代码段中的首地址,以执行函数。
函数执行结束时,EIP被设置为返回地址。
原文地址:https://www.cnblogs.com/98Lucifer/p/8893743.html
时间: 2024-11-08 16:11:46