目录
古岂无人!孤标凌云道为朋,剑宿吾命,亦狂亦侠亦超尘。
一、前面
本章将以汇编视角看函数栈帧的内存是如何使用与回收的,为了降低汇编语言的理解成本,以图示的方式讲解每一步汇编指令所带来的效果,来逐步展示函数栈帧的形成与销毁的整个过程。
展示环境:win10 && vs2019
二、预备知识
这些预备知识理解与否对本篇文章并无很大关系,之所以预备这些知识是为了让读者能够更加相信函数栈帧的形成与销毁过程就是如此。
栈区:内存四区之一,内存为了使用和管理,被划分为四部分,其中栈区就是内存被划分的区域之一,栈的使用习惯是,先使用高地址部分,在使用底地址部分。
函数栈帧:即在调用函数时,为函数开辟的一块内存空间,由于该内存空间在栈区,因此该空间被称作函数栈帧,简称栈帧。
栈顶:故名思意,就是栈的顶部,更确切的说是指向存放在栈区数据的顶部。
栈底:栈的底部。
寄存器:寄存器cpu内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。简单来说就是独立于内存,用来存储少量数据的器件。
ebp:栈底指针寄存器
esp:栈底指针寄存器
其它寄存器:ebx、esi、edi、ecx、eax
入栈(压栈):先将栈顶指针向上移动四字节的大小空间,再将寄存器的数据放入那四字节空间。这里的向上移动是指向低地址处移动。
入栈指令:push a。
图解:以push a为例。
出栈:将栈顶指针向下移动四字节,这里的向下是往低地址处移动四个字节的空间。并将这四个字节的数据放入某个寄存器中。
出栈指令:pop a。
图解:以pop a为例。
简单汇编操作指令
mov a b:将b赋值给a,c语言表示就是a=b。
sub a b:将a-b的结果赋值给a,c语言表述就是a=a-b。
add a b :将a+b的结果赋值给a,c语言表述就是a=a+b。
由于理解成本的原因,遇到的其它汇编指令本文会直接指出它的作用效果。</