2016-12-02 1 views
0

Je cet extrait C, ce qui donne une erreur de compilation et je n'ai pas la moindre idée pourquoi:de Windows/Intel compilateur/Inline Assembleur et problèmes de syntaxe GNU

// compiler dependent inline assemble 
#ifdef __INTEL_COMPILER 
#define ASM __asm 
#else 
#define ASM __asm__ 
#endif 

int getfpucw(
    /* Get FPU control word */ 
) { 
    int mode = 0; 

    // load mode value into register %0, no output ...: :... 
    ASM fnstcw *&mode; 
    ASM("fnstcw %0" : "m"(*&mode)); 
    return mode; 
} 

Je reçois:

../src/fpucw.c(28): error: invalid constant in assembly language instruction ASM("fnstcw %0" : : "m"(*&mode)); ^

../src/fpucw.c(28): error: invalid constant in assembly language instruction ASM("fnstcw %0" : : "m"(*&mode));

La première instruction ASM est transmise. Je pense que c'est la syntaxe MS ASM?

Cependant, je veux éviter de toujours utiliser #ifdef autour des instructions ASM car nous utilisons également GCC.

+1

Est-ce que votre code est écrit en C ou est-il écrit en C++? Veuillez choisir au plus une des deux langues. – fuz

+2

L'assemblage en ligne est spécifique au compilateur. Si vous voulez éviter un tas d'ifdefs, n'utilisez pas l'assemblage en ligne. Placez plutôt le code d'assemblage dans les fichiers d'assemblage et assemblez-les avec le même assembleur, quel que soit le compilateur C que vous utilisez. – Michael

+0

Je ne peux pas reproduire votre erreur. Pouvez-vous nous montrer l'assemblée générée s'il vous plaît? – fuz

Répondre

1

Je crois que je comprends votre problème: Vous avez les directives ASM pour les assemblages de style MSVC et de style gcc, mais vous incluez toujours les deux. Bien sûr, icc est confus par une directive asm de style gcc et vice versa. Pour résoudre ce problème, je vous recommande de redéfinir ASM comme ceci:

#ifdef __INTEL_COMPILER 
#define IASM(x) __asm x 
#define GASM(x) 
#else 
#define IASM(x) 
#define GASM(x) __asm__(x) 
#endif 

puis modifier vos directives asm-:

IASM(fnstcw *&mode); 
GASM("fnstcw %0" : : "m"(*&mode)); 

noter enfin que la directive de montage de style gcc fonctionne correctement , mode doit être un opérande de sortie lorsque vous remplacez sa valeur. changer ainsi que la ligne à:

GASM("fnstcw %0" : "=m"(mode)); 

et notez que le *& est redondant et peut être ignoré.

+0

Bien que le compilateur Intel puisse prendre en charge la syntaxe d'assemblage en ligne GCC ou MSVC pour des raisons de compatibilité, vous voudrez certainement utiliser la syntaxe GCC car elle est beaucoup plus puissante (et vous l'écrivez quand même!). La syntaxe de MSVC n'offre aucun moyen de spécifier des valeurs d'entrée, donc elle fait toujours beaucoup de magasins et de charges supplémentaires. –

+0

J'ai ajouté le style MSVC juste pour voir si cela fonctionne de cette façon, comme dit, ICC supporte les deux. Je voudrais aller avec le style GCC. –

+0

@ RobertM.Münch Pouvez-vous me montrer l'assemblée générée s'il vous plaît? Il se peut que vous deviez utiliser la syntaxe Intel pour ICC. Heureusement, il existe un moyen de spécifier AT & T et l'assemblage Intel dans une instruction asm de style gcc. – fuz