.code32 .global yield .extern schedule_next_task yield: # void yield() cli pushfl pushl %cs movl 8(%esp), %eax pushl %eax movl 4(%esp), %ebx # Get CS movl %ebx, 8(%esp) # Move CS over Old EIP movl 0(%esp), %ebx # Get Return EIP movl %ebx, 4(%esp) # Move Return EIP over CS addl $4, %esp # Adjust stack pointer up. # the stack now looks like a hardware interrupt just happened, even though we never called one. pushal pushl %esp call switch_context movl %eax, %esp popal sti iret