summaryrefslogtreecommitdiff
path: root/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'setjmp.S')
-rw-r--r--setjmp.S37
1 files changed, 37 insertions, 0 deletions
diff --git a/setjmp.S b/setjmp.S
new file mode 100644
index 0000000..7b42dc7
--- /dev/null
+++ b/setjmp.S
@@ -0,0 +1,37 @@
+.globl setjmp
+setjmp:
+ movl 4(%esp), %eax
+
+ movl %ebx, 0(%eax)
+ movl %ecx, 4(%eax)
+ movl %edx, 8(%eax)
+ movl %esi, 12(%eax)
+ movl %edi, 16(%eax)
+ movl %esp, 20(%eax)
+ movl %ebp, 24(%eax)
+ pushl 0(%esp) /* %eip */
+ popl 28(%eax)
+
+ movl $0, %eax /* return value */
+ ret
+
+.globl longjmp
+longjmp:
+ movl 4(%esp), %eax
+
+ movl 0(%eax), %ebx
+ movl 4(%eax), %ecx
+ movl 8(%eax), %edx
+ movl 12(%eax), %esi
+ movl 16(%eax), %edi
+ movl 20(%eax), %esp
+ movl 24(%eax), %ebp
+
+ addl $4, %esp /* pop %eip into thin air */
+ pushl 28(%eax) /* push new %eip */
+
+ movl $1, %eax /* return value (appears to come from setjmp!) */
+ ret
+
+
+