/ / our buffer looks like: / eax,ebx,ecx,edx,esi,edi,esp,ebp,pc / / _longjmp is called with two parameters: jmp_buf*,int / jmp_buf* is at 4(%esp), int is at 8(%esp) / retaddr is, of course, at (%esp) .globl _longjmp .globl longjmp _longjmp: longjmp: movl 4(%esp), %ebx / address of buf movl 8(%esp), %eax / store return value movl 24(%ebx), %esp / restore stack movl 32(%ebx), %edi / Next line sets up return address. movl %edi, 0(%esp) movl 8(%ebx), %ecx movl 12(%ebx), %edx movl 16(%ebx), %esi movl 20(%ebx), %edi movl 28(%ebx), %ebp movl 4(%ebx), %ebx testl %eax,%eax jne bye incl %eax / eax hold 0 if we are here bye: ret