Utiliser une fonction ASM compilée (sous MASM) sous Dev-C++ ?

skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007 - 6 avril 2005 à 14:14
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007 - 6 avril 2005 à 20:07
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.

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2005 à 15:22
ASM "compilé"... nenni, c'est toi le compilo si tu écris en asm et il n'y a donc personne qui t'optimisera le code, il sera bon ou mauvais.
Le prends pas mal mais au vu de ton court exemple, vaudrait mieux écrire en C et le compilo avec les bons réglages produira nettement meilleur. Faut faire une seule lecture de l'adresse mémoire et l'adition sur eax directement, un compilo ne raterait pas cela.

ciao...
BruNews, MVP VC++
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
6 avril 2005 à 16:11
Salut BruNews,



En effet mon exemple est stupide mais c'est fait exprès.

Mon code assembleur contient en fait 5 fonctions (environs 350 lignes
de code) qui seraient difficile d'écrire en C et qui nécessite d'être
exécutées le plus rapidement possible.

J'ai donc fait un exemple tout simple mais qui me pose le même problème que mon fichier asm d'origine.



Donc si quelqu'un m'explique comment faire fonctionner mon petit exemple, je devrais pouvoir m'en sortir à le miens.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2005 à 16:55
Essaie en ajoutant un 'C':

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

pas certain que 'public' soit utile.

ciao...
BruNews, MVP VC++
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
6 avril 2005 à 17:06
J'ai essayé mais ça ne change rien.

En fait je pense que c'est plus un problème au niveau du link.

Dev C++ ne semble pas faire le lien avec ma fonction (qui se trouve dans mon fichier.o)



Le pire c'est que je ne sais pas si le problème vient :


<li>de la déclaration de ma fonction en assembleur</li>
<li>de la façon dont j'appelle ma fonction depuis Dev-C++</li>
<li>d'un problème de paramètrage de Dev-C++</li>

As-tu le temps (et l'envie) de tester le programme ?



Merci.



ps: 'public' est nécessaire je crois pour que la fonction assembleur
soit visible de l'extérieur du module (donc depuis le fichier C ou bien
d'autre modules assembleur)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2005 à 17:17
Désolé je bosse sur VS 2003, je ne peux donc pas tester mais passe impec sous VS avec le 'C'. Je pense que c'est une question de décoration du nom de la fonction dans la lib, pour cela qu'il ne la trouve pas.

ciao...
BruNews, MVP VC++
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
6 avril 2005 à 17:44
Tu as fait le même test que moi ?

Tu as écrit un petit fichier en assembleur que tu as assemblé avec MASM
et utilisé ensuite dans VS 2003 ou tu as utilisé directement de
l'assembleur inline dans VS 2003 ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2005 à 17:55
Fichier asm direct dans VS, suffit de mettre:
E:\Masm32\bin\ml.exe -c -coff -Cx -Fo$(IntDir)\$(InputName).obj $(InputName).asm
en propriété du fichier asm eton utilise l'assembleur qu'on veut, identique si je l'assemblais avant avec masm.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 avril 2005 à 17:57
ah oui, note que c'est un vieil truc que j'ai retrouvé, je n'utilise plus que l'asm direct dans les fichiers C en employant:
__declspec(naked)
pour que le compilo ne touche à rien, nettement plus confortable.

ciao...
BruNews, MVP VC++
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
6 avril 2005 à 20:07
J'ai réussi



Voici le code assembleur



my_fnt proc stdcall public arg1:dword

add arg1, 10

mov eax, arg1

ret

my_fnt endp



et la déclaration dans le fichier C



extern "C" long STDCALL my_fnt(long);



Merci BruNews pour ton aide
0
Rejoignez-nous