global setjmp ; int setjmp(jmp_buf env); setjmp: mov ecx, [esp + 4] ; ecx = env mov edx, [esp + 0] ; edx = ret addr mov [ecx + 0], edx mov [ecx + 4], ebx mov [ecx + 8], esp mov [ecx + 12], ebp mov [ecx + 16], esi mov [ecx + 20], edi mov [ecx + 24], eax ; eax = trigblock()'s ret val xor eax, eax ; setjmp ret val = 0 ret global longjmp ; void longjmp(jmp_buf env, int val) longjmp: mov edx, [esp + 4] ; edx = env mov eax, [esp + 8] ; eax = val mov ecx, [edx + 0] ; ecx = setjmp()'s ret val mov ebx, [edx + 4] mov esp, [edx + 8] mov ebp, [edx + 12] mov esi, [edx + 16] mov edi, [edx + 20] ; make sure longjmp's ret val not 0 test eax, eax ; if eax == 0: jnz .1 ; eax += 1 inc eax ; else: goto lable 1 .1: ; let longjmp's ret addr as setjmp's ret addr mov [esp + 0], ecx ; ret addr = ecx = setjmp's next code ret