aboutsummaryrefslogtreecommitdiffstats
path: root/coroutine/win64/Context.asm
diff options
context:
space:
mode:
Diffstat (limited to 'coroutine/win64/Context.asm')
-rw-r--r--coroutine/win64/Context.asm44
1 files changed, 44 insertions, 0 deletions
diff --git a/coroutine/win64/Context.asm b/coroutine/win64/Context.asm
new file mode 100644
index 0000000000..f57d3fd387
--- /dev/null
+++ b/coroutine/win64/Context.asm
@@ -0,0 +1,44 @@
+;;
+;; win64.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.
+;;
+
+.code
+
+coroutine_transfer proc
+ push rbp
+ push rbx
+ push rdi
+ push rsi
+ push r12
+ push r13
+ push r14
+ push r15
+
+ ; Save caller stack pointer
+ mov [rcx], rsp
+
+ ; Restore callee stack pointer
+ mov rsp, [rdx]
+
+ ; Restore callee stack
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop rsi
+ pop rdi
+ pop rbx
+ pop rbp
+
+ ; Put the first argument into the return value
+ mov rax, rcx
+
+ ; We pop the return address and jump to it
+ ret
+coroutine_transfer endp
+
+end