[Prev][Next][Index][Thread]
Re[2]: thread switch
Hello David,
Friday, May 11, 2001, 7:07:08 PM, you wrote:
DW> On Fri, May 11, 2001 at 12:05:00PM +0800, cool wrote:
>> Hello oskit-users,
>>
>> I am testing my switching code,and I use the following code
>> void switchto(struct type_thread *from,struct type_thread *to)
>> {
>> printf("Now in the switchto function\n");
>> getchar();
>> asm volatile("movl %%eax,%0\n\t" \
>> "movl %%ebx,%1\n\t" \
>> "movl %%ecx,%2\n\t" \
>> "movl %%edx,%3\n\t" \
>> "movl %4,%%eax\n\t" \
>> "movl %5,%%ebx\n\t" \
>> "movl %6,%%ecx\n\t" \
>> "movl %7,%%edx\n\t" \
>> :"=m"(from->context.eax),"=m"(from->context.ebx), \
>> "=m"(from->context.ebp),"=m"(from->context.edx): \
>> "m"(to->context.eax),"m"(to->context.ebx), \
>> "m"(to->context.ecx),"m"(to->context.edx) );
>> printf("ok for first setction of asm code\n");
>> getchar();
>> asm volatile("movl %%esi,%0\n\t" \
>> "movl %%edi,%1\n\t" \
>> "movl %%ebp,%2\n\t" \
>> "movl %%esp,%3\n\t" \
>> "movl %4,%%esi\n\t" \
>> "movl %5,%%edi\n\t" \
>> "movl %6,%%ebp\n\t" \
>> "movl %7,%%esp\n\t" \
>> :"=m"(from->context.esi),"=m"(from->context.edi), \
>> "=m"(from->context.ebp),"=m"(from->context.esp): \
>> "m"(to->context.esi),"m"(to->context.edi), \
>> "m"(to->context.ebp),"m"(to->context.esp) );
>> but when I use it,the monitor screen crashes.
>> I don't know why?
>> Could anyone point out my fault?
>>
DW> The from and to pointers are stored on the stack relative to the frame
DW> pointer so after the assignment to ebp, the 'to' pointer will have a
DW> different value and the correct value wouldn't be assigned to esp.
You are right, I tried to add the clobbered register after the asm
code,everything is ok now.
Thanks for your help!
But I am still a litter confused about the storage allocation.
If I declare those registers to be clobbered registers,How would the
compiler represent the variable from and to instead of using bp and sp?
Thanks!
--
Best regards,
cool mailto:hust
References: