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

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

Marsh Posté le 26-12-2004 à 03:32:17    

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 ???
 

Reply

Marsh Posté le 26-12-2004 à 03:32:17   

Reply

Marsh Posté le 26-12-2004 à 09:58:56    

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).

Reply

Marsh Posté le 26-12-2004 à 12:30:27    

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


---------------
Mon Flickr
Reply

Marsh Posté le 26-12-2004 à 12:39:26    

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.

Reply

Marsh Posté le 26-12-2004 à 13:25:21    

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é.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed