又要通宵好几晚上了,急求帮忙分析下面保存上下文esp是否正确!!谢谢
其中有一句 //此时上下文中得到的esp是不正确的
有没什么问题啊,网上的ucos的保存上下文的代码
void uniTskCtxSw(void)
{
UINT32 uwIntSave;
UINT32 *sp;
TSK_CB_S *pstSwitchIn;
TSK_CB_S *pstSwitchOut;
uwIntSave = uniIntDisable();
ContextCB[g_pRunningTask->usPriority] = Context;
sp = (UINT32 *)Context.Esp; //得到主线程当前堆栈指针
//在堆栈中保存相应寄存器。
//*--sp = Context.Eip; //先保存eip
*--sp = osTickSwitch;
*--sp = Context.EFlags; //保存efl
*--sp = Context.Eax;
*--sp = Context.Ecx;
*--sp = Context.Edx;
*--sp = Context.Ebx;
*--sp = Context.Esp; //此时保存的esp是错误的,但OSTCBCur保存了正确的
*--sp = Context.Ebp;
*--sp = Context.Esi;
*--sp = Context.Edi;
g_pRunningTask->pStackPointer = (UINT32 *)sp; //保存当前esp
g_pRunningTask = g_pHighestTask;
sp = g_pHighestTask->pStackPointer; //得到重新执行的任务的堆栈指针
//恢复所有处理器的寄存器
Context.Edi = *sp++;
Context.Esi = *sp++;
Context.Ebp = *sp++;
Context.Esp = *sp++; //此时上下文中得到的esp是不正确的
Context.Ebx = *sp++;
Context.Edx = *sp++;
Context.Ecx = *sp++;
Context.Eax = *sp++;
Context.EFlags = *sp++;
Context.Eip = *sp++;
Context.Esp = (unsigned long)sp; //得到正确的esp
uniIntRestore(uwIntSave);
SetThreadContext(mainhandle, &Context); //保存主线程上下文
}
[解决办法]
不是可以直接嵌入汇编吗?
需要这么麻烦么
还有什么是正确的esp呢?
[解决办法]
你可以用debug的方式...
[解决办法]