summaryrefslogtreecommitdiff
path: root/LibC/setjmp.asm
blob: 68d08ef7d92789da819e364653aa90d392ef21c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
; asmsyntax=nasm

global setjmp
setjmp:
    mov eax, [esp + 4]
    mov [eax + 0 * 4], ebx
    mov [eax + 1 * 4], esi
    mov [eax + 2 * 4], edi
    mov [eax + 3 * 4], ebp
    lea ecx, [esp + 4]
    mov [eax + 4 * 4], ecx
    mov ecx, [esp]
    mov [eax + 5 * 4], ecx
    xor eax, eax
    ret

global longjmp
longjmp:
    mov edx, [esp + 4]
    mov eax, [esp + 8]
    mov ebx, [edx + 0 * 4]
    mov esi, [edx + 1 * 4]
    mov edi, [edx + 2 * 4]
    mov ebp, [edx + 3 * 4]
    mov ecx, [edx + 4 * 4]
    mov esp, ecx
    mov ecx, [edx + 5 * 4]
    test eax, eax
    jnz  .nonzero
    mov eax, 1
.nonzero:
    jmp ecx