diff options
Diffstat (limited to 'lib/arch/i386.asm')
-rw-r--r-- | lib/arch/i386.asm | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/lib/arch/i386.asm b/lib/arch/i386.asm new file mode 100644 index 000000000..61f6fdda7 --- /dev/null +++ b/lib/arch/i386.asm @@ -0,0 +1,79 @@ +; +; +; 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 |