Ensamblador - Assembler con C++

 
Vista:

Assembler con C++

Publicado por Marc Palacios (1 intervención) el 29/09/2000 00:00:00
Hola!Utilizo Djgpp y Nasm (netwide Assembler) para hacer programas híbridos en C y ensamblador. Pero no se cómo definir métodos de clase en ensamblador en un programa C++.Cual es la estructura de paso de parametros?Como recibe el módulo de ensamblador al objeto original?

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Assembler con C++

Publicado por Pedro Pablo (21 intervenciones) el 29/09/2000 00:00:00
El paso de parámetros en C++ es igual que en C, salvo que todos los métodos de clase
tienen un primer parámetro implícito (que el programador no ve) que es this, es decir
un puntero al objeto. Después van el resto de parámetros, igual que en C (por tanto primero se
apila this, luego el primer parámetro, luego el segundo...)
De todas formas hacer métodos de clases en ensamblador no es tan sencillo por culpa
de los nombres. En C la función MiFuncion(...) puedes hacerla en ensamblador, llamarla
_MiFuncion y luego enlazarla con el obj del programa en C para conseguir el ejecutable.
En C++ el nombre de las funciones y métodos en alto nivel no tienen nada que ver con el
de bajo nivel. Esto se debe a que puede haber múltiples funciones y métodos con el mismo
nombre, ya sea en distintas clases, o en una misma clase haciendo uso del polimorfismo.
Por lo tanto el nombre se codifica incluyendo información sobre los parámetros y la clase.
Desgraciadamente cada compilador genera el nombre de una forma. A si es que yo no
he conseguido nunca mezclar C++ puro y ensamblador. Y siempre tenía que recurrir a
cosas híbridas, utilizando funciones definidas como de "C", para que el compilador utilizara
el estandar de nombres en C.
Así, tendrías:
class MiClase{
void MiFuncion(int primerParametro);
};

extern "C" {
void MiFuncionEnEnsamblador(MiClase* ptr, int param);
}

void MiClase :: MiFuncion(int primerParametro) {
MiFuncionEnEnsamblador(this, primerParametro);
}


Bueno, es más o menos así, aunque no sé si habré metido algún error sin darme cuenta...

Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar