Mediante y guardando los registros de ensamblado en línea
Específicos de Microsoft
No debe suponer generalmente que un registro tendrá un valor determinado cuando inicia un bloque de __asm .Los valores del registro no está garantizado que conservarían a través de los bloques independientes de __asm .Si se finaliza un bloque de código insertado y inicia otro, no puede confiar en los registros del segundo bloque para retener los valores del primer bloque.Un bloque de __asm hereda la configuración de registro resultan de flujo de control normal.
Si utiliza la convención de llamada de __fastcall , el compilador pasar argumentos de la función en registros en lugar de en la pila.Esto puede crear problemas en funciones con bloques de __asm porque una función no tiene ninguna manera de indicar qué parámetro está en el registro.Si la función ocurre recibir un parámetro en EAX inmediatamente y almacena algo más en EAX, se pierde el parámetro original.Además, debe guardar el registro de ECX en cualquier función declarada con __fastcall.
Para evitar estos conflictos del registro, no utilice la convención de __fastcall para funciones que contienen un bloque de __asm .Si especifica la convención de __fastcall global con la opción del compilador /Gr, declare cada función que contiene __asm bloqueado con __cdecl o __stdcall.(Atributo de El __cdecl indica al compilador que utiliza la convención de llamada de C para esa función.) Si no compila con /Gr, evite declarar la función con el atributo de __fastcall .
Al utilizar __asm para escribir lenguaje de ensamblado en C/C++ funciona, no necesita mantener los registros de, EAX de EBX, de ECX, de EDX, de ESI, o de EDI.por ejemplo, en el ejemplo de POWER2.C en La escritura ejecuta el ensamblado en línea, la función de power2 no conserva el valor en el registro de EAX.Sin embargo, con estos registros afectará a la calidad del código porque el asignador de registro no puede utilizarlos para almacenar valores a través de los bloques de __asm .Además, mediante EBX, ESI o EDI en el código de ensamblado en línea, se fuerza el compilador para guardar y restaurar los registros en el prólogo y epílogo de la función.
Debe mantener otros registros utilizados (por ejemplo DS, los SS, SP, punto de ebullición, y se marcan los registros) para el ámbito del bloque de __asm .Debe mantener los registros de ESP y EBP a menos que tenga alguna razón para cambiarlos (cambiar pilas, por ejemplo).Vea también Optimizar el ensamblado en línea.
Algunos tipos de SSE requieren la alineación de la pila de ocho-byte, forzando el compilador para emitir código dinámico de la pila-alineación.Para poder tener acceso a las variables locales y parámetros de la función después de la alineación, el compilador mantiene dos punteros del cuadro.Si el compilador realiza la omisión de puntero de (FPO) marco, utilizará EBP y ESP.Si el compilador no realiza FPO, utilizará y EBX EBP.Para asegurarse de que ejecuta el código correctamente, no modifique EBX en código asm si la función requiere la alineación dinámica de pila como altere el puntero de marco.Mueva los tipos alineado de ocho-byte de función, o evite utilizar EBX.
[!NOTA]
Si el código de ensamblado en línea cambia el indicador de dirección mediante instrucciones de STD o de CLD, debe restablecer el marcador a su valor original.
Específico de Microsoft de FINAL