Portion de code asm intel & gcc [C++] - C++ - Programmation
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 :
|
? Ou bien c'est encore plus gros ?
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 !
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)
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 !
@+
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à
Marsh Posté le 17-07-2003 à 12:37:01
sous gcc, on insère de l'asm inline comme ça :
Code :
|
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.
Marsh Posté le 17-07-2003 à 13:11:24
Evadream -jbd- a écrit : Tu attends plutot un truc dans le genre :
|
C'est une manière compilquée d'écrire
return ok != 0;
Marsh Posté le 17-07-2003 à 13:13:29
antp a écrit : |
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
Marsh Posté le 17-07-2003 à 13:15:51
ReplyMarsh Posté le 17-07-2003 à 13:17:39
skeye 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)
Marsh Posté le 17-07-2003 à 13:18:35
skeye a écrit : |
non c'est moi qui me suis planté, j'ai viré mon post
chrisbk >> return (bool)ok; alors ?
Marsh Posté le 17-07-2003 à 13:19:06
chrisbk a écrit : |
bah return (bool)ok, alors?
Marsh Posté le 17-07-2003 à 13:19:57
antp a écrit : |
J'avais essayé mais il me petait quand meme un warning
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"
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
Marsh Posté le 17-07-2003 à 13:30:05
HelloWorld a écrit : Asm inline avec gcc, c'est bien reloud. |
roh putain
ce foutoir
Marsh Posté le 17-07-2003 à 13:50:25
HelloWorld a écrit : Asm inline avec gcc, c'est bien reloud. |
Marsh Posté le 17-07-2003 à 15:05:36
ReplyMarsh Posté le 17-07-2003 à 15:06:33
j'opte plutot pour le foutoir necessaire au bon fonctionnement de la chose
Marsh Posté le 17-07-2003 à 15:18:15
HelloWorld a écrit : C'est l'assembleur qui te fait peur ? |
Marsh Posté le 07-10-2003 à 00:41:10
Voici un exemple que je compile avec :
|
Code :
|
La compilation me donne le warning suivant :
|
Exécution
|
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 :
|
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
Marsh Posté le 07-10-2003 à 00:45:16
C quand meme sacrement la misere, gcc, pour l'asm inline....
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 :
|
J'ai donc pensé faire comme ca :
Code :
|
Mais il ne reconnait pas le deuxième #define, enfin plutot il est incorporé au premier. Un g++ -E (merci Taz) me donne :
Code :
|
Une idée à tout hasard ? Sinon bonne nuit à tous, je vais me coucher !
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.
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
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)
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 )
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...
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
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...) |
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
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 :
|
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 !
@+
Marsh Posté le 07-10-2003 à 14:10:39
bon, a ta place, je ferais ca :
Code :
|
et basta
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
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)
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
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
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 ! @+
Marsh Posté le 17-07-2003 à 03:46:31
EDIT : Opération détération de topic
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