Daily Archives: 2018年10月24日

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

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>