2017-03-13 2 views
1

Je tente de construire Voxlap sur Linux à partir d'ici https://github.com/Ericson2314/Voxlap et quand j'essaie de faire donc je reçois un message d'erreur concernant l'assemblage en ligne:Erreur lors de la tentative de compilation inline asm: "invalide 'asm': opérande n'est pas un code de condition, code d'opérande 'c'"

source/sdlmain.cpp: In function ‘void fpuinit(long int)’: 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
); 
^ 

source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c' 

le code incriminé est ici:

static long fpuasm[2]; 
static inline void fpuinit (long a) 
{ 
    __asm__ __volatile__ 
    (
     "fninit\n" 
     "fstcww %c[fp]\n" 
     "andb $240, %c[fp]+1(,1)\n" 
     "orb %%al, %c[fp]+1(,1)\n" 
     "fldcww %c[fp]\n" 
     : 
     : "a" (a), [fp] "p" (fpuasm) 
     : "cc" 
    ); 
} 

l'erreur du compilateur pointe vers cette partie

: "cc" 

Toute aide à déchiffrer le message d'erreur ou la question réelle serait grandement apprécié, grâce

+0

Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –

+0

Je l'ai fait, y avait-il un problème avec ce que j'ai demandé? –

+0

Eh bien, fournissez un [MCVE], s'il vous plaît, s'il vous plaît. –

Répondre

2

Comme Michael Petch explique la cause immédiate du problème est probablement parce que Ubuntu est maintenant livré avec une version de GCC qui crée la position executables indépendants (TARTE) par défaut. L'instruction asm ne fonctionne pas lorsque le compilateur génère un code indépendant de la position (PIC). Vous pouvez probablement remplacer le code avec ce qui suit, comme il devrait être équivalent:

static inline void fpuinit (long a) 
{ 
    asm volatile (
     "mov %1, %0\n\t" 
     "fninit\n\t" 
     "fldcw %0\n" 
     :: "m" (*(short *)fpuasm), 
     "ir" ((short) (0x037F & 0xF0FF | (a & 0xFF) << 8))); 
} 

Cela remplace le maladroit "p" contrainte « pointeur » et le c modificateur opérande « constant » dont il a besoin pour le faire fonctionner avec un simple "m" contrainte "mémoire". Cela a l'avantage de fonctionner, qu'il soit compilé en PIC ou non. Il fonctionne également sur les cibles 32 bits et 64 bits. J'ai également pris la liberté d'optimiser le code en profitant du fait que l'instruction FNINIT met le mot de contrôle FPU à un état connu (0x037F), donc il n'est pas nécessaire d'utiliser l'instruction FSTCW pour le lire.