| .globl setjmp | |
| setjmp: | |
| mov (%esp), %ecx // get return EIP | |
| mov 4(%esp), %eax // get jmp_buf | |
| mov %ecx, (%eax) | |
| mov %esp, 4(%eax) | |
| mov %ebp, 8(%eax) | |
| mov %ebx, 12(%eax) | |
| mov %esi, 16(%eax) | |
| mov %edi, 20(%eax) | |
| xor %eax, %eax | |
| ret | |
| .globl longjmp | |
| longjmp: | |
| mov 8(%esp), %eax // get return value | |
| mov 4(%esp), %ecx // get jmp_buf | |
| mov 20(%ecx), %edi | |
| mov 16(%ecx), %esi | |
| mov 12(%ecx), %ebx | |
| mov 8(%ecx), %ebp | |
| mov 4(%ecx), %esp | |
| mov (%ecx), %ecx // get saved EIP | |
| mov %ecx, (%esp) // and store it on the stack | |
| ret |