CoolPotOS/apps/libs/asmfunc.asm

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