主题 : 请教函数_OSCtxSw 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 11332
精华: 0
发帖: 2
金钱: 15 两
威望: 6 点
贡献值: 0 点
综合积分: 4 分
注册时间: 2009-12-03
最后登录: 2010-09-07
楼主  发表于: 2010-09-05 20:49

 请教函数_OSCtxSw

函数_OSCtxSw代码如下,红色部分我一直不是很明白,把ss,sp保存到OSTCBCur中有用吗,后面不是又被OSTCBHighRdy覆盖了?我没看出红色部分起到了什么作用,谁能帮我解释下。谢谢。

PAGE ; /*$PAGE*/
;************************************************* ************************************************** ******
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Note(s): 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The stack frame of the task to suspend looks as follows:
;
; SP -> OFFSET of task to suspend (Low memory)
; SEGMENT of task to suspend
; PSW of task to suspend (High memory)
;
; 3) The stack frame of the task to resume looks as follows:
;
; OSTCBHighRdy->OSTCBStkPtr --> DS (Low memory)
; ES
; DI
; SI
; BP
; SP
; BX
; DX
; CX
; AX
; OFFSET of task code address
; SEGMENT of task code address
; Flags to load in PSW (High memory)
;************************************************* ************************************************** ******

_OSCtxSw PROC FAR
;
PUSHA ; Save current task's context
PUSH ES ;
PUSH DS ;
;
MOV AX, SEG _OSTCBCur ; Reload DS in case it was altered
MOV DS, AX ;
;
LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur->OSTCBStkPtr = SS:SP
MOV ES:[BX+2], SS ;
MOV ES:[BX+0], SP ;

;
CALL FAR PTR _OSTaskSwHook ; Call user defined task switch hook
;
MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
MOV DX, WORD PTR DS:_OSTCBHighRdy ;
MOV WORD PTR DS:_OSTCBCur+2, AX ;
MOV WORD PTR DS:_OSTCBCur, DX ;
;
MOV AL, BYTE PTR DS:_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
MOV BYTE PTR DS:_OSPrioCur, AL ;
;
LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
MOV SS, ES:[BX+2] ;
MOV SP, ES:[BX] ;
;
POP DS ; Load new task's context
POP ES ;
POPA ;
;
IRET ; Return to new task
;
_OSCtxSw ENDP
Stay hungry,stay foolish !
级别: 侠客
UID: 22221
精华: 1
发帖: 54
金钱: 290 两
威望: 64 点
贡献值: 1 点
综合积分: 128 分
注册时间: 2010-05-28
最后登录: 2013-01-04
1楼  发表于: 2010-10-18 22:24
      邵贝贝教授的书上是这样说的,“指向新的堆栈结构的指针保存在任务控制块OS_TCB”中。这个指针包括堆栈段寄存器SS和堆栈指针寄存器SP。
   你指出的“后面不是又被OSTCBHighRdy覆盖了”可能没注意到覆盖之前还有一条语句,CALL FAR PTR _OSTaskSwHook ,调用了函数
OSTaskSwHook(),前面的这个赋值操作可能就是为OSTaskSwHook()作准备吧。
[ 此帖被wi100sh在2010-10-18 22:30重新编辑 ]