3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * PURPOSE: Implementation of _setjmp/longjmp
6 * FILE: lib/msvcrt/i386/setjmp.s
7 * PROGRAMMER: Ge van Geldorp (ge@gse.nl)
8 * NOTES: Implementation is not complete, see Wine source for a more
9 * complete implementation
28 * _setjmp(jmp_buf env);
31 * [ESP+04h] - jmp_buf env
45 mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
46 mov [edx + JB_BX*4], ebx
47 mov [edx + JB_DI*4], edi
48 mov [edx + JB_SI*4], esi
49 lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
50 mov [edx + JB_SP*4], ecx
51 mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
52 mov [edx + JB_IP*4], ecx
57 * _setjmp3(jmp_buf env, int nb_args, ...);
60 * [ESP+04h] - jmp_buf env
74 mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
75 mov [edx + JB_BX*4], ebx
76 mov [edx + JB_DI*4], edi
77 mov [edx + JB_SI*4], esi
78 lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
79 mov [edx + JB_SP*4], ecx
80 mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
81 mov [edx + JB_IP*4], ecx
86 * longjmp(jmp_buf env, int value);
89 * [ESP+04h] - jmp_buf setup by _setjmp
90 * [ESP+08h] - int value to return
100 mov ecx, JMPBUF[esp] /* User's jmp_buf in %ecx. */
102 mov eax, [esp + 8] /* Second argument is return value. */
103 /* Save the return address now. */
104 mov edx, [ecx + JB_IP*4]
105 /* Restore registers. */
106 mov ebp, [ecx + JB_BP*4]
107 mov ebx, [ecx + JB_BX*4]
108 mov edi, [ecx + JB_DI*4]
109 mov esi, [ecx + JB_SI*4]
110 mov esp, [ecx + JB_SP*4]
111 /* Jump to saved PC. */