1

这是我一直在看的材料 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

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

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

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

谢谢

4

1 回答 1

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()还返回保存在堆栈上的某个上下文的指针/地址。如果它返回与接收到的相同的值,则不会发生切换,这是一个简单的调用+返回。如果它返回一个不同的,就会发生切换,因为返回是使用不同的上下文和不同的地址完成的。

阅读您所指的文档以及其中描述的代码。那里都写得很清楚。

于 2012-09-01T05:31:22.063 回答