1.globl setjmp 2setjmp: 3 movl 4(%esp), %eax 4 5 movl %ebx, 0(%eax) 6 movl %ecx, 4(%eax) 7 movl %edx, 8(%eax) 8 movl %esi, 12(%eax) 9 movl %edi, 16(%eax) 10 movl %esp, 20(%eax) 11 movl %ebp, 24(%eax) 12 pushl 0(%esp) /* %eip */ 13 popl 28(%eax) 14 15 movl $0, %eax /* return value */ 16 ret 17 18.globl longjmp 19longjmp: 20 movl 4(%esp), %eax 21 22 movl 0(%eax), %ebx 23 movl 4(%eax), %ecx 24 movl 8(%eax), %edx 25 movl 12(%eax), %esi 26 movl 16(%eax), %edi 27 movl 20(%eax), %esp 28 movl 24(%eax), %ebp 29 30 addl $4, %esp /* pop %eip into thin air */ 31 pushl 28(%eax) /* push new %eip */ 32 33 movl $1, %eax /* return value (appears to come from setjmp!) */ 34 ret 35 36 37 38