堆栈初识

堆栈

用于临时存放数据的一种【数据项按序排列的数据结构】,堆栈本质上就是一块内存,由于寄存器可存储的大小有限,无法满足程序在运行的时候对临时数据的运算,所以我们需要在内存里开辟一块特殊的空间

1、用于操作临时数据

2、它需要记得自己存了多大的数据

3、对自己所管辖的数据要具有快速查找的功能

设计原理

借用两个三十二位寄存器来存储两个内存地址,这两个内存地址中间的区域就是堆栈的数据 base–>top

两个内存地址相减的值就是存储数据的大小

windows机器堆栈存储数据通常是从大的地址单位向小的地址单位存储数据

两个内存地址任选一个加上偏移量就能找到我们想要的数据

模拟堆栈

堆栈最早存入数据的内存地址编号称为栈底 EBP

堆栈最后存入数据的内存地址编号称为栈顶 ESP

image-20230417105917255

假设ebx寄存器存放的我们栈底的地址

假设edx寄存器存放的我们栈顶的地址

入栈

也就是向堆栈里写入数据

image-20230417102131379

存数据的时候栈底一直不变,也就是ebx不变

接下来存入四个字节的数据,可以先写入数据再改变栈顶的值

image-20230417102915996

也可以先改变栈顶的值再写入数据

image-20230417103756684

出栈

也就是把堆栈里面的数据拿出来 image-20230417105107965

同理,先改变栈顶指针的值,再弹出值也行,重点就在于我们要计算清楚自己想要的数据的地址编号即可

快速操作堆栈

push

image-20230417110246051

pop

image-20230417110601997