来自站点的多任务示例

时间:2012-08-30 08:35:20

标签: assembly x86

这是我一直在关注的材料 http://hosted.cjmovie.net/TutMultitask.htm

感谢任何人可以帮我解决以下汇编编码

pusha          ;Push all standard registers
push ds        ;Push segment d
push es        ;Push segmetn e
push fs        ; ''
push gs        ; ''

寄存器和段保存在进程的内核级堆栈中,这是正确的吗?

mov eax, 0x10  ;Get kernel data segment
mov ds, eax    ;Put it in the data segment registers
mov es, eax
mov fs, eax
mov gs, eax

loadinhg内核数据段描述符的目的是什么?

push esp       ;Push pointer to all the stuff we just pushed
call _TaskSwitch ;Call C code

为什么在调用_TaskSwitch之前保存了esp?

感谢

1 个答案:

答案 0 :(得分:0)

代码在评论中清楚地说明了:“将指针推到我们刚刚推送的所有内容”+“调用C代码”,另请参阅TaskSwitch()

//Switch between our two tasks
//Notice how we get the old esp from the ASM code
//It's not a pointer, but we actually get the ESP value
//That way we can save it in our task structure
unsigned int TaskSwitch(unsigned int OldEsp)

因此,TaskSwitch()接收(作为参数)指向堆栈上ISR保存的上下文的地址或指针。 TaskSwitch()还返回堆栈上保存的某些上下文的指针/地址。如果它返回的值与收到的值相同,则不会发生切换,这是一个简单的调用+ return。如果它返回另一个,则会发生切换,因为返回是使用不同的上下文和不同的地址完成的。

阅读您所指的文件及其中描述的代码。这一切写得很清楚。