36 lines
943 B
NASM
36 lines
943 B
NASM
|
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
|