Question

J'ai un projet écrit en C qui était à l'origine réalisé sous Linux, mais qui doit maintenant l'être sous Windows. Une partie du code inclut cette ligne à plusieurs endroits

asm("movl temp, %esp");

Mais cela provoque une "référence non définie à" temp "" Erreur.

Cela n’a aucun problème à compiler sous Linux en utilisant le compilateur gcc 4.3.2 (testé sur une autre machine), qui est la version que j’ai sur Cygwin. Y a-t-il un autre moyen d'accomplir ce que cette ligne fait?

Était-ce utile?

La solution

Vous devez modifier la version de cygwin de

.
asm("movl temp, %esp");

à

asm("movl _temp, %esp");

Oui, c'est le même compilateur et le même assembleur, mais ils sont configurés différemment pour assurer la compatibilité avec le système hôte.

Vous pouvez isoler le préfixe de symbole dépendant du système en indiquant simplement un nom spécifique à gcc:

int *temp asm("localname");
...
__asm__("movl localname,%esp");

Ceci évite un #if de quelque sorte et supprime une dépendance du système d'exploitation hôte mais ajoute une dépendance du compilateur. En parlant d’extensions de compilateur, certaines personnes écriraient (voir info en tant que ) quelque chose comme:

#ifdef __GNUC__
    __asm__("movl %[newbase],%%esp"
                :
                : [newbase] "r,m" (temp)
                : "%esp");
#else
#error haven't written this yet
#endif

L’idée ici est que cette syntaxe permet au compilateur de vous aider en trouvant temp , même s’il traîne dans un registre ou prend quelques instructions à charger, et également pour éviter les conflits avec vous, c’est au cas où il utilisait un registre que vous aviez vidé. Il en a besoin car un __ asm __ () simple n’est analysé en aucune manière par le compilateur.

Dans votre cas, vous semblez mettre en place votre propre package de threading, ce qui importe peu. Gcc n'était pas sur le point d'utiliser% esp pour un calcul. (Mais pourquoi ne pas simplement utiliser des pthreads ...?)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top