Utiliser une fonction ASM compilée (sous MASM

slolo2000 Messages postés 315 Statut Membre -  
 SKZ81 -
Bonjour,

j'essaye désespérément d'intégrer une fonction assembleur (compilée sous MASM) dans Dev-C++ (v4.9.9.2)

Voici mon code C :

/**************** Code C ****************/

#include <windows.h>
#include "rc_dlg.h"

extern long STDCALL myfnt(long);

/* prototype for the dialog box function. */
static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
DialogBoxParam(hThisInstance, MAKEINTRESOURCE(IDD_DLG1), NULL, (DLGPROC) DialogFunc, 0);
}

BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
char s[255];

switch (msg) {
case WM_INITDIALOG:
wsprintf(s, "Valeur : %d", myfnt(10));
MessageBox( 0, s, "Title", 0);

return TRUE;
case WM_CLOSE:
EndDialog(hwndDlg,0);
return TRUE;
}
return FALSE;
}

/**************** Code ASM ****************/

Et voici mon code assembleur (compilé avec MASM)

.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive

.code

myfnt proc public arg1:dword
add arg1, 10
mov eax, arg1
myfnt endp

end

/*****************************************/

A la compilation, j'ai ceci comme erreur :
[Linker error] undefined reference to `_Z5myfntl@4'
ld returned 1 exit status
D:\tmp\Makefile.win [Build Error] [test.exe] Error 1

J'ai ajouté dans les options de mon projet l'emplacement de mon fichier asm compilé function.o (dans "Project options", onglet "Parameters" et zone "Linker")

Qu'est ce qui ne va pas ?

Merci d'avance pour votre aide.
A voir également:

1 réponse

SKZ81
 
Qu'est ce qui ne va pas ?
 [Linker error] undefined reference to `_Z5myfntl@4' 

Ca. Ta fonction est "mangueulisé" (manglezized) c'est à dire qu'elle possède des décoration qui la rendent unique. Cela sert pour les fonctions surchargées : vu qu'il existe plusieurs prototypes, ils sont différenciés par le nom manglisé de la fonction.

Bref, pour résourdre ton problème, tu dois faire :

extern C {
  long STDCALL myfnt(long);
};

Ce qui indique au compilo que c'est une fonction C, non surchargeable, et non-manglisé.
Tout devrais rentrer dans l'ordre.
0