.text .align 2 .globl ThreadRoot ThreadRoot: pushl %ebp movl %esp,%ebp pushl %edx call *%ecx call *%esi call *%edi movl %ebp,%esp popl %ebp ret .comm _eax_save,4 .globl SWITCH SWITCH: movl %eax,_eax_save # save the value of eax movl 4(%esp),%eax # move pointer to t1 into eax movl %ebx,8(%eax) # save registers movl %ecx,12(%eax) movl %edx,16(%eax) movl %esi,24(%eax) movl %edi,28(%eax) movl %ebp,20(%eax) movl %esp,0(%eax) # save stack pointer movl _eax_save,%ebx # get the saved value of eax movl %ebx,4(%eax) # store it movl 0(%esp),%ebx # get return address from stack into ebx movl %ebx,32(%eax) # save it into the pc storage movl 8(%esp),%eax # move pointer to t2 into eax movl 4(%eax),%ebx # get new value for eax into ebx movl %ebx,_eax_save # save it movl 8(%eax),%ebx # retore old registers movl 12(%eax),%ecx movl 16(%eax),%edx movl 24(%eax),%esi movl 28(%eax),%edi movl 20(%eax),%ebp movl 0(%eax),%esp # restore stack pointer movl 32(%eax),%eax # restore return address into eax movl %eax,4(%esp) # copy over the ret address on the stack movl _eax_save,%eax ret