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

Signaler
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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 ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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++
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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