www.pudn.com > LFYOS.zip > save.s
.global save_parameter save_parameter: /*save thread parameter when enter os kernel*/ pushl %edi /*push edi,eax,ds into stack */ pushl %eax movl %ds,%eax pushl %eax movl %ss,%eax /*set segment register */ movl %eax,%ds movl current,%edi /*compute where to save */ cmpl $(0x00),%edi jne 1f movl %eax,%es movl %eax,%fs movl %eax,%gs popl %eax popl %eax popl %eax ret 1: popl 0x34(%edi) /* save ds from stack*/ movl %es,%eax /* save es */ movl %eax,0x38(%edi) movl %fs,%eax /* save fs */ movl %eax,0x3c(%edi) movl %gs,%eax /* save gs */ movl %eax,0x40(%edi) popl 0x00(%edi) /*save eax from stack*/ movl %ebx,0x04(%edi) /*save ebx */ movl %ecx,0x08(%edi) /*save ecx */ movl %edx,0x0c(%edi) /*save edx */ movl %esi,0x10(%edi) /*save esi */ popl 0x14(%edi) /*save edi from stack*/ movl %ebp,0x18(%edi) /*save ebp */ popl %eax /*pop return address to eax*/ popl 0x20(%edi) /*save eip */ popl 0x24(%edi) /*save cs */ popl 0x28(%edi) /*save eflag*/ popl 0x2c(%edi) /*save esp */ popl 0x30(%edi) /*save ess */ movl %esp,0x44(%edi) /*save sp_0 */ movl $(0x00),0x48(%edi) pushl %eax /*pushl return address(in eax) */ movl %ds,%eax movl %eax,%es movl %eax,%fs movl %eax,%gs ret /*return to caller */