Mercurial > mplayer.hg
comparison loader/wrapper.S @ 8269:8b905703a450
- qtx (quicktime's macos emulation layer) debugging/emulation environment :)
- some fixes in loadlibrary, to allow multiple loads/lookups
author | arpi |
---|---|
date | Sun, 24 Nov 2002 21:45:23 +0000 |
parents | |
children | c3eb28f300d0 |
comparison
equal
deleted
inserted
replaced
8268:a85040e4b1a0 | 8269:8b905703a450 |
---|---|
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 | |
15 .section .text | |
16 .globl null_call | |
17 .type null_call, @function | |
18 .align 16,0x90 | |
19 null_call: | |
20 ret | |
21 .globl wrapper | |
22 .type wrapper, @function | |
23 .align 16,0x90 | |
24 wrapper: | |
25 pusha # store registers (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) | |
26 pushf # store flags | |
27 | |
28 push %ebp # set up a stack frame | |
29 movl %esp, %ebp | |
30 | |
31 leal 4(%ebp), %eax # push flags addr | |
32 push %eax | |
33 leal 8(%ebp), %eax # push registers addr | |
34 push %eax | |
35 | |
36 leal 40(%ebp), %edx | |
37 movl (%ebp), %eax | |
38 subl %edx, %eax | |
39 push %eax | |
40 push %edx | |
41 | |
42 call *report_entry # report entry | |
43 | |
44 test %eax, %eax | |
45 jnz .Ldone | |
46 | |
47 leave # restore %esp, %ebp | |
48 popf # restore flags | |
49 popa # restore registers | |
50 | |
51 popl caller_return # switch return addresses | |
52 pushl $.Lwrapper_return | |
53 | |
54 jmp *wrapper_target # wrapper_target should return at .Lwrapper_return | |
55 | |
56 .align 16, 0x90 | |
57 .Lwrapper_return: | |
58 pushl caller_return # restore the original return address | |
59 pusha # more for reference sake here | |
60 pushf | |
61 | |
62 push %ebp # set up a stack frame | |
63 movl %esp, %ebp | |
64 | |
65 leal 4(%ebp), %eax # push flags addr | |
66 push %eax | |
67 leal 8(%ebp), %eax # push registers addr | |
68 push %eax | |
69 | |
70 leal 40(%ebp), %edx # push stack top address (relative to our entry) | |
71 movl (%ebp), %eax | |
72 subl %edx, %eax # calculate difference between entry and previous frame | |
73 push %eax | |
74 push %edx | |
75 | |
76 call *report_ret # report the return information (same args) | |
77 .Ldone: | |
78 | |
79 leave | |
80 popf | |
81 popa | |
82 ret | |
83 |