2010-06-11 16 views
8

Sto esaminando il porting di un motore di script scritto per Windows su Linux; è per la piattaforma di visualizzazione di Winamp AVS. Non sono sicuro che sia possibile al momento. Da quello che posso dire il codice sta prendendo gli indirizzi delle funzioni C nseel_asm_atan e nseel_asm_atan_end e li memorizza all'interno di una tabella a cui può fare riferimento durante l'esecuzione del codice.Qualcuno potrebbe spiegare __declspec (nudo) per favore?

Ho esaminato la documentazione di MS, ma non sono sicuro di cosa faccia veramente lo standard __declspec(naked). Qual è il codice prolog ed epilog menzionato nella documentazione? È collegato alle convenzioni di chiamata di Windows? È portatile? Conosci qualche esempio basato su Linux usando tecniche simili?

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

Questo è ciò che si intende per prologo ed epilogo: http: // msdn.microsoft.com/en-us/library/tawsa7cb(VS.80).aspx, sono abbastanza sicuro che puoi '#define __declspec (n)' per espandere a niente per Linux. Penso che GNU C++ implementa qualcosa di simile, ma non sono abbastanza sicuro di cosa sia fuori di testa. –

risposta

5

Fondamentalmente la funzione prologo imposta un frame dello stack per le variabili locali e l'epilogo prende cura di pulirlo. Questo di solito è fatto automaticamente dal compilatore. Se si utilizza __declspec(naked), la configurazione di questo stack frame è la scelta giusta per maggiore flessibilità.

Ci sono molti riferimenti: here, here, also here e altro.

Il compilatore gcc GNU supporta anche nudo, ma a quanto pare non per x86: search for "naked" in the page (non ho provato a vedere se funziona su x86)

Problemi correlati