1.globl setjmp 2setjmp: 3 mov (%esp), %ecx // get return EIP 4 mov 4(%esp), %eax // get jmp_buf 5 mov %ecx, (%eax) 6 mov %esp, 4(%eax) 7 mov %ebp, 8(%eax) 8 mov %ebx, 12(%eax) 9 mov %esi, 16(%eax) 10 mov %edi, 20(%eax) 11 xor %eax, %eax 12 ret 13 14.globl longjmp 15longjmp: 16 mov 8(%esp), %eax // get return value 17 mov 4(%esp), %ecx // get jmp_buf 18 mov 20(%ecx), %edi 19 mov 16(%ecx), %esi 20 mov 12(%ecx), %ebx 21 mov 8(%ecx), %ebp 22 mov 4(%ecx), %esp 23 mov (%ecx), %ecx // get saved EIP 24 mov %ecx, (%esp) // and store it on the stack 25 ret 26