gokernel
(usa Linux Mint)
Enviado em 08/09/2017 - 15:55h
Valeu "paulo1205" pelo retorno !
O meu código é muito similar(reduzi ao máximo para demonstrar) a esse abaixo:
//-------------------------------------------------------------------
//
// Funcao Retorna Float:
//
// FILE:
// return_float.c
//
// COMPILE:
// gcc return_float.c -o return_float -Wall
//
//-------------------------------------------------------------------
//
#include <stdio.h>
#define UCHAR unsigned char
typedef union TValue TValue;
union TValue {
long l; //: type long integer
float f; //: type float
char *s; //: type pointer of char
void *p; //: type pointer
};
UCHAR code[50];
UCHAR *p = code;
TValue arg[10];
TValue ret;
float soma (float a, float b)
{
return a+b;
}
void funcao (void)
{
TValue (*func) ();
*(void**)p = soma;
p += sizeof(void*);
func = *(void**)(code); // func = soma
// 2501.000000
//
arg[0].f = 1000.50;
arg[1].f = 1500.50;
// executa a funcao
//
func (arg[0], arg[1]); // return float: 2501.000000
//
// aqui captura o resultado float
//
#ifdef WIN32
asm ("fstps _ret");
#endif
#ifdef __linux__
asm ("fstps ret");
#endif
}
int main (void)
{
funcao();
printf ("\nSaindo Com Sucesso - ret: %f\n", ret.f); // 2501.0000
return 0;
}
OBS: Esse código testei apenas no Windows em 32 bits, acho que no Linux 32 bits também funciona ... não testei no Linux.
O meu desafio é substituir a parte que usa assembly para tornar o código muito portável.