2010-06-11 18 views
8

Szukam do przeniesienia silnika skryptowego napisanego dla Windows na Linuksa; to jest dla platformy wizualizacji Winampa AVS. Nie jestem pewien, czy w tej chwili jest to możliwe. Z tego co wiem, kod pobiera adresy funkcji C i zapisuje je w tabeli, do której może odwoływać się podczas wykonywania kodu.Czy ktoś mógłby wytłumaczyć __declspec (nagi), proszę?

Zajrzałem do dokumentacji MS, ale nie jestem pewien, co naprawdę robi __declspec(naked). Co to jest kod prolog i epilog wspomniany w dokumentacji? Czy jest to związane z konwencjami wywoływania systemu Windows? Czy to jest przenośne? Znasz jakieś przykłady oparte na Linuxie, używając podobnych technik?

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

To, co one oznaczają przez prolog i epilog: http: // msdn.microsoft.com/en-us/library/tawsa7cb(VS.80).aspx, jestem prawie pewien, że możesz po prostu '#define __declspec (n)' rozwinąć do zera dla Linuksa. Myślę, że GNU C++ implementuje coś podobnego, ale nie jestem do końca pewny, co to jest poza moim zasięgiem. –

Odpowiedz

5

zasadzie prolog funkcja konfiguruje ramkę stosu dla zmiennych lokalnych i epilog dba o czyszczenie go. Zwykle jest to wykonywane automatycznie przez kompilator. Jeśli używasz __declspec(naked), ustawienie tej ramki stosu będzie zależało od ciebie, co daje większą elastyczność.

Istnieje wiele odniesień: here, here, also here i więcej.

GNU GCC kompilator obsługuje również naga, ale widocznie nie dla x86: search for "naked" in the page (nie próbowałem sprawdzić, czy to działa na x86)

Powiązane problemy