Utiliser une fonction ASM compilée (sous MASM
slolo2000
Messages postés
315
Statut
Membre
-
SKZ81 -
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.
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:
- Utiliser une fonction ASM compilée (sous MASM
- Fonction si et - Guide
- Comment utiliser chromecast sur tv - Guide
- Utiliser iphone comme webcam - Guide
- Utiliser une tablette comme ecran pc - Guide
- Comment utiliser teamviewer - Guide
1 réponse
Qu'est ce qui ne va pas ?
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 :
Ce qui indique au compilo que c'est une fonction C, non surchargeable, et non-manglisé.
Tout devrais rentrer dans l'ordre.
[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.