aboutsummaryrefslogtreecommitdiffstats
path: root/coroutine/win32/Context.asm
diff options
context:
space:
mode:
Diffstat (limited to 'coroutine/win32/Context.asm')
-rw-r--r--coroutine/win32/Context.asm43
1 files changed, 43 insertions, 0 deletions
diff --git a/coroutine/win32/Context.asm b/coroutine/win32/Context.asm
new file mode 100644
index 0000000000..aa27099cfe
--- /dev/null
+++ b/coroutine/win32/Context.asm
@@ -0,0 +1,43 @@
+;;
+;; win32.asm
+;; File file is part of the "Coroutine" project and released under the MIT License.
+;;
+;; Created by Samuel Williams on 10/5/2018.
+;; Copyright, 2018, by Samuel Williams. All rights reserved.
+;;
+
+.model flat
+
+.code
+
+; Using fastcall is a big win (and it's the same has how x64 works).
+; In coroutine transfer, the arguments are passed in ecx and edx. We don't need
+; to touch these in order to pass them to the destination coroutine.
+
+@coroutine_transfer@8 proc
+ ; Save caller registers
+ push ebp
+ push ebx
+ push edi
+ push esi
+
+ ; Save caller stack pointer
+ mov dword ptr [ecx], esp
+
+ ; Restore callee stack pointer
+ mov esp, dword ptr [edx]
+
+ ; Restore callee stack
+ pop esi
+ pop edi
+ pop ebx
+ pop ebp
+
+ ; Save the first argument as the return value
+ mov eax, dword ptr ecx
+
+ ; Jump to the address on the stack
+ ret
+@coroutine_transfer@8 endp
+
+end