(La version originale de la question ne mentionnait pas que les erreurs provenaient d'un système SPARC Solaris, et l'appelait simplement C90 car l'ancienne version de gcc installée par défaut était -std=c90
, ce qui entraînait des messages d'erreur sont illégaux en C90.)
Attendez une minute, "fonctionne bien sur Ubuntu mais pas sur C90"? /usr/ccs/bin/as
(dans votre capture d'écran) ressemble à Solaris. Cela + le nom d'hôte est un indice que cela pourrait être une machine SPARC, pas du tout x86.
assemblage x86 est évident que la syntaxe ne assembleur SPARC valide. C'est une architecture de CPU différente.
Si vous avez utilisé gcc foo.c -S
et regardé le fichier de sortie foo.s
asm résultant, vous verriez qu'il était plein de SPARC asm, à l'exception du texte inséré littéralement par vos asm
déclarations.
La syntaxe SPARC utilise% decorators sur les noms de registre, mais les noms de registre sont différents. par exemple. add %i0, %i1, %o0
ajoute les registres d'entrée i0
et i1
, en stockant le résultat dans le registre de sortie o0
. (Entrée comme fonction arg et de sortie comme résultat de la fonction. SPARC uses a sliding window onto a large virtual register file qui pourrait ou ne pourrait pas renverser la mémoire, selon que la microarchitecture CPU est hors des registres lors de l'exécution. Instruction save
)
Rappelez-vous que ces erreurs sont de l'assembleur Solaris, pas de gcc. Vous utilisez gcc mais il utilise l'assembleur du système à la place de l'assembleur GNU.
Quoi qu'il en soit, je recommande de réécrire votre code dans C pur portable, plutôt que d'utiliser #ifdef __x86__
pour continuer à utiliser asm inline, ou en écrivant un port SPARC de celui-ci.
BTW, votre déclaration ASM semble horrible. Une version différente de gcc pourrait stocker une constante différente au .LC0
, brisant votre code. Plus important encore, vous n'utilisez pas de contraintes d'entrée/sortie pour dire au compilateur quelle valeur est où. Si vous supposez que vous pouvez définir eax dans asm à l'intérieur d'une fonction, c'est incorrect. La fonction peut et va s'introduire, et votre asm est en train de flotter librement au milieu de votre fonction. Voir the end of this answer pour des liens vers des tutoriels GNU C inline asm.
De même, vous n'avez pas besoin d'asline inline pour convertir en endian.Vous obtiendrez mieux asm d'utiliser endian.h functions comme uint32_t le32toh(uint32_t little_endian_32bits);
qui utilisent gcc builtins ou inline asm pour que le compilateur fasse lui-même une sortie d'assemblage optimale.
Voir aussi https://gcc.gnu.org/wiki/DontUseInlineAsm, ce qui s'applique même si vous avez fait comment l'utiliser correctement.
Ne postez pas d'images de texte! Et ce n'est pas un C90, mais un assembleur. Vérifiez le fichier temporaire! – Olaf
Essayez d'échapper: '%% esi'. –
@KerrekSB: N'ajouterait pas deux symboles '%'? Je ne suis pas familier avec l'assemblage x86, mais pourrait-il être un problème avec la syntaxe AT & T vs Intel? – Olaf