annotate test/gen-masm/call_x86.S @ 281:f5577f6bf97a

- file header cleanups for release
author Tassilo Philipp
date Thu, 19 Apr 2018 20:10:26 +0200
parents 3e629dc19168
children da5232da6270
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 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: test
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: test/gen-masm/call_x86.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 0
diff changeset
9 Copyright (c) 2011-2018 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
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 #if defined(GEN_MASM)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 .386
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 .MODEL FLAT
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 .CODE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 # define BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 # define END_ASM END
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 # define GLOBAL(X) _##X PROC
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 # define END_PROC(X) _##X ENDP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 # define HEX(X) X##h
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 .intel_syntax
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 # define BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 # define END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 # include "../../dyncall/dyncall_macros.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 # if defined(DC__OS_Win32) || defined(DC__OS_Cygwin) || defined(DC__OS_MinGW) || defined(DC__OS_Darwin)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 # define CSYM(X) _##X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 # define CSYM(X) X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 # define GLOBAL(X) .globl CSYM(X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 # define BEGIN_PROC(X) CSYM(X):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 # define END_PROC(X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 # define HEX(X) 0x##X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 // Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 // File: dyncall/dyncall_call_x86_gas.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 // Description: All x86 abi call kernel implementations in GNU Assembler using C Preprocessor
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 // License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 // Copyright (c) 2007-2010 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 // Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 // Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 // purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 // copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 // === end of macros ==========================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 // ============================================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 // DynCall Call Kernels for X86 Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 // ----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 // C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 // dcCall_x86_XXX(void* target, void* args, size_t size);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 // Parameter Stack layout:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 // size := ebp + 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 // args := ebp + 12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 // target := ebp + 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 // NOTES:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 // - epilog restore esp serves callee cleanup
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 // --- default / cdecl --------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 // - caller clean-up
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 GLOBAL(dcCall_x86_cdecl)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 BEGIN_PROC(dcCall_x86_cdecl)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 push ebp // prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 push esi // save preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 mov esi, dword ptr[ebp+12] // esi = copy source args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 mov ecx, dword ptr[ebp+16] // ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 sub esp, ecx // alloc stack size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 mov edi, esp // edi = copy target stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 shr ecx, 2 // ecx = count DWORDs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 rep movsd // copy DWORDs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 call dword ptr[ebp+8] // call target
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 add esp, dword ptr[ebp+16] // cleanup stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 pop edi // restore preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 mov esp, ebp // epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 END_PROC(dcCall_x86_cdecl)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 // ---- C++ this calls (microsoft) ------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 // Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 // - this pointer is in ECX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 GLOBAL(dcCall_x86_win32_msthis)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 BEGIN_PROC(dcCall_x86_win32_msthis)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 push ebp // prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 push esi // save preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 mov esi, dword ptr [ebp+12] // esi = pointer on args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 mov ecx, dword ptr [ebp+16] // ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 mov eax, dword ptr [esi+0] // eax = this pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 add esi, 4 // increment args pointer by thisptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 sub ecx, 4 // decrement size by sizeof(thisptr)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 sub esp, ecx // allocate argument-block on stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 mov edi, esp // edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 rep movsb // copy arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 mov ecx, eax // ecx = this pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 call dword ptr[ebp+8] // call function
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 pop edi // restore preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 mov esp, ebp // epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 pop ebp
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 END_PROC(dcCall_x86_win32_msthis)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 // ---- win32 stdcall ---------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 // - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 GLOBAL(dcCall_x86_win32_std)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 BEGIN_PROC(dcCall_x86_win32_std)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 push ebp // prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 push esi // save esi, edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 mov esi, dword ptr[ebp+12] // esi = args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 mov ecx, dword ptr[ebp+16] // ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 sub esp, ecx // allocate size bytes on stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 mov edi, esp // edi = copy destination stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 rep movsb // copy BYTEs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 call dword ptr[ebp+8] // call target
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 pop edi // restore edi, esi */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 mov esp, ebp // epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 END_PROC(dcCall_x86_win32_std)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 // ---- win32 fastcall (GNU/Microsoft) ----------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 // - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 // - first two integer (up to 32bits) are passed in ECX and EDX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 GLOBAL(dcCall_x86_win32_fast)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 BEGIN_PROC(dcCall_x86_win32_fast)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 push ebp // prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 push esi // save preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 mov esi, dword ptr[ebp+12] // esi = copy source args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 mov ecx, dword ptr[ebp+16] // ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 mov eax, dword ptr[esi+0] // eax = first argument
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 mov edx, dword ptr[esi+4] // edx = second argument
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 add esi, 8 // skip registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 sub ecx, 8 //
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 mov dword ptr [ebp+16], ecx // save stack alloc size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 sub esp, ecx // allocate stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 mov edi, esp // edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 rep movsb // copy BYTEs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 mov ecx, eax // ecx = first argument
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 call dword ptr[ebp+8] // call target
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 pop edi // restore preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 mov esp, ebp // epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 END_PROC(dcCall_x86_win32_fast)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 // --- syscall int80 linux ---------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 // - all arguments are passed via registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 GLOBAL(dcCall_x86_sys_int80h_linux)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 BEGIN_PROC(dcCall_x86_sys_int80h_linux)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 push ebp // prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 push ebx // save preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 push esi
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 mov eax, dword ptr[ebp+12] // eax = argument buffer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 mov ebx, dword ptr[eax+0] // move first five arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 mov ecx, dword ptr[eax+4]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 mov edx, dword ptr[eax+8]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 mov esi, dword ptr[eax+12]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 mov edi, dword ptr[eax+16]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 mov eax, dword ptr[ebp+8] // eax = syscall id
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 int HEX(80)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 pop edi // restore preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 pop ebx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 mov esp, ebp // epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 END_PROC(dcCall_x86_sys_int80h_linux)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 // --- syscall int80 bsd -----------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 // - all arguments are passed via stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 GLOBAL(dcCall_x86_sys_int80h_bsd)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 BEGIN_PROC(dcCall_x86_sys_int80h_bsd)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 push ebp // prolog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 mov ebp, esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 push esi // save preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 push edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 mov esi, dword ptr[ebp+12] // esi = pointer on args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 mov ecx, dword ptr[ebp+16] // ecx = size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 sub esp, ecx // allocate stack space
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 mov edi, esp // edi = stack args
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 shr ecx, 2 // ecx = number of DWORDs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 rep movsd // copy DWORDs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 mov eax, dword ptr[ebp+8] // load system call id
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236 call _do_int
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 pop edi // restore preserved
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 pop esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239 mov esp, ebp // epilog
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 pop ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 _do_int:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243 int HEX(80)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
245 END_PROC(dcCall_x86_sys_int80h_bsd)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 END_ASM