不调用具有"协程特性"的系统API函数而使用汇编实现协程
来源:互联网 发布:网络上说表妹什么意思 编辑:程序博客网 时间:2024/05/23 11:28
上一篇根据云风的协程库实现了windows下的协程:fiber协程
今天,打算用汇编实现一下(windows下汇编),实现之前需要先复习下函数调用的基础:点击打开链接 点击打开链接2 点击打开链接3
每个函数都有自己的堆栈,一般函数开头都有类似的语句:push ebp;mov ebp,esp;且函数调用前会将eip入栈,
以使函数能够正确返回.即可回到函数入口处继续往下执行,因此保存上下文信息(寄存器信息),获取当前程序(函数)
运行完成后怎么返回是我们实现的关键,亦即获取eip信息并入栈是我们实现的关键.需要清楚的是,eip入栈后才进行上下文的保存.
一个函数大概的流程: 将函数需返回指令地址入栈 -> 保存ebp等寄存器信息 -> 函数运行 -> 将ebp等数据出栈 -> 将指令地址出栈到eip中
程序根据eip信息继续执行!!
用汇编实现最好采用C调用汇编函数的方式调用,汇编代码保存在.S文件中,可参考libco开源库,如果采用C函数嵌入汇编的方式,则可能
会出现问题,因为debug模式/release模式或release优化模式生成的汇编都不同,可能导致不能准确的获取到 指令地址!!! 后来经过大神引导
才知道有裸函数这种用法。普通嵌入汇编:
A:
void test(){
__asm{
...
}
}
A调用方法,会在进入汇编之前做一些上下文的保存,使我们获取 指令地址不太方便,因为我们不知道中间堆栈有多少变化!!
裸函数嵌入汇编:
B:
__declspec(naked) void __cdecl test(){
__asm{
...
}
}
B调用方法,不会生成多余的汇编,需要我们手动对上下文进行保存,因此,我们很清除的知道堆栈变化,从而方便获取指令地址!!!
需要注意的是本人使用的VS2013,配置管理配置的Win32,所以没问题,如果改成X64,不但不支持__asm{}这种用法,也不可
使用naked这样的裸函数用法,所以,还是可以把汇编单独成汇编文件供C/C++调用.x86平台转x64平台关于内联汇编不再支持的解决
VS2012下X64平台嵌入汇编程序 VS2010中编写x64汇编的具体方法 ,上面的方法都是通过汇编生成**.obj文件,然后一起链接生成
最后需要的文件。据说还可以用asmjit(google的一个即时编译器库)或 shellcode。
shellcode使用实例如下:
UCHAR ShellCode[] = {机器码};
typedef (type)(*funptr)(...);
funptr f = (funptr)ShellCode;
f();
共享栈和非共享栈协程(stackful/stackless):
共享栈是时间换空间,所有协程都共享一个公共栈,当协程较多时大大的节约了内存,但是由于共享,所以栈数据的拷贝将大大降低效率,不过共享栈可以
让调用者不用担心协程栈的大小问题,基本不用担心栈爆掉的现象。
非共享栈是空间换时间,每个协程都有自己独有的栈
可以根据具体的场景决定使用共享栈还是非共享栈。
- 不调用具有"协程特性"的系统API函数而使用汇编实现协程
- C函数调用-不使用函数返回值,而用参数实现输入/输出的4种模式
- 使用库函数API和C代码中嵌入汇编代码两种方式实现对sysinfo的系统调用
- 在具有多态特性的类体系中,向客户提供使用接口,而不去暴露类的体系结构。
- 函数调用的汇编实现浅析
- C语言函数调用的汇编实现
- MMS不调用系统函数实现流程
- 好系统应具有的特性
- 汇编函数的调用
- Win32汇编 API的调用
- 使用IDA反汇编系统NTReadVirtualMemory函数,模拟实现里边的部分函数
- 为何汇编里调用C函数需要堆栈,而汇编语言的函数的调用却不需要堆栈
- 使用库函数API和C代码中嵌入汇编代码两种方式使用系统调用
- 使用嵌入汇编调用open系统调用
- DELPHI中调用API函数ExitWindowsEX可以实现系统的关机,注销,和重启
- 反汇编 函数的调用和实现_笔记
- 库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 【c++】复合类型
- BlockingQueue的原理浅析及其在项目中的应用
- 尚硅谷java学习笔记——10.java IO流
- Android中让TextView的字体部分显示颜色
- java调用peopleSoft webservice
- 不调用具有"协程特性"的系统API函数而使用汇编实现协程
- C 语言入门 慕课网
- 详细图解mongodb 3.4.1 win7x64下载、安装、配置与使用2017/01/16
- List list = new ArrayList();和ArrayList list=new ArrayList();的区别?
- 用JS,JQuery格式化日期或者Select标签的选项
- 前端学习笔记-HTML(二)
- [ATL/WTL]_[初级]_[选择目录对话框]
- SQL 事务
- Zookeeper不停打印错误日志NoClassDefFoundError原因排查,ConnectRequest