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

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、汇编代码实现[……]

继续阅读

三种常用的函数调用约定

1、函数调用在汇编中,有关于参数传递与栈平衡的问题,可参照函数调用在汇编中的基本实现,主要有三种方式__cdecl、__stdcall、__fastcall;
2、在C++代码中,可以在函数名前加这三个关键字来设定编译方式,先上代码:

1
// VCTest.cpp : Defines the en[......]<p class="read-more"><a href="https://www.yusian.com/blog/assembler/2018/10/24/2110051290.html">继续阅读</a></p>

函数调用原理–参数篇

1、汇编模拟函数调用的基本过程:

1
2
3
4
5
6
7
8
9
assume cs:code, ds:data, ss:stack
 
stack segment   
    db 20h dup(1)
stack ends    
 
data segment    
    db 20h dup(2)
dat[......]<p class="read-more"><a href="https://www.yusian.com/blog/assembler/2018/10/24/1739131283.html">继续阅读</a></p>