当前位置: 代码迷 >> 汇编语言 >> 谁解释一上上面这个函数,里面有汇编指令
  详细解决方案

谁解释一上上面这个函数,里面有汇编指令

热度:4455   发布时间:2013-02-26 00:00:00.0
哪位高手解释一下下面这个函数,里面有汇编指令
代码来自国人写的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是不能直接取寄存器
------其他解决方案--------------------------------------------------------
引用:
//为什么要有两块_asm的代码呢?不理解。这里

需要保存寄存器的值,而C是不能直接取寄存器


他的字面含义我也知道,但这里没有象中断来了进入中断执行函数一样,而只是切换了一下任务指针,所以我闹不明白。
  相关解决方案