OSCtxSW()函数在80x86上移植的理解
来源:互联网 发布:闲杂软件 编辑:程序博客网 时间:2024/05/17 02:32
OSCtxSw()是任务级切换函数,其实就是一个软中断,下面我就来分析一下在PC上移植的代码一行一行进行解析解析
_OSCtxSw PROC FAR
//调用子程序,PROC和ENDP是配对使用的,过程的最后一条指令一般是返回指令(RET)。
PUSHA
//将所有通用寄存器按顺序存储到堆栈:EAX、ECX、EDX、EBX、EBP、ESP、EBP、ESI 及 EDI进行入栈,
PUSH ES ;
PUSH DS
// ES和DS不是通用寄存器所以单独入栈
MOV AX, SEG_OSTCBCur
MOV DS, AX
//SEG_OSTCBCur是什么?是OSTCBCur所在的段地址,放入DS段寄存器中去
LES BX, DWORD PTR DS:_OSTCBCur
把DS:_OSTCBCur这个地址分开装,BX里面存放OSTCBCur地址,ES里面存放的是SEG_OSTCBCur
MOV ES:[BX+2], SS ;MOV ES:[BX+0], SP
将堆栈指针位置SP保存到任务A的任务控制块OS_TCB的OSTCBStkPtr成员中
CALL FAR PTR _OSTaskSwHook
//调用钩子函数OSTaskSwHook().应用程序人员可以在钩子函数中编写需要的代码
MOV AX, WORD PTR DS:_OSTCBHighRdy+2
MOV DX, WORD PTR DS:_OSTCBHighRdy
MOV WORD PTR DS:_OSTCBCur+2, AX
MOV WORD PTR DS:_OSTCBCur, DX
//这段话的意思是其实就是 OSTCBCur = OSTCBHighRdy
MOV AL, BYTE PTR DS:_OSPrioHighRdy
MOV BYTE PTR DS:_OSPrioCur, AL
// 这两句的意思就是OSPrioCur = OSPrioHighRdy
LES BX, DWORD PTR DS:_OSTCBHighRdy
MOV SS, ES:[BX+2] ;
MOV SP, ES:[BX]
//把新任务的堆栈指针取出来SS:SP = OSTCBHighRdy->OSTCBStkPtr
POP DS
POP ES
//把新任务堆栈里面的DS和ES寄存器出栈
POPA
//把新任务所有的通用寄存器出栈
IRET
/*执行IRET中断返回指令,依次从任务A的私栈中弹出:一是任务A上次断点地址的偏移地址到IP寄存器 二任务A上次断点地址的段移地址到CS寄存器
三程序状态字PSW(中断是开放)然后跳转到CS:IP位置处(上次断点位置)继续执行任务A的代码*/
_OSCtxSw ENDP
结束了,小伙伴们懂了么?
- OSCtxSW()函数在80x86上移植的理解
- µC/OS-II在80x86上的移植
- opencv在arm和x86上的移植
- 第十章 μC/OS-Ⅱ在80x86上的移植
- [UC/OS-II原理及应用]μC/OS-Ⅱ在80x86上的移植
- OSCtxSw()
- BLCR在80x86架构上的运行总结
- Linux在X86上的虚拟内存管理
- Linux在X86上的虚拟内存管理
- 在X86上用gdb设置带函数入参判断的条件断点
- 在X86上交叉编译ARM64 linux上的NCNN
- MicroCE/OS-II在80C196上的移植实现
- DSP 内联函数(inline)在x86上实现的一些要点之后的验证方法(一)感悟
- X86架构上函数调用过程的堆栈
- X86架构上函数调用过程的堆栈
- X86架构上函数调用过程的堆栈
- netmap 在x86上实验
- 80x86汇编语言:在屏幕上模拟输入密码的过程
- 在表维护生成器中添加F4及自动带出描述
- 分享Android双人五子棋对战
- 学习salt的源码2-run_job
- kali攻防第11章 攻击实例讲解-ms10_046快捷方式图标漏洞
- PHP接口与继承的简单实例
- OSCtxSW()函数在80x86上移植的理解
- C语言中的柔性数组
- 绘图 - 9
- 101,使用Category给API里面的类添加新方法
- Android ListView下拉/上拉刷新:设计原理与实现
- OpenSSL-0.9.8g 安装与配置指南
- 论文次序哪个为准
- 如何把前台传的两个date类型在js中转换成天
- 黑马程序员 - OC语言 - NSString前后缀检查及搜索