汇编与协程任务切换:过程调用的秘密
本文主要探讨了过程调用与返回的顺序、协程任务切换的原理,以及C函数返回struct类型的实现方法。 1. 过程调用与返回的顺序通常是相反的,即最后调用的过程先返回。然而,通过汇编语言编程,我们可以打破这一规则。在给定的x86-32架构汇编代码中,GET过程保存处理器和栈信息,而SET过程则用于恢复这些信息。关于SET过程: - 1.1 SET过程的返回地址通常位于栈顶,即ESP寄存器指向的位置,而其返回值通常取决于SET过程的具体实现,如果没有显式设置,返回值可能是0或未定义。 - 1.2 (A)指令可能是`mov eax, [ebp+4]`,执行后eax将存放传递给SET过程的内存块地址;(B)指令可能为`mov ecx, [eax]`,执行后ecx将存放内存块中保存的处理器状态的一部分;(C)指令可能是`pop ebx`,用于恢复EBX寄存器的值,这是过程调用时保存的;(E)指令可能是`ret`,用于返回到调用者。 2. 协程任务切换可以通过类似的方式实现。在给出的`ribs_swapcurcontext`汇编代码中: - 2.1 工作原理是保存当前上下文(包括栈指针和一些保存的寄存器),然后加载新的上下文,最后使用`ret`指令返回到新上下文的调用点。这样,协程可以无痛地在不同执行点之间切换,因为所有必要的状态都已经保存和恢复。 - 2.2 选择保存的通用寄存器数量较少可能是因为这些寄存器在程序执行中通常较为关键,而其他的寄存器可能在不重要的计算中使用,或者在协程切换时不需要特别保存。此外,减少保存和恢复的开销可以提高效率。 3. C函数返回struct类型的实现涉及到栈上的布局和参数传递。当一个C函数返回struct类型时,编译器会创建一个临时结构体实例在栈上,并将结果复制到这个实例中。在调用函数`return_struct`时: - 在x86-64架构中,由于struct大小超过一个寄存器,所以struct会被拆分成多个部分,依次放入栈中。栈的布局可能如下: ``` +-----------------+ | ddd | +-----------------+ | eee | +-----------------+ | coo | +-----------------+ | bye | +-----------------+ | age | +-----------------+ | return address | +-----------------+ | saved registers | +-----------------+ ``` - 调用`return_struct`时,编译器会在栈上分配空间来存储struct实例,然后调用函数。函数执行完毕后,控制权返回到调用者,此时调用者可以从栈上取回struct实例。 总结,本文涵盖了过程调用的顺序、协程任务切换的实现细节,以及C函数返回struct类型的底层机制,深入理解这些概念对于理解和编写低级别的系统级程序至关重要。
![](https://csdnimg.cn/release/download_crawler_static/86282165/bg1.jpg)
下载后可阅读完整内容,剩余5页未读,立即下载
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/713129d87b174797861f6e576249a48c_weixin_35755188.jpg!1)
- 粉丝: 190
- 资源: 325
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决Eclipse配置与导入Java工程常见问题
- 真空发生器:工作原理与抽吸性能分析
- 爱立信RBS6201开站流程详解
- 电脑开机声音解析:故障诊断指南
- JAVA实现贪吃蛇游戏
- 模糊神经网络实现与自学习能力探索
- PID型模糊神经网络控制器设计与学习算法
- 模糊神经网络在自适应PID控制器中的应用
- C++实现的学生成绩管理系统设计
- 802.1D STP 实现与优化:二层交换机中的生成树协议
- 解决Windows无法完成SD卡格式化的九种方法
- 软件测试方法:Beta与Alpha测试详解
- 软件测试周期详解:从需求分析到维护测试
- CMMI模型详解:软件企业能力提升的关键
- 移动Web开发框架选择:jQueryMobile、jQTouch、SenchaTouch对比
- Java程序设计试题与复习指南
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)