annotate dyncall/dyncall_call_x86_nasm.asm @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children 7520e2260097
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 ;//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 ; Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 ; Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 ; Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 ; purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 ; copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ;//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ;///////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 ; dyncall_call_x86_nasm.nasm
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 ; X86 Calls for nasm assembler
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 ;///////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 BITS 32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 section .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 ;///////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 ; CSYM macro
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 ;///////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 %ifdef BUILD_OS_windows
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 %macro EXPORT_C 1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 global _%1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 _%1:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 %endmacro
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 %else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 %macro EXPORT_C 1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 global %1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 %1:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 %endmacro
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 %endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 ; Calling Convention x86 standard C
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 ; - all arguments are on the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 ; - caller cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 ; C proto
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 ; dcCallC(DCptr funptr, DCptr args, DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 EXPORT_C dcCall_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 push ebp ; prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 ; arguments:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 ; funptr ebp+8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 ; args ebp+12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 ; size ebp+16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 ; result ebp+20
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 push esi ; save esi, edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 mov esi, [ebp+12] ; esi = pointer on args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 mov ecx, [ebp+16] ; ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 sub esp, ecx ; cdecl call: allocate 'size' bytes on stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 mov edi, esp ; edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 rep movsb ; copy arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 call [ebp+8] ; call function
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 add esp, [ebp+16] ; cdecl call: cleanup stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 pop edi ; restore edi, esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 mov esp, ebp ; epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 ; Calling Convention x86 microsoft thiscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 ; - thispointer is in ECX, rest is on the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 ; - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 ; C proto
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 ; dcCallThisMS(DCptr funptr, DCptr args, DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 EXPORT_C dcCall_x86_win32_msthis
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 push ebp ; prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 ; arguments:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 ; funptr ebp+8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 ; args ebp+12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 ; size ebp+16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 push esi ; save esi, edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 mov esi, [ebp+12] ; esi = pointer on args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 mov ecx, [ebp+16] ; ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 mov eax, [esi] ; eax = this pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 add esi, 4 ; increment args pointer by thisptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 sub ecx, 4 ; decrement size by sizeof(thisptr)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 sub esp, ecx ; allocate argument-block on stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 mov edi, esp ; edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 rep movsb ; copy arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 mov ecx, eax ; ecx = this pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 call [ebp+8] ; call function (thiscall: cleanup by callee)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 pop edi ; restore edi, esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 mov esp, ebp ; epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 ; Calling Convention x86 win32 stdcall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 ; - all arguments are passed by stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 ; - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 ; C proto
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 ; dcCallStd(DCptr funptr, DCptr args, DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 EXPORT_C dcCall_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 push ebp ; prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 ; arguments:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 ; funptr ebp+8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 ; args ebp+12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 ; size ebp+16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 push esi ; save esi, edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 mov esi, [ebp+12] ; esi = pointer on args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 mov ecx, [ebp+16] ; ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 sub esp, ecx ; stdcall: allocate 'size'-8 bytes on stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 mov edi, esp ; edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 rep movsb ; copy arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 call [ebp+8] ; call function (stdcall: cleanup by callee)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 pop edi ; restore edi, esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 mov esp, ebp ; epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 ; Calling Convention x86 win32 fastcall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 ; - first two integer (up to 32bits) are passed in ECX and EDX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 ; - others are passed on the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 ; - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 ; C proto
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 ; dcCallFast(DCptr funptr, DCptr args, DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 ; -----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 EXPORT_C dcCall_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 push ebp ; prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 ; arguments:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 ;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 ; funptr ebp+8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 ; args ebp+12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 ; size ebp+16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 push esi ; save esi, edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 mov esi, [ebp+12] ; esi = pointer on args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 mov ecx, [ebp+16] ; ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 mov eax, [esi] ; eax = first argument
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 mov edx, [esi+4] ; edx = second argument
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 add esi, 8 ; increment source pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 sub ecx, 8 ; decrement size by 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 sub esp, ecx ; fastcall: allocate 'size'-8 bytes on stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 mov edi, esp ; edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 rep movsb ; copy arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 mov ecx, eax ; ecx = first argument
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 call [ebp+8] ; call function (fastcall: cleanup by callee)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 pop edi ; restore edi, esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 mov esp, ebp ; epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 ; Stack markings for ELF/GNU to specify no executable stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 %ifidn __OUTPUT_FORMAT__,elf
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 section .note.GNU-stack noalloc noexec nowrite progbits
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 %endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234