Pregunta

Aquí está mi pregunta anterior sobre el cambio de callstacks C. Sin embargo, C ++ utiliza una convención de llamada diferente (thiscall) y puede requerir algo de código ensamblador diferente. ¿Puede alguien explicar las diferencias y señalar o suministrar algunos fragmentos de código que cambian callstacks C ++ (preferiblemente en GCC asm en línea)?

Gracias, James

¿Fue útil?

Solución

El código dado en la pregunta anterior debería funcionar bien.

El thiscall convención de llamada sólo difiere ¿quién es responsable de hacer estallar los argumentos de la pila. En el marco del convenio de llamada thiscall, el destinatario de la llamada aparece los argumentos (y, además, el puntero se pasa en this ecx); bajo la convención de llamada C, la persona que llama aparece los argumentos. Esto no afecta a los cambios de contexto.

Sin embargo, si usted va a hacer cambios de contexto a sí mismo, tenga en cuenta que necesita para guardar y restaurar los registros también (probablemente en la pila), además de cambiar las pilas.

Tenga en cuenta, por cierto, de que C ++ no utiliza siempre thiscall - sólo se usa para los métodos con un número fijo de argumentos (y aparte de eso, es un Microsoftism ... g ++ no la usa).

Otros consejos

Tenga en cuenta la ABI para C ++ no se define explícitamente.

La idea era que el compilador fabrica son capaces de utilizar la convención de llamada óptima para la situación y así hacer más rápido C ++.

El lado negativo de esto es que cada uno tiene su propio compilador convención de llamada de este modo el código de diferentes compiladores no son compatible (incluso formato de código diferentes versiones (o incluso diferentes parámetros de optimización) del mismo compilador pueden ser incompatable).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top