Pregunta

Tratar de entender cómo vincular una función que se define en una estructura, la función está en el código ensamblador, y estoy tratando de llamarlo desde c. Creo que estoy perdiendo una causa paso cuando llamo a la función, aparece un símbolo externo sin resolver ...

;Assembly.asm
.686p
.mmx
.xmm
.model flat

include Definitions.inc

.code

?Initialize@Foo@@SIXPAUFee@@@Z proc
    jmp $
?Initialize@Foo@@SIXPAUFee@@@Z endp

end



//CFile.c
struct Fee
{
   signed long id; 
}

struct Foo
{
   static void Initialize(Fee *);
}


int startup(Fee * init)
{
  Foo::Initialize(init); //<-- This is unresolved
  return 0;
}
¿Fue útil?

Solución

Su código de montaje define una función cuyo nombre decorado decodifica a

public: static void __fastcall Foo::InitializeCurrentCpu(struct Fee *)

Como obtenida a través de la utilidad undname.exe. Foo :: InitializeCurrentCpu () no estará a la altura de Foo :: Initialize (), el nombre no coincide. Tampoco la convención de llamada.

Escribir el código en C ++ primero y mirar el archivo .map para el nombre decorado correcta. O declarar la función con extern "C" para suprimir la decoración C ++.

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