Initial git release
[ZeXOS.git] / lib / setjmp / .svn / text-base / setjmp.asm.svn-base
blob47c9e66d0d8ae8eebc624369d9ac7754a4fc23f2
1 %macro  IMP 1\r
2 %ifdef UNDERBARS\r
3         EXTERN _%1\r
4         %define %1 _%1\r
5 %else\r
6         EXTERN %1\r
7 %endif\r
8 %endmacro\r
9 \r
10 %macro  EXP     1\r
11         GLOBAL $_%1\r
12         $_%1:\r
13         GLOBAL $%1\r
14         $%1:\r
15 %endmacro\r
17 SECTION .text\r
19 EXP setjmp\r
20         push ebx\r
21                 mov ebx,[8 + esp]\r
23                 mov [0 + ebx],edi       ; buf->edi == 0(ebx) == EDI\r
24                 mov [4 + ebx],esi       ; buf->esi == 4(ebx) == ESI\r
25                 mov [8 + ebx],ebp       ; buf->ebp == 8(ebx) == EBP\r
27                 mov [20 + ebx],edx      ; buf->edx == 20(ebx) == EDX\r
28                 mov [24 + ebx],ecx      ; buf->ecx == 24(ebx) == ECX\r
29                 mov [28 + ebx],eax      ; buf->eax == 28(ebx) == EAX\r
31 ; use EBX value saved on stack; not the current value\r
32                 mov eax,[esp]\r
33                 mov [16 + ebx],eax      ; buf->ebx == 16(ebx) == EBX\r
35 ; use ESP value after RET; not the current value\r
36                 lea eax,[8 + esp]\r
37                 mov [12 + ebx],eax      ; buf->esp == 32(ebx) == ESP\r
39 ; use return address of this routine (EIP value saved on stack);\r
40 ; not the current value\r
41                 mov eax,[4 + esp]\r
42                 mov [32 + ebx],eax      ; buf->eip == 36(ebx) == EIP\r
44 ; none of the PUSH or MOV instructions changed EFLAGS!\r
45                 pushf\r
46                 pop dword [36 + ebx]    ; buf->eflags == 40(ebx) == EFLAGS\r
47         pop ebx\r
48         xor eax,eax\r
49         ret\r