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 ...?)
Merci, mais cela me donne la même erreur: "référence non définie à' _temp '" – Scott
Juste essayé __asm __ (" movl _temp,% esp "); et tout fonctionne maintenant. – Scott