1. c_proc/func() bug ?
- Posted by "mic _" <stabmaster_ at hotmail.com> Nov 10, 2003
- 648 views
I was playing around with the new ability to use define_c_proc/func and c_proc/func with machine code functions. What puzzled me a bit was the order in which arguments are pushed. Assume the following: foo = define_c_func("", function_pointer, {C_INT,C_INT,C_INT}, C_INT) result = c_func(foo, {1, 2, 3}) Since this uses stdcall, the stack should look like this when the function is called: esp+0: return address esp+4: 3 esp+8: 2 esp+12: 1 But what i got was this: esp+0: return address esp+4: 1 esp+8: 2 esp+12: 3 What gives?
2. Re: c_proc/func() bug ?
- Posted by Robert Craig <rds at RapidEuphoria.com> Nov 10, 2003
- 629 views
mic _ wrote: > I was playing around with the new ability to use define_c_proc/func and > c_proc/func with machine code functions. What puzzled me a bit was the > order in which arguments are pushed. > > Assume the following: > > foo = define_c_func("", function_pointer, {C_INT,C_INT,C_INT}, C_INT) > result = c_func(foo, {1, 2, 3}) > > Since this uses stdcall, the stack should look like this when the > function is called: > > esp+0: return address > esp+4: 3 > esp+8: 2 > esp+12: 1 > > But what i got was this: > > esp+0: return address > esp+4: 1 > esp+8: 2 > esp+12: 3 > > What gives? In both __cdecl and __stdcall the arguments are pushed in reverse order, i.e. the last argument is pushed first. Regards, Rob Craig Rapid Deployment Software http://www.RapidEuphoria.com
3. Re: c_proc/func() bug ?
- Posted by "Bernard W. Ryan" <xotron at bluefrognet.net> Nov 10, 2003
- 626 views
Mic: This is from MSDN: Microsoft Specific =97> ----------------------------------------------------------------------- The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype. The following list shows the implementation of this calling convention. Element Implementation=20 Argument-passing order Right to left.=20 Argument-passing convention By value, unless a pointer or reference type is= passed.=20 Stack-maintenance responsibility Called function pops its own arguments from the stack.=20 Name-decoration convention An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12=20 Case-translation convention None=20 ----------------------------------------------------------------------- This is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code. The following list shows the implementation of this calling convention. Element Implementation=20 Argument-passing order Right to left=20 Stack-maintenance responsibility Calling function pops the arguments from the stack=20 Name-decoration convention Underscore character (_) is prefixed to names= =20 Case-translation convention No case translation performed=20 Bernie
4. Re: c_proc/func() bug ?
- Posted by "mic _" <stabmaster_ at hotmail.com> Nov 11, 2003
- 622 views
Yeah I can see now it was correct. I just remembered something was supposed to be reversed. It's been too long since I messed around with those kinda things.. What's weird though, is that my program didn't crash when i had forgot do "ret 12" instead of just "ret" which i had put at first. Maybe that was just "luck".
5. Re: c_proc/func() bug ?
- Posted by "Daniel Kluss" <codepilot at netzero.net> Nov 11, 2003
- 606 views
----- Original Message ----- From: "mic _" <stabmaster_ at hotmail.com> To: <EUforum at topica.com> Subject: c_proc/func() bug ? > > > I was playing around with the new ability to use define_c_proc/func and > c_proc/func with machine code functions. What puzzled me a bit was the order > in which arguments are pushed. > > Assume the following: > > foo = define_c_func("", function_pointer, {C_INT,C_INT,C_INT}, C_INT) > result = c_func(foo, {1, 2, 3}) > > Since this uses stdcall, the stack should look like this when the function > is called: > > esp+0: return address > esp+4: 3 > esp+8: 2 > esp+12: 1 > > But what i got was this: > > esp+0: return address > esp+4: 1 > esp+8: 2 > esp+12: 3 > > What gives? > > > > TOPICA - Start your own email discussion group. FREE! > >
6. Re: c_proc/func() bug ?
- Posted by "Bernard W. Ryan" <xotron at bluefrognet.net> Nov 11, 2003
- 645 views
>Yeah I can see now it was correct. I just remembered something was supposed >to be reversed. It's been too long since I messed around with those kinda >things.. >What's weird though, is that my program didn't crash when i had forgot do >"ret 12" instead of just "ret" which i had put at first. Maybe that was just >"luck". Mic: Pascal pushs stack left to right. "C" pushs stack right to left. The raeson "C" is right to left was because "C" added the capability to use a variable number of arguments in a call. Bernie