2012-07-08 9 views
5

Próbuję nauczyć się ASM i chcę wypróbować kilka rzeczy w połączeniu z C++. Część ASM odbywa się w czystej funkcji. Ale za każdym razem, gdy wywołuję funkcję (pusta), aplikacja ulega awarii w następnej funkcji. Co powinienem zrobić w nagiej funkcji, żeby to działało, czy muszę pop esp czy coś takiego? Przykład może być pomocny.C++ użyj nagiej funkcji

_declspec(naked) void asmfunc() 
{ 
    _asm 
    { 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    i = 1; 

    asmfunc(); 

    cout << i << endl; // <-- crash 
    system("pause"); 

    return 0; 
} 
+2

Zgodnie z [dokumentacją] (http://msdn.microsoft.com/it-it/library/h5w10wxs.aspx), musisz napisać kod prolog/epilog; zobacz [to pytanie] (http://stackoverflow.com/questions/3021513/could-someone-explain-declspecnaked-please). Zastanów się też, czy naprawdę potrzebujesz funkcji "nagich": jeśli chcesz tylko napisać jakiś zestaw osadzony, użyj zwykłej funkcji i pozwól kompilatorowi radzić sobie z konwencjami wywoływania C++. –

+2

Zwróć uwagę na konwencje wywoływania. Nagie funkcje nie zachowują wymaganych rejestrów. – Mysticial

Odpowiedz

12

Naga funkcja nie zawiera generowanego przez kompilator kodu prologu i epilogu. Dotyczy to również niejawnej instrukcji return na końcu funkcji.

Oznacza to, że funkcja, którą zadeklarowałeś, nie ma na końcu instrukcji ret. Po przejściu kontroli do asmfunc, nigdy nie wraca. Funkcja nadal wykonuje dowolny kod w tej lokalizacji, dopóki nie trafi na coś, co powoduje awarię.

Zasadniczo oryginalna implementacja asmfunc działa jak etykieta gdzieś w środku kodu programu. A kiedy zadzwonisz do swojej funkcji, zasadniczo robisz goto asmfunc, tzn. Przenosisz kontrolę gdziekolwiek bez żadnej nadziei na powrót.

Z tego powodu minimalna nagi funkcja powinna wyglądać jak

_declspec(naked) void asmfunc() 
{ 
    _asm 
    { 
     ret 
    } 
} 

Twoim zadaniem jest umieszczenie ret instrukcje do nagiej funkcji.

Powiązane problemy