代码来自国人写的Raw-OS操作系统。
最好详细些,谢谢!
unsigned int store_eax;
void port_task_switch(void)
{
_asm{
mov [store_eax], eax
lea eax, nextstart
push eax
mov eax, [store_eax]
pushfd
pushad
add esp, -200
fsave [esp]
mov ebx, [raw_task_active]
mov [ebx], esp
}
raw_task_active = high_ready_obj;
= raw_task_active->restore_flag;
_asm{
mov ebx, [raw_task_active]
mov esp, [ebx]
frstor [esp]
add esp, 200
popad
popfd
ret
}
nextstart:
return;
}
------最佳解决方案--------------------------------------------------------
个人理解是,他准备吧这段代码直接放到os,不再修改,这的code尽量靠实际情况。
目的性而已,不是非得这样,没有啥好纠结的 :)
------其他解决方案--------------------------------------------------------
加了一点自己的笔记,还是弄不懂这个函数
//为什么要有两块_asm的代码呢?不理解。这里
//只是切换了一下任务指针,没有运行任务本身。
void port_task_switch(void)
{
_asm{
mov [store_eax], eax
lea eax, nextstart
push eax
mov eax, [store_eax]
pushfd
pushad
add esp, -200//这次抬栈指针是为了下面的存FPU
fsave [esp]//将当前的 FPU 状态(操作环境与寄存器堆栈)存储到内存中指定的目标,然后重新初始化 FPU。
// typedef struct RAW_TASK_OBJ
//{
//RAW_VOID *task_stack;
//...
//};
mov ebx, [raw_task_active] //
mov [ebx], esp //将入栈的FPU信息的指针存储到raw_task_active->task_stack
}
raw_task_active = high_ready_obj; //获得新任务指针
FlagEn = raw_task_active->restore_flag;//似乎是进入临界区的计数
_asm{
mov ebx, [raw_task_active]//载入新任务
mov esp, [ebx] //新任务task_stack首地址赋给esp
frstor [esp]//Loads the FPU state (operating environment and register stack) from the memory area specified with the source operand.
add esp, 200//与上面的_asm对称
popad
popfd
ret
}
nextstart:
return;
}
------其他解决方案--------------------------------------------------------
//为什么要有两块_asm的代码呢?不理解。这里
需要保存寄存器的值,而C是不能直接取寄存器
------其他解决方案--------------------------------------------------------
他的字面含义我也知道,但这里没有象中断来了进入中断执行函数一样,而只是切换了一下任务指针,所以我闹不明白。