2009-09-12 8 views
2

J'ai un projet écrit en C qui était à l'origine sous Linux, mais qui doit maintenant être fait sous Windows. Une partie du code incluent cette ligne dans plusieurs endroitsCygwin gcc - erreur asm:

asm("movl temp, %esp"); 

Mais cela provoque une « référence non définie à` temp ' » erreur.

Cela ne pose aucun problème pour 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 est en train de faire?

Répondre

3

Vous devez changer la version Cygwin de

asm("movl temp, %esp"); 

à

asm("movl _temp, %esp"); 

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

Vous pouvez isoler le symbole dépendant du système préfixer simplement en disant gcc un nom spécifique à utiliser:

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

On évite ainsi une #if de quelque sorte et supprime une dépendance du système d'exploitation hôte, mais ajoute une dépendance du compilateur. Parlant des extensions du compilateur, certaines personnes écriraient (voir info as) 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 si elle mentait à propos dans un registre ou prend quelques instructions pour charger, et aussi pour éviter d'entrer en conflit avec vous, au cas où il utiliserait un registre que vous avez bousculé. Il a besoin de cela parce qu'un __asm__() n'est pas analysé par le compilateur.

Dans votre cas, vous semblez implémenter votre propre package de threads, et rien de tout cela ne compte vraiment. Gcc n'était pas sur le point d'utiliser% esp pour un calcul. (Mais pourquoi ne pas simplement utiliser pthreads ...?)

+0

Merci, mais cela me donne la même erreur: "référence non définie à' _temp '" – Scott

+0

Juste essayé __asm ​​__ (" movl _temp,% esp "); et tout fonctionne maintenant. – Scott

Questions connexes