Título: ¿Como es posible retornar estructuras con la convencion de llamadas cdecl? Publicado por: Usuario887 en 6 Marzo 2021, 22:46 pm Tengo una pequeña duda...
En C es posible hacer esto: Código
¿Como es posible hacerlo segun la convencion de llamadas de C? Citar Integer values and memory addresses are returned in the EAX register https://en.wikipedia.org/wiki/X86_calling_conventions (https://en.wikipedia.org/wiki/X86_calling_conventions)Entiendo que una estructura no es un valor entero (a menos que sea una direccion de memoria). Entonces, ¿Como haciendo uso de cdecl se puede retornar una estructura entera? La citada en el codigo no cabe siquiera en EDX:EAX. Saludos y gracias por su atencion. Título: Re: ¿Como es posible retornar estructuras con la convencion de llamadas cdecl? Publicado por: Eternal Idol en 7 Marzo 2021, 09:43 am Es a gusto del compilador.
Citar In regard to how to return values, some compilers return simple data structures with a length of 2 registers or less in the register pair EAX:EDX, and larger structures and class objects requiring special treatment by the exception handler (e.g., a defined constructor, destructor, or assignment) are returned in memory. To pass "in memory", the caller allocates memory and passes a pointer to it as a hidden first parameter; the callee populates the memory and returns the pointer, popping the hidden pointer when returning https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl Código
Código
Código
Al frenarse en el breakpoint: 0:000> dt test!_Hdr @eax +0x000 data1 : 65 'A' +0x008 data2 : 45.039999999999999147 +0x010 data3 : 0x00cc3290 "PROBANDO 123" Código
0:000> dD 01048ea8 l1 01048ea8 45.04 0:000> da 01053290 01053290 "PROBANDO 123" Ahora podes probar sacando data2 de la estructura, data1 sera devuelto en EAX y data3 en EDX. Título: Re: ¿Como es posible retornar estructuras con la convencion de llamadas cdecl? Publicado por: Usuario887 en 7 Marzo 2021, 12:54 pm Supuse que se trataba de algo asi. No entiendo el codigo que usa el set de instrucciones MMX, pero entiendo lo que esta haciendo.
Aunque sinceramente pense que hacia uso de un ciclo para guardar los datos byte a byte. Citar Ahora podes probar sacando data2 de la estructura, data1 sera devuelto en EAX y data3 en EDX. Me parece impresionante lo exhaustiva que llega a ser la tecnologia. Saludos y gracias por tu respuesta. Título: Re: ¿Como es posible retornar estructuras con la convencion de llamadas cdecl? Publicado por: Eternal Idol en 7 Marzo 2021, 13:19 pm Aunque sinceramente pense que hacia uso de un ciclo para guardar los datos byte a byte. A la larga lo terminara haciendo si la estructura es suficientemente extensa. De nadas ::) Título: Re: ¿Como es posible retornar estructuras con la convencion de llamadas cdecl? Publicado por: BloodSharp en 7 Marzo 2021, 16:28 pm A ver que pasa con GCC:
Código
Al parecer una función común y corriente como foo2 en cdecl funciona perfectamente, pero es interesante ver lo que pasa con foo: (https://i.imgur.com/k8j9C7Y.png) Está pasando un puntero como argumento, lo interesante es que al parecer GCC cambia la convención a tipo stdcall: (https://i.imgur.com/X7J42iD.png) Si arreglo y paso como parametro el puntero a la estructura vemos como el descompilador funciona casi retornando el mismo código original: (https://i.imgur.com/UyWj7oJ.png) Por lo que en este caso aunque además de retornar la dirección del puntero (aunque no es usado) a la estructura también trabaja con un argumento oculto. B# |