wrapper.S
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:2k
源码类别:

midi

开发平台:

Unix_Linux

  1. .section .data
  2. .globl caller_return
  3. caller_return:
  4. .long 0
  5. .globl report_entry
  6. report_entry:
  7. .long null_call
  8. .globl report_ret
  9. report_ret:
  10. .long null_call
  11. .global wrapper_target
  12. wrapper_target:
  13. .long null_call
  14. .section .text
  15. .globl null_call
  16. .type null_call, @function
  17. .balign 16,0x90
  18. null_call:
  19. ret
  20. .globl wrapper
  21. .type wrapper, @function
  22. .balign 16,0x90
  23. wrapper:
  24. pusha # store registers (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) 
  25. pushf # store flags
  26. push %ebp # set up a stack frame 
  27. movl %esp, %ebp
  28. leal 4(%ebp), %eax # push flags addr
  29. push %eax
  30. leal 8(%ebp), %eax # push registers addr
  31. push %eax
  32. leal 40(%ebp), %edx
  33. movl (%ebp), %eax
  34. subl %edx, %eax
  35. push %eax
  36. push %edx
  37. call *report_entry # report entry
  38. test %eax, %eax
  39. jnz .Ldone
  40. leave # restore %esp, %ebp
  41. popf # restore flags
  42. popa # restore registers
  43. popl caller_return # switch return addresses
  44. pushl $.Lwrapper_return 
  45. jmp *wrapper_target # wrapper_target should return at .Lwrapper_return
  46. .balign 16, 0x90
  47. .Lwrapper_return:
  48. pushl caller_return # restore the original return address
  49. pusha # more for reference sake here
  50. pushf
  51. push %ebp # set up a stack frame
  52. movl %esp, %ebp
  53. leal 4(%ebp), %eax # push flags addr
  54. push %eax
  55. leal 8(%ebp), %eax # push registers addr
  56. push %eax
  57. leal 40(%ebp), %edx # push stack top address (relative to our entry)
  58. movl (%ebp), %eax
  59. subl %edx, %eax # calculate difference between entry and previous frame
  60. push %eax
  61. push %edx
  62. call *report_ret # report the return information (same args)
  63. .Ldone:
  64. leave
  65. popf
  66. popa
  67. ret