Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1150 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Fonction asm utilisable en C++, linker error...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction asm utilisable en C++, linker error...

n°931928
ayorosmage
Posté le 26-12-2004 à 03:32:17  profilanswer
 

Salut à tous, j'essaye de faire une fonction en asm compilée avec nasm que je puisse utiliser dans du code C++ (avec dev-c++).
J'ai suivi le tutorial ici : http://perso.wanadoo.fr/philippe.b [...] /asm1.html. Le problème est qu'ils expliquent comment compiler avec le compilateur cvi mais pas avec dev-c++.
 
Alors voila ma démarche :
 
Tout d'abord je génère un fichier objet avec nasm en compilant le code suivant avec la commande : D:\Nasm\nasmw.exe -f win32 D:\Nasm\test.asm
 

Code :
  1. ;-------------|-------|-------------------|----------------------------
  2. ;-------------|-------|-------------------|----------------------------
  3. ;-------------|-------|-------------------|----------------------------
  4. ;-------------|-------|-------------------|----------------------------
  5. segment .text
  6. global _Test1
  7. global _Test2
  8. ;-------------|-------|-------------------|----------------------------
  9. ;-------------|-------|-------------------|----------------------------
  10. ;-------------|-------|-------------------|----------------------------
  11. ;-------------|-------|-------------------|----------------------------
  12. _Test1:
  13.              push    ebp
  14.              mov     ebp, esp 
  15.    
  16.              mov     eax, [ebp+8]       ; 1er argument
  17.              mov     ecx, [ebp+12]      ; 2eme argument
  18.              add     eax, ecx
  19.    
  20.              pop     ebp                ;
  21.              ret                        ; retour, la somme est dans
  22.                                         ; EAX
  23.  
  24. ;-------------|-------|-------------------|----------------------------
  25. ;-------------|-------|-------------------|----------------------------
  26. ;-------------|-------|-------------------|----------------------------
  27. ;-------------|-------|-------------------|----------------------------
  28. _Test2:
  29.              push    ebp
  30.              mov     ebp, esp       
  31.    
  32.              mov     eax, [ebp+8]       ; on met l'adr
  33.              mov     eax, [eax]         ; om met la valeur pointée
  34.              mov     ecx, [ebp+12]      ; on prend l'adr du 2me
  35.                                         ; argument
  36.              add     eax, [ecx]         ; on add avec la valeur
  37.                                         ; pointée
  38.    
  39.              pop     ebp           
  40.              ret                        ; retour, la somme est dans
  41.                                         ; EAX


 
Ensuite avec Dev-c++ je créer un projet en invite de commande avec le code suivant :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. //---------------------------------------------------------------------
  4. int Test1(int Val1, int Val2);
  5. int Test2(int *Val1, int *Val2);
  6. //---------------------------------------------------------------------
  7. int main(int argc, char *argv[]){
  8. int Val;
  9. int Val1, Val2;
  10. Val = Test1(3,8);
  11. cout<<"La valeur de retour est : "<<Val<<endl;
  12. Val1 = 8;
  13. Val2 = 13;
  14. Val = Test2(&Val1,&Val2);
  15. cout<<"La valeur de retour est : "<<Val<<endl;
  16. int fin;
  17. cin>>fin;
  18. return 0;
  19. }


 
Dans la partie "linker" de "l'option du projet" de dev-c++ j'indique ou se trouve le fichier objet généré par nasm.
...et quand je compile j'ai droit a :

Citation :

[Linker error] undefined reference to `Test1(int, int)'
  [Linker error] undefined reference to `Test2(int*, int*)'


 
J'en conclu qu'il ne toruve pas la fonction Test1 et Test2 que j'ai écri en asm pourtant j'ai bien intégré le fichier obj généré par nasm.
Dans ce cas là d'où vient le problème ???
 

mood
Publicité
Posté le 26-12-2004 à 03:32:17  profilanswer
 

n°931936
Lam's
Profil: bas.
Posté le 26-12-2004 à 09:58:56  profilanswer
 

Tes fonctions ASM, utilisent la convention d'appel et le name mangling C, donc c'est:
 

Code :
  1. extern "C"
  2. {
  3. int Test1(int Val1, int Val2);
  4. int Test2(int *Val1, int *Val2);
  5. }


 
Eventuellement, tu devras rajouter à la main un underscore au début du nom de tes fonctions ASM, mais je ne me souviens plus (la vieillesse, perte de la mémoire, toussa quoi).

n°931981
maximew
Coffee and cigarettes and Cate
Posté le 26-12-2004 à 12:30:27  profilanswer
 

asm
{
  Ton code assembleur
}
 
ne serait t-il pas plus simple?


---------------
Mon Flickr
n°931988
Lam's
Profil: bas.
Posté le 26-12-2004 à 12:39:26  profilanswer
 

maximew a écrit :

asm
{
  Ton code assembleur
}
 
ne serait t-il pas plus simple?


 
Tu n'as pas forcément accès à des modes différents (addressage 64 bits par exemple), tu ne peux pas facilement manipuler tous tes registres (jouer avec EBP, etc.) et surtout, c'est carrément pas portable (alors que NASM l'est).  
Il faut utiliser la syntaxe AT&T avec gcc, et la syntaxe intel avec Visual C++. Et la syntaxe AT&T, c'est le mal absolu. Pire que tout, même la mort.

n°932003
ayorosmage
Posté le 26-12-2004 à 13:25:21  profilanswer
 

Citation :

   * extern "C"  
    * {
    * int Test1(int Val1, int Val2);
    * int Test2(int *Val1, int *Val2);
    * }


 
Merci ca marche impécablement maintenant.  
Sinon comme tu l'as indiqué je ne veux pas utiliser de l'assembleur "en ligne" pour des problèmes de syntaxes (AT&T  :non: ) et de portabilité.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Fonction asm utilisable en C++, linker error...

 

Sujets relatifs
[Maple] cherche une fonction qui retourne la taille d'une tableSocket : la fonction connect.
help: probleme de fonction .h en CQuestion à propos d'une fonction du htacces de PHPNuke
fonction mysql_connect [RESOLU]urgent : La Fonction Win32::MsgBox ne fonctionne pas correctement
Echec d'appel d'une fonction COMProblème syntaxique de définition de template pour une fonction membre
Sortir une variable d'un fonction ?passage de parametres a 1 fonction pb de retour
Plus de sujets relatifs à : Fonction asm utilisable en C++, linker error...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR