setjmp32.S 512 B

12345678910111213141516171819202122232425
  1. .globl setjmp
  2. setjmp:
  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. .globl longjmp
  14. longjmp:
  15. mov 8(%esp), %eax // get return value
  16. mov 4(%esp), %ecx // get jmp_buf
  17. mov 20(%ecx), %edi
  18. mov 16(%ecx), %esi
  19. mov 12(%ecx), %ebx
  20. mov 8(%ecx), %ebp
  21. mov 4(%ecx), %esp
  22. mov (%ecx), %ecx // get saved EIP
  23. mov %ecx, (%esp) // and store it on the stack
  24. ret