2012-07-08 14 views
5

Estoy tratando de aprender ASM, y quiero probar algunas cosas combinadas con C++. La parte ASM se realiza en una función desnuda. Pero cada vez que llamo a la función (vacía), la aplicación falla en la siguiente función. ¿Qué debo hacer en la función desnuda para que funcione? ¿Necesito hacer pop esp o algo así? Un ejemplo podría ser útil.C++ usa la función desnuda

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

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

    asmfunc(); 

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

    return 0; 
} 
+2

Según lo especificado por la [documentación] (http://msdn.microsoft.com/it-it/library/h5w10wxs.aspx), debe escribir el código prolog/epilog; vea [esta pregunta] (http://stackoverflow.com/questions/3021513/could-someone-explain-declspecnaked-please). Además, considere si realmente necesita funciones 'naked': si todo lo que quiere es escribir algún ensamblado integrado simplemente use una función normal y deje que el compilador maneje las convenciones de llamadas de C++. –

+2

Preste atención a las convenciones de llamadas. Las funciones desnudas no conservan los registros requeridos. – Mysticial

Respuesta

12

La función desnuda no contendrá ningún código de prólogo y epílogo generado por el compilador. Esto se aplica a la declaración de devolución implícita al final de la función también.

Eso significa que la función que declaró no tiene instrucciones ret al final. Una vez que el control se transfiere al asmfunc, nunca regresa. La función continúa ejecutando el código que exista en esa ubicación hasta que golpea algo que lo bloquea.

Básicamente, su implementación original de asmfunc funciona como una etiqueta en algún lugar en el medio del código del programa. Y cuando llama a su función, básicamente está haciendo un goto asmfunc, es decir, transfiere el control a algún lugar sin ninguna esperanza de devolución.

Por esta razón, una función desnudo mínimo, debe ser lo

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

Es su responsabilidad para colocar ret instrucciones en una función desnudo.

Cuestiones relacionadas