根据操作系统的不同,编译器,编译选项的不同,同一文件不同函数的代码在内存代码区中的分布可能相邻,也可能相离甚远,可能先后有序,可能无序
但,它们都在同一个 PE文件的代码 映射的一个 “节” 里。
我们可以简单把它们在内存代码区中的分布位置理解成是散乱无关的。
CPU是从哪里获得 函数的调用及返回的信息的呢?
这些代码区中精确的跳转都是在与 系统栈 巧妙地配合过程中完成的。
当函数被调用时,系统栈会为这个函数开辟一个新的 栈帧。并把它压入栈中
这个栈中的内存空间被它所属的函数独占
正常情况下是不会和其他函数共享的
当函数返回时,系统栈会弹出该函数所对应的栈帧。
每一个函数独占自己的栈帧空间
( !当前正在运行! ) 的函数的栈帧总是在栈顶
win32系统提供的两个特殊的寄存器 ESP EBP 用于标识 位于系统栈 顶端的栈帧
就是 ESP EBP 是服务于 当前正在运行 的函数的 ,是为当前正在运行的函数 的栈帧 指定地址的。
ESP : 栈指针 寄存器 ,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶
EBP : 基址指针 寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部
ESP 和 EBP 之间的内存空间为当前栈帧