mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
80 lines
1.8 KiB
NASM
80 lines
1.8 KiB
NASM
;
|
|
;
|
|
; Nim's Runtime Library
|
|
; (c) Copyright 2015 Rokas Kupstys
|
|
;
|
|
; See the file "copying.txt", included in this
|
|
; distribution, for details about the copyright.
|
|
;
|
|
|
|
section ".text" executable
|
|
public narch_getRegisters
|
|
public @narch_getRegisters@4
|
|
public narch_setjmp
|
|
public @narch_setjmp@4
|
|
public narch_longjmp
|
|
public @narch_longjmp@8
|
|
public narch_coroSwitchStack
|
|
public @narch_coroSwitchStack@4
|
|
public narch_coroRestoreStack
|
|
public @narch_coroRestoreStack@0
|
|
|
|
@narch_getRegisters@4:
|
|
narch_getRegisters:
|
|
mov [ecx], eax
|
|
mov [ecx+4], ebx
|
|
mov [ecx+8], ecx
|
|
mov [ecx+0Ch], ebp
|
|
mov [ecx+10h], esp
|
|
mov [ecx+14h], edi
|
|
mov [ecx+18h], esi
|
|
ret
|
|
|
|
|
|
@narch_setjmp@4:
|
|
narch_setjmp:
|
|
; Based on code from musl libc Copyright © 2005-2014 Rich Felker, et al.
|
|
mov [ecx], ebx
|
|
mov [ecx+4], esi
|
|
mov [ecx+8], edi
|
|
mov [ecx+0Ch], ebp
|
|
lea eax, [esp+4]
|
|
mov [ecx+10h], eax
|
|
mov eax, [esp]
|
|
mov [ecx+14h], eax
|
|
xor eax, eax
|
|
ret
|
|
|
|
|
|
@narch_longjmp@8:
|
|
narch_longjmp:
|
|
; Based on code from musl libc Copyright © 2005-2014 Rich Felker, et al.
|
|
mov eax, edx
|
|
test eax, eax
|
|
jnz @F
|
|
inc eax
|
|
@@:
|
|
mov ebx, [ecx]
|
|
mov esi, [ecx+4]
|
|
mov edi, [ecx+8]
|
|
mov ebp, [ecx+0Ch]
|
|
mov esp, [ecx+10h]
|
|
mov edx, [ecx+14h]
|
|
jmp edx
|
|
|
|
|
|
@narch_coroSwitchStack@4:
|
|
narch_coroSwitchStack:
|
|
pop eax ; return address
|
|
mov edx, esp ; old esp for saving
|
|
mov esp, ecx ; swap stack with one passed to func
|
|
push edx ; store old stack pointer on newly switched stack
|
|
jmp eax ; return
|
|
|
|
|
|
@narch_coroRestoreStack@0:
|
|
narch_coroRestoreStack:
|
|
pop eax ; return address
|
|
pop esp ; resture old stack pointer
|
|
jmp eax ; return
|