diff options
Diffstat (limited to 'setjmp.S')
-rw-r--r-- | setjmp.S | 27 |
1 files changed, 22 insertions, 5 deletions
@@ -1,3 +1,20 @@ +# int setjmp(struct jmpbuf *jmp); +# void longjmp(struct jmpbuf *jmp); +# +# Setjmp saves its stack environment in jmp +# for later use by longjmp. It returns 0. +# +# Longjmp restores the environment saved by +# the last call of setjmp. It then causes +# execution to continue as if the call of setjmp +# had just returned 1. +# +# The caller of setjmp must not itself have +# returned in the interim. All accessible data +# have values as of the time longjmp was called. +# +# [Description, but not code, borrowed from Plan 9.] + .globl setjmp setjmp: movl 4(%esp), %eax @@ -9,10 +26,10 @@ setjmp: movl %edi, 16(%eax) movl %esp, 20(%eax) movl %ebp, 24(%eax) - pushl 0(%esp) /* %eip */ + pushl 0(%esp) # %eip popl 28(%eax) - movl $0, %eax /* return value */ + movl $0, %eax # return value ret .globl longjmp @@ -27,8 +44,8 @@ longjmp: movl 20(%eax), %esp movl 24(%eax), %ebp - addl $4, %esp /* pop %eip into thin air */ - pushl 28(%eax) /* push new %eip */ + addl $4, %esp # pop and discard %eip + pushl 28(%eax) # push new %eip - movl $1, %eax /* return value (appears to come from setjmp!) */ + movl $1, %eax # return value (appears to come from setjmp!) ret |