Tag Archives: 函数本质

函数调用原理–完善篇(栈帧)

1、参考链接:
1.1 函数调用原理–参数篇
1.2 函数调用原理–局部变量

2、局部变量空间分配后没有初始化,可能会出现异常访问而出现不可预知的错误,因为分配的临时空间必须初始化;
2.1、将每个字节都初始化为CC其中一种安全策略,因为CC在汇编指令中为int 3,即中断指令。
2.2、stosb/stosw指定能将es:di指向的空间写入ax寄存器中的值,并在执行结束后将di自加1字节/2字节
2.3、rep会循环指定后一条指令,循环次数从cx寄存器中取,如果为0则退出循环

3、汇编代码实现[……]

继续阅读

函数调用原理–局部变量篇

1、参考链接
1.1、函数调用原理–参数篇

2、函数需要解决的三大问题:参数、返回值、局部变量
2.1、参数在函数执行前压栈,执行结束后恢复内平栈或外平栈的方式恢复栈顶位置释放空间;
2.2、返回值一般直接存储在寄存器ax中,函数运行结束后在ax中读取
2.3、函数内部的局部变量也是通过栈来存储

3、函数局部变量面临的几个问题
3.1、专用空间,不被其他数据覆盖;
3.2、对栈进行操作,结束后需要对栈进行恢复操作;
3.3、临时空间使用结束后及时释放

4、基本实现思路
4.1、保存栈顶位置(sp);
4.2、将栈顶位置往前移动一段位置做为局部变量专有空间;
4.3、通过原栈顶+偏移位置(bp寄存器)来访问专用的临时空间;
4.4、结束后恢复原来栈顶位置;
4.5、考虑到函数的嵌套调用,保护和恢复bp同样重要!

5.0、汇编代码实现[……]

继续阅读