博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数的调用过程,栈帧的创建和销毁。
阅读量:4521 次
发布时间:2019-06-08

本文共 1143 字,大约阅读时间需要 3 分钟。

一.函数调用

1.函数调用过程涉及到的寄存器: 

(1)esp:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。 
(2)ebp:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。 
(3)eax 是”累加器”(accumulator), 它是很多加法乘法指令的缺省寄存器。 
(4)ebx 是”基地址”(base)寄存器, 在内存寻址时存放基地址。 
(5)ecx 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。 
(6)edx 则总是被用来放整数除法产生的余数。 
(7)esi/edi分别叫做”源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串. 
在32位平台上,ESP每次减少4字节。 

2.简单的汇编指令: 

mov :数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的) 
sub:减法指令 
lea:取偏移地址 
push:实现压入操作的指令是PUSH指令 
pop:实现弹出操作的指令

call:用于保存当前指令的下一条指令并跳转到目标函数。 

3.内存地址空间的分布: 

函数调用总结起来整个过程就三步: 

1)根据调用的函数名找到函数入口; 
2)在栈中审请调用函数中的参数及函数体内定义的变量的内存空间 
3)函数执行完后,释放函数在栈中的审请的参数和变量的空间,最后返回值(如果有的话) 
如果你学了微机原理,你会想到cpu中断处理过程,是的,函数调用过程和中断处理过程一模一样。

二.栈的创建及销毁

1.栈帧(stack frame),机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。为单个过程(函数调用)分配的那部分栈称为栈帧。栈帧其实是两个指针寄存器,寄存器%ebp为帧指针,而寄存器%esp为栈指针,当程序运行时,栈指针可以移动(大多数的信息的访问都是通过帧指针的)。总之简单一句话,栈帧的主要作用是用来控制和保存一个过程的所有信息的。如图为栈的结构及调用过程:

假设过程P(调用者)调用过程Q(被调用者),则Q的参数放在P的栈帧中。另外,当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾(返回地址就是当程序从Q返回时应该继续执行的地方)。Q的栈帧从保存的帧指针的值开始,后面到新的栈指针之间就是该过程的部分了。

 

转载于:https://www.cnblogs.com/GO-lq/p/8993940.html

你可能感兴趣的文章
第四届CCF软件能力认证
查看>>
字符数组和字符指针的差别
查看>>
简单的横向ListView实现(version 4.0)
查看>>
【转】jbdc程序启动报错:ORA-12505;PL/SQL却可以登录的解决方法
查看>>
Java Spring学习笔记03.@component
查看>>
(十)桥接模式-代码实现
查看>>
Windows Phone开发(29):隔离存储C 转:http://blog.csdn.net/tcjiaan/article/details/7447469...
查看>>
循环单链表操作
查看>>
iOS --- Touch ID指纹解锁
查看>>
强制命令-hdfs 主备间切换
查看>>
echarts使用记录(三):x/y轴数据和刻度显示及坐标中网格显示、格式化x/y轴数据...
查看>>
Spring事务
查看>>
修改Arduino串口缓冲区大小(转)
查看>>
深入解读键值产生原理,linux中的软链接和硬链接(转)
查看>>
CodeForces 591A
查看>>
super 、static、final关键字加深记忆哦!还有父子类构造函数调用问题
查看>>
JDBC之java数据库的连接与简单的sql语句执行
查看>>
图形验证码如何美化?
查看>>
「题解」:[组合数学][DP]:地精部落
查看>>
两个input之间有空隙,处理方法
查看>>