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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°459830
Evadream -​jbd-
Posté le 17-07-2003 à 03:46:31  profilanswer
 

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
mood
Publicité
Posté le 17-07-2003 à 03:46:31  profilanswer
 

n°459832
Taz
bisounours-codeur
Posté le 17-07-2003 à 04:01:42  profilanswer
 

magnifique ton if...

n°459833
Evadream -​jbd-
Posté le 17-07-2003 à 04:17:00  profilanswer
 

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
n°459900
chrisbk
-
Posté le 17-07-2003 à 09:40:19  profilanswer
 

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)

n°460103
Evadream -​jbd-
Posté le 17-07-2003 à 12:08:31  profilanswer
 

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 !
 
@+

n°460109
Taz
bisounours-codeur
Posté le 17-07-2003 à 12:12:35  profilanswer
 

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

n°460135
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-07-2003 à 12:37:01  profilanswer
 

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)
n°460144
Evadream -​jbd-
Posté le 17-07-2003 à 12:44:21  profilanswer
 

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

n°460191
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-07-2003 à 13:11:24  profilanswer
 

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
n°460197
chrisbk
-
Posté le 17-07-2003 à 13:13:29  profilanswer
 

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

mood
Publicité
Posté le 17-07-2003 à 13:13:29  profilanswer
 

n°460202
skeye
Posté le 17-07-2003 à 13:15:51  profilanswer
 

antp a écrit :


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


Voire même  
 
return ok;
 
non?

n°460206
chrisbk
-
Posté le 17-07-2003 à 13:17:39  profilanswer
 

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)

n°460207
skeye
Posté le 17-07-2003 à 13:18:08  profilanswer
 


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

n°460209
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-07-2003 à 13:18:35  profilanswer
 

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
n°460212
skeye
Posté le 17-07-2003 à 13:19:06  profilanswer
 

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
n°460213
chrisbk
-
Posté le 17-07-2003 à 13:19:57  profilanswer
 

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]

n°460216
Taz
bisounours-codeur
Posté le 17-07-2003 à 13:21:10  profilanswer
 

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

n°460224
HelloWorld
Salut tout le monde!
Posté le 17-07-2003 à 13:28:39  profilanswer
 

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
n°460226
chrisbk
-
Posté le 17-07-2003 à 13:30:05  profilanswer
 

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]

n°460228
Evadream -​jbd-
Posté le 17-07-2003 à 13:33:00  profilanswer
 

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

n°460252
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-07-2003 à 13:50:25  profilanswer
 

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)
n°460357
HelloWorld
Salut tout le monde!
Posté le 17-07-2003 à 15:05:36  profilanswer
 

C'est l'assembleur qui te fait peur ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°460358
chrisbk
-
Posté le 17-07-2003 à 15:06:33  profilanswer
 

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

n°460376
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-07-2003 à 15:18:15  profilanswer
 

HelloWorld a écrit :

C'est l'assembleur qui te fait peur ?

[:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
n°532957
Evadream -​jbd-
Posté le 07-10-2003 à 00:41:10  profilanswer
 

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
n°532959
chrisbk
-
Posté le 07-10-2003 à 00:45:16  profilanswer
 

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

n°532965
Evadream -​jbd-
Posté le 07-10-2003 à 00:54:19  profilanswer
 

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
n°532989
bjone
Insert booze to continue
Posté le 07-10-2003 à 04:18:05  profilanswer
 

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

n°533187
Evadream -​jbd-
Posté le 07-10-2003 à 13:05:48  profilanswer
 

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

n°533202
bjone
Insert booze to continue
Posté le 07-10-2003 à 13:18:01  profilanswer
 

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)

n°533204
bjone
Insert booze to continue
Posté le 07-10-2003 à 13:19:50  profilanswer
 

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)

n°533222
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-10-2003 à 13:25:32  profilanswer
 

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)
n°533224
bjone
Insert booze to continue
Posté le 07-10-2003 à 13:26:55  profilanswer
 

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

n°533257
Evadream -​jbd-
Posté le 07-10-2003 à 14:07:48  profilanswer
 

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
n°533259
chrisbk
-
Posté le 07-10-2003 à 14:10:39  profilanswer
 

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

n°533264
Evadream -​jbd-
Posté le 07-10-2003 à 14:30:11  profilanswer
 

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

n°533267
chrisbk
-
Posté le 07-10-2003 à 14:31:34  profilanswer
 

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)

n°533572
bjone
Insert booze to continue
Posté le 07-10-2003 à 20:48:12  profilanswer
 

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

n°533766
Kristoph
Posté le 07-10-2003 à 23:02:24  profilanswer
 

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

n°534667
Evadream -​jbd-
Posté le 08-10-2003 à 18:59:53  profilanswer
 

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 ! @+

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[ASP=>PHP] transcrire ce code de l asp en phpEnvoyer un mail avec code HTML avec Mapi sous VB...
Le code auto modifié ?[Word] Recherche code pour le carriage return ou espace
[MFC] scanner de code barre[Eclipse] Formatage de code ?
[VBA et Access] Question sur un morceau de code !code SQL dans une requete ....[pu d'erreur inside !!!]
Récupérer le code source d'une page[100% Newbie] Utiliser Intel C++ Compiler 7
Plus de sujets relatifs à : [C++] Portion de code asm intel & gcc


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