这是我一直在关注的材料 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?
感谢
答案 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。如果它返回另一个,则会发生切换,因为返回是使用不同的上下文和不同的地址完成的。
阅读您所指的文件及其中描述的代码。这一切写得很清楚。