Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_call_x86.S @ 165:572aff021627
- file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
- some "I'm bored"-whitespace-cleanup
author | cslag |
---|---|
date | Thu, 05 Jan 2017 10:35:12 +0100 |
parents | 3e629dc19168 |
children | d5705f226298 |
comparison
equal
deleted
inserted
replaced
164:2d330a60c44f | 165:572aff021627 |
---|---|
33 C Interface: | 33 C Interface: |
34 dcCall_x86_XXX(void* target, void* args, size_t size); | 34 dcCall_x86_XXX(void* target, void* args, size_t size); |
35 ddCall_x86_sys_XXX(int_ptr target, void* args, size_t size); | 35 ddCall_x86_sys_XXX(int_ptr target, void* args, size_t size); |
36 | 36 |
37 Where XXX is one of calling-conventions, | 37 Where XXX is one of calling-conventions, |
38 cdecl, win32_msthis, win32_std, win32_fastcall. | 38 cdecl, win32_msthis, win32_std, win32_fastcall. |
39 | 39 |
40 Parameter Stack layout: | 40 Parameter Stack layout: |
41 size := EBP + 16 | 41 size := EBP + 16 |
42 args := EBP + 12 | 42 args := EBP + 12 |
43 target := EBP + 8 | 43 target := EBP + 8 |
65 MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */ | 65 MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */ |
66 ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */ | 66 ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */ |
67 ANDL(LIT(-16),ECX) | 67 ANDL(LIT(-16),ECX) |
68 MOVL(ECX,DWORD(EBP,16)) /* save ECX. */ | 68 MOVL(ECX,DWORD(EBP,16)) /* save ECX. */ |
69 SUBL(ECX,ESP) /* allocate stack size */ | 69 SUBL(ECX,ESP) /* allocate stack size */ |
70 MOVL(ESP,EDI) /* EDI = stack ptr */ | 70 MOVL(ESP,EDI) /* EDI = stack ptr */ |
71 | 71 |
72 /* | 72 /* |
73 work around for rep movsd (not supported by SunPro) | 73 work around for rep movsd (not supported by SunPro) |
74 | 74 |
75 SHRL(LIT(2),ECX) | 75 SHRL(LIT(2),ECX) |
76 REP(MOVSD) | 76 REP(MOVSD) |
77 | 77 |
78 */ | 78 */ |
79 | 79 |
80 REP(MOVSB) | 80 REP(MOVSB) |
81 CALL_DWORD(EBP,8) | 81 CALL_DWORD(EBP,8) |
82 ADDL(DWORD(EBP,16),ESP) | 82 ADDL(DWORD(EBP,16),ESP) |
183 */ | 183 */ |
184 | 184 |
185 GLOBAL(dcCall_x86_sys_int80h_linux) | 185 GLOBAL(dcCall_x86_sys_int80h_linux) |
186 BEGIN_PROC(dcCall_x86_sys_int80h_linux) | 186 BEGIN_PROC(dcCall_x86_sys_int80h_linux) |
187 PUSH(EBP) /* prolog. */ | 187 PUSH(EBP) /* prolog. */ |
188 MOVL(ESP,EBP) | 188 MOVL(ESP,EBP) |
189 PUSH(EBX) /* save preserved. */ | 189 PUSH(EBX) /* save preserved. */ |
190 PUSH(ESI) | 190 PUSH(ESI) |
191 PUSH(EDI) | 191 PUSH(EDI) |
192 MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */ | 192 MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */ |
193 MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */ | 193 MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */ |
213 */ | 213 */ |
214 | 214 |
215 GLOBAL(dcCall_x86_sys_int80h_bsd) | 215 GLOBAL(dcCall_x86_sys_int80h_bsd) |
216 BEGIN_PROC(dcCall_x86_sys_int80h_bsd) | 216 BEGIN_PROC(dcCall_x86_sys_int80h_bsd) |
217 PUSH(EBP) /* prolog. */ | 217 PUSH(EBP) /* prolog. */ |
218 MOVL(ESP,EBP) | 218 MOVL(ESP,EBP) |
219 PUSH(ESI) /* save preserved. */ | 219 PUSH(ESI) /* save preserved. */ |
220 PUSH(EDI) | 220 PUSH(EDI) |
221 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ | 221 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ |
222 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ | 222 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ |
223 SUBL(ECX,ESP) /* allocate stack space. */ | 223 SUBL(ECX,ESP) /* allocate stack space. */ |