[C++] Portion de code asm intel & gcc

Portion de code asm intel & gcc [C++] - C++ - Programmation

Marsh Posté le 17-07-2003 à 03:46:31    

EDIT : Opération détération de topic [:anathema]
 
Apparement, on peut faire de l'assembleur inline avec la syntaxe intel en utilisant gcc (en compilant avec -masm=intel). Voir mon dernier post.

 
 
Bonjour,
 
Je souhaiterais mettre en place cette petite fonction :
 


8 : bool isMMXSupported()
9 : {
10:  int ok;
11:  __asm{
12:        mov eax,1  
13:        cpuid  
14:        and edx,0x800000 // test du bit 23
15:        mov ok,edx //  
16:       }
17:  
18  if (ok != 0)
19:   return true;
20:  else
21:   return false;
22: }

 
 
Lorsque je compile, je me prends les erreurs suivantes :
 


ismmx.cpp: In function `bool isMMXSupported()':
ismmx.cpp:11: error: parse error before `{' token
ismmx.cpp:10: warning: unused variable `int ok'
make: *** [ismmx.o] Error 1

 
 
Je compile comme ca :


g++ -c ismmx.cpp -Wall -pedantic

 
 
C'est la première fois que je m'aventure la dedans, j'imagine qu'il y a une erreur de syntaxe :)
 
Si vous voyez ce qui cloche, ca me débloquerait !
 
Merci, @+


Message édité par Evadream -jbd- le 07-10-2003 à 00:53:46
Reply

Marsh Posté le 17-07-2003 à 03:46:31   

Reply

Marsh Posté le 17-07-2003 à 04:01:42    

magnifique ton if...

Reply

Marsh Posté le 17-07-2003 à 04:17:00    

N'est-ce pas ?
 
Escuse moi il est un peu tard et je suis pas une super référence en bonnes méthodes de programmation :/ (admire la vielle escuse)
 
Tu attends plutot un truc dans le genre :
 


ok != 0 ? return true : return false ;


 
? Ou bien c'est encore plus gros ? [:ddr555]
 
Sinon, j'ai trouvé l'assocition de mot magique pour google : "gcc inline asm", je pense que je devrais me débrouiller. Je pensais que l'on pouvait faire comme ici, mais apparement ca n'a pas l'air !
 
Sinon ++Taz, je veux bien que tu me fasses part du pourquoi de ta pointe d'ironie :)
 
Bonnnnnne nuitttttttt !


Message édité par Evadream -jbd- le 17-07-2003 à 04:17:38
Reply

Marsh Posté le 17-07-2003 à 09:40:19    

perso ton if ne me travaille pas, par contre au vu de l'erreur je me demande si gcc supporte bien __asm (connais pas gcc, en tout cas sous vc c'est _asm)

Reply

Marsh Posté le 17-07-2003 à 12:08:31    

En effet, gcc ne semble pas supporté cette syntaxe d'après les différentes pages que j'ai pu trouvé. J'aurais bien aimé avoir confirmation :)
 
Merci de ta réponse !
 
@+

Reply

Marsh Posté le 17-07-2003 à 12:12:35    

ben tout dépend du compilateur, asm n'est pas un mot clef standard. regarde le manuel sur gcc.gnu.org et voilà

Reply

Marsh Posté le 17-07-2003 à 12:37:01    

sous gcc, on insère de l'asm inline comme ça :
 

Code :
  1. asm("commandes assembleur" );


 
ensuite, ton code ne compilera jamais, pour la simple raison que l'asm utilisé par gcc utilise la syntaxe AT&T, et pas la syntaxe Intel que tu utilises.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-07-2003 à 12:44:21    

Ok, merci à vous tous pour toutes ces infos précices.
 
@+

Reply

Marsh Posté le 17-07-2003 à 13:11:24    

Evadream -jbd- a écrit :

Tu attends plutot un truc dans le genre :
 


ok != 0 ? return true : return false ;


 
? Ou bien c'est encore plus gros ? [:ddr555]


 
C'est une manière compilquée d'écrire
return ok != 0;
 
:D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-07-2003 à 13:13:29    

antp a écrit :


 
C'est une manière compilquée d'écrire
return ok != 0;
 
:D


 
je dois dire que j'aime personnelement, je ne suis pas fan de  ce genre de notation, pour une raison qui  m'echappe a moi meme :D

Reply

Marsh Posté le 17-07-2003 à 13:13:29   

Reply

Marsh Posté le 17-07-2003 à 13:15:51    

antp a écrit :


 
C'est une manière compilquée d'écrire
return ok != 0;
 
:D


Voire même  
 
return ok;
 
non?

Reply

Marsh Posté le 17-07-2003 à 13:17:39    

skeye a écrit :


Voire même  
 
return ok;
 
non?


 
Non vu que ok est de type int et le retour de type bool
 
(en tout cas visu t'informe gentillement par le truchement d'un warning que c'est pas bien)

Reply

Marsh Posté le 17-07-2003 à 13:18:08    


Ah oui, j'ai été trop vite! [:ddr555]

Reply

Marsh Posté le 17-07-2003 à 13:18:35    

skeye a écrit :


Ah oui, j'ai été trop vite! [:ddr555]  


 
non c'est moi qui me suis planté, j'ai viré mon post
 
chrisbk >> return (bool)ok; alors ? :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-07-2003 à 13:19:06    

chrisbk a écrit :


 
Non vu que ok est de type int et le retour de type bool
 
(en tout cas visu t'informe gentillement par le truchement d'un warning que c'est pas bien)
 


bah return (bool)ok, alors?


Message édité par skeye le 17-07-2003 à 13:19:59
Reply

Marsh Posté le 17-07-2003 à 13:19:57    

antp a écrit :


 
non c'est moi qui me suis planté, j'ai viré mon post
 
chrisbk >> return (bool)ok; alors ? :D


 
J'avais essayé mais il me petait quand meme un warning [:ddr555]

Reply

Marsh Posté le 17-07-2003 à 13:21:10    

cast (C) inutile
 
enfin bon, dans la vie on dit "je suis ok" et pas "je suis ok==1"

Reply

Marsh Posté le 17-07-2003 à 13:28:39    

Asm inline avec gcc, c'est bien reloud.
T'as un petit tut ici :
http://www.delorie.com/djgpp/doc/b [...] djgpp.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-07-2003 à 13:30:05    

HelloWorld a écrit :

Asm inline avec gcc, c'est bien reloud.
T'as un petit tut ici :
http://www.delorie.com/djgpp/doc/b [...] djgpp.html


 
roh putain [:le kneu]
ce foutoir [:ddr555]

Reply

Marsh Posté le 17-07-2003 à 13:33:00    

Oui, je suis tombé sur la même doc, je vais m'amuser.

Reply

Marsh Posté le 17-07-2003 à 13:50:25    

HelloWorld a écrit :

Asm inline avec gcc, c'est bien reloud.
T'as un petit tut ici :
http://www.delorie.com/djgpp/doc/b [...] djgpp.html

[:totoz]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-07-2003 à 15:05:36    

C'est l'assembleur qui te fait peur ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-07-2003 à 15:06:33    

j'opte plutot pour le foutoir necessaire au bon fonctionnement de la chose :D

Reply

Marsh Posté le 17-07-2003 à 15:18:15    

HelloWorld a écrit :

C'est l'assembleur qui te fait peur ?

[:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-10-2003 à 00:41:10    

Voici un exemple que je compile avec :
 


g++ -Wall -pedantic -masm=intel asm.cpp  


 

Code :
  1. #include <iostream>
  2. int ok;
  3. bool isMMXSupported()
  4. {
  5.   asm(  ".intel_syntax noprefix
  6.          mov eax,1
  7.          cpuid
  8.          and edx,0x800000
  9.          mov ok,edx
  10.    \n" );
  11.   return ok;
  12. }
  13. int main () {
  14. std::cout << isMMXSupported() << std::endl ;
  15. }


 
La compilation me donne le warning suivant :
 


asm.cpp:8:9: warning: multi-line string literals are deprecated


 
Exécution :D
 


evadream@skybreaker tmp $ ./a.out
1
evadream@skybreaker tmp $


 
Pour que ca fonctionne, il faut que je déclare la variable ok en dehors d'un bloc, sinon le linker n'a pas l'air de la voir. En effet, si je la déclare dans le bloc de la fonction isMMXSupported, j'obtiens à la compilation :
 


/tmp/ccnUnXAh.o(.text+0x15): In function `isMMXSupported()':
: undefined reference to `ok'
collect2: ld returned 1 exit status


 
J'aimerais donc savoir si il existe un moyen de pouvoir utiliser une variable déclarée ds un bloc C++ dans mon asm syntaxe intel inline, où bien si ce n'est pas possible. Je vais effectuer deux trois recherches, mais à tout hasard, si qqun sait :)
 
Edit : aurteaugrafe


Message édité par Evadream -jbd- le 07-10-2003 à 01:19:16
Reply

Marsh Posté le 07-10-2003 à 00:45:16    

C quand meme sacrement la misere, gcc, pour l'asm inline....

Reply

Marsh Posté le 07-10-2003 à 00:54:19    

Chuis motivai ! :)
Je vais pas ouvrir un autre topic pour mon autre question, bien bête, mais je n'ai pas trouvé de réponse pour définir des #define avec un seul guillemet.
 
J'aimerais faire un truc dans le genre :
 

Code :
  1. void Foo () {
  2.   BEGIN_ASM
  3.        // ... du code asm en syntaxe intel
  4.   END_ASM
  5. }


 
J'ai donc pensé faire comme ca :
 

Code :
  1. #define BEGIN_ASM asm(".intel_syntax noprefix
  2. #define END_ASM  \n" );


 
Mais il ne reconnait pas le deuxième #define, enfin plutot il est incorporé au premier. Un g++ -E (merci Taz) me donne :
 

Code :
  1. asm(".intel_syntax noprefix
  2. #define END_ASM         \n" );
  3. END_ASM


 
[:ddr555]
 
Une idée à tout hasard ? Sinon bonne nuit à tous, je vais me coucher !


Message édité par Evadream -jbd- le 07-10-2003 à 01:17:23
Reply

Marsh Posté le 07-10-2003 à 04:18:05    

moi ce qui me fait le plus marrer c'est que la synthaxe AT&T et à 2 doigts de la synthaxe motorola.

Reply

Marsh Posté le 07-10-2003 à 13:05:48    

Et moi qui était super content de pouvoir faire l'asm inline avec la syntaxe intel, je vois que ca remue pas les foules :)

Reply

Marsh Posté le 07-10-2003 à 13:18:01    

remarque, ptet à la con:
mais:
 
#define yopla ligne1 \
              ligne2
 
il me semble que ça fait à la place de yopla:
ligne 1
ligne 2
 
donc ptet essayer avec #define END_ASM \\n" );
 
pour éviter que ça fasse chier avec le \
 
mais j'en suis pas du tout sûr :/ (j'avais prévenu hein)

Reply

Marsh Posté le 07-10-2003 à 13:19:50    

remarque non ça explique par l'imbrication de END_ASM dans BEGIN_ASM ....
 
(remarque avec le \ je confonds ptet avec le pragma aux sous watcom :D)

Reply

Marsh Posté le 07-10-2003 à 13:25:32    

Evadream > je serais toi, je téléchargerais Open Watcom. C'est un compilo C/C++ Open Source, et il possède un assembleur inline à 10000 lieues de celui de gcc (syntaxe Intel, récupération des variables C directement dans l'asm, etc...)
 
Regarde mon topic de création de démos old-school, y'a des sources qui mixent C et Asm. Tu te demanderas comment t'as pu te casser si longtemps le cul avec gcc...


Message édité par Harkonnen le 07-10-2003 à 13:26:43

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-10-2003 à 13:26:55    

définition des registres qui recoivent les paramètres et du registre qui retourne le résultat :D

Reply

Marsh Posté le 07-10-2003 à 14:07:48    

Harkonnen a écrit :

Evadream > je serais toi, je téléchargerais Open Watcom. C'est un compilo C/C++ Open Source, et il possède un assembleur inline à 10000 lieues de celui de gcc (syntaxe Intel, récupération des variables C directement dans l'asm, etc...)
 
Regarde mon topic de création de démos old-school, y'a des sources qui mixent C et Asm. Tu te demanderas comment t'as pu te casser si longtemps le cul avec gcc...


 
Merci pour le soutien :) Je suis avec une terrible attention le topic que tu cites, et j'ai testé 2/3 trucs avec Open Watcom, et c'est vrai que c'est d'une limpidité rare comparé à gcc :D
 
Mais je sens que j'y suis presque, il ne me manque que cette récupération des variables pour arriver à un truc propre.  Mais en effet, si cela s'avère impossible ... :/  
 
Bjone > Merci pour tes remarques, mais ca ne fonctionne pas, la sortie (g++ -E) me donne la chose suivante :
 


int main () {
 
  asm(".intel_syntax noprefix
#define END_ASM         \\n" );
  END_ASM
 
}


 
Je pense donc qu'il s'agit des guillements non fermant du premier #define.
 
Merci à vous deux pour vos remarques !
 
Si quelqu'un a une idée (pour l'asm et le #define), pas de soucis  !
 
@+


Message édité par Evadream -jbd- le 07-10-2003 à 14:08:15
Reply

Marsh Posté le 07-10-2003 à 14:10:39    

bon, a ta place, je ferais ca :
 
 

Code :
  1. bool mmxSupported()
  2. {
  3. asm(  ".intel_syntax noprefix
  4.         mov eax,1
  5.         cpuid
  6.         and edx,0x800000
  7.         mov eax,edx
  8.         ret
  9.   \n" );
  10. }


 
et basta

Reply

Marsh Posté le 07-10-2003 à 14:30:11    

Merci pour ta réponse.
C'est vrai que ce n'est qu'un détail comparé à la récupération des variables d'un bloc :)

Reply

Marsh Posté le 07-10-2003 à 14:31:34    

ben vu que je connais pas du tout gcc je peux pas t'aider sur ce point. Par contre ce que je peux te dire c que pour ce genre de fonction, tu peux te contenter de laisser le resultat sur EAX (si le resultat est un entier c la que le compilo le laissera por l'appelant)

Reply

Marsh Posté le 07-10-2003 à 20:48:12    

par contre, il me semble qu'avoir une écriture:
 
yopla("ligne1""ligne2" ) est correcte.
 
tu peux donc essayer de ferme le "" dans le premier #define

Reply

Marsh Posté le 07-10-2003 à 23:02:24    

Faut pas faire de chaine de caractère qui s'étend sur plusieures lignes. Dans les prochaines versions de GCC ça ne marchera plus du tout. Par contre faut pas me demander ce qu'il faut mettre à la place :D

Reply

Marsh Posté le 08-10-2003 à 18:59:53    

BJone > Ca fonctionne pas ;) Mais c'est pas bien grave, j'ai plus trop le temps pour faire tout ca :(
 
Kristoph > Merci pour cette indication !
 
Je reste toujours intéressé par des éventuels solutions !
 
Merci à tous ! @+

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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