2010-06-11 13 views
8

Estoy buscando en portar un motor de script escrito para Windows a Linux; es para la plataforma de visualización AVS de Winamp. No estoy seguro si es posible en este momento. Por lo que puedo decir, el código toma las direcciones de las funciones C nseel_asm_atan y nseel_asm_atan_end y las almacena dentro de una tabla a la que puede hacer referencia durante la ejecución del código.¿Podría alguien explicar __declspec (desnudo) por favor?

He visto la documentación de MS, pero no estoy seguro de qué es realmente __declspec(naked). ¿Qué es el código prólogo y epilog mencionado en la documentación? ¿Está relacionado con las convenciones de llamadas de Windows? ¿Es esto portátil? ¿Conoce algún ejemplo basado en Linux que use técnicas similares?

static double (*__atan)(double) = &atan; 
__declspec (naked) void nseel_asm_atan(void) 
{ 
    FUNC1_ENTER 

    *__nextBlock = __atan(*parm_a); 

    FUNC_LEAVE 
} 
__declspec (naked) void nseel_asm_atan_end(void) {} 
+0

Esto es lo que quieren decir con prólogo y epílogo: http: // msdn.microsoft.com/en-us/library/tawsa7cb(VS.80).aspx, estoy bastante seguro de que puedes simplemente '#define __declspec (n)' expandirse a nada para Linux. Creo que GNU C++ implementa algo similar, pero no estoy seguro de qué es lo que está fuera de mi cabeza. –

Respuesta

5

Básicamente, el prólogo de función establece un marco de pila para variables locales y el epílogo se encarga de limpiarlo. Esto generalmente lo hace automáticamente el compilador. Si usa __declspec(naked), la configuración de este marco de pila dependerá de usted, por lo que le brinda más flexibilidad.

Hay muchas referencias: here, here, also here y más.

El compilador GNU gcc también soporta desnudo, pero al parecer no para x86: search for "naked" in the page (no he probado para ver si funciona en x86)

Cuestiones relacionadas