ida入门(2)
2016-03-13 22:58
323 查看
A、桟帧 stack frame
1、要先保护现场2、将参数按照调用约定,存放在被运行桟帧上, 这样, 这个桟帧的帧顶指针就会发生改变
3、若有必要,调用函数会配置一个帧指针,保存调用方希望保持不变的内容(寄存器值)
4、被调用函数为它可能需要的任何局部变分配空间,需要桟帧栈顶向上(-操作)开辟
5、被调用函数返回值存放在eax寄存器中,或者存放在可以立即被调用到的地方
6、一旦函数完成其他操作,任何局部变量都释放了
7、调用地方,如果重新获得控制权,删除在桟开辟的空间(+操作)
B、调用约定
C语言调用约定: _cdecl(参数从右想做依次入栈),清理方式,调用者清理参数入栈原因:对于参数是可变化的,比如函数:printf(“xxxx”), 调用者肯定知道传入被调用者 printf函数的参数,但是,对于函数printf函数本身是不知道调用者传入的参具体是什么。
比如:函数
void demo(int x, int y, int z)
参数反汇编出来的伪代码大致为:
push x
push y
push z
call demo
add esp, 16
上面的 汇编伪代码中:call demo, 就是进入函数 demo(),开始执行了。
add esp 16, 这个 16 = 4 * sizeof (int)。
标准调用 _stdcall
参数入栈方式:从右到左。
使用_stallcall , 不用对桟帧进行参数管理,调用者进行桟帧维护。
DLL 调用的方式就是 _stdcall
void demo(int x, int y, int z)
参数反汇编出来的伪代码大致为:
push x
push y
push z
call demo
ret 16
快速调用 _fastcall
前两个函数将会被分配给 ECX, EDX。
void demo(int x, int y, int z)
ecx = x, edx = y;
剩下的参数都被按照 _stdcall 调用约定入栈
c++调用约定
使用this指针(c++独有)
VC提供了迪this'll调用,将this传递给ecx
gc++调用约定
参数被当做静态,存放在栈顶
教程下载链接(若发现不能下载,请及时留言,第一时间处理):
http://pan.baidu.com/s/1qWXD4Na
相关文章推荐
- IDA入门(1)
- ida入门(3)
- 第一章
- @SuppressWarnings("resource")
- 黑马安全卫士
- 内网不能ping通公网地址
- Plist 简述
- java day02 for循环的进一步理解
- 287. Find the Duplicate Number hard
- Java 系统高并发解决方案(转载)
- 归并排序
- 黑大助手后端和Android端开发笔记
- Linux内核启动分析
- iOS 沙盒路径详解(存储路径的选择)
- Spring源码入门——DefaultBeanNameGenerator解析
- 初识view
- php实现文件上传下载功能小结
- iOS-Block的总结
- Java类文件的基本结构
- Java注解简单介绍