Вам нужно изменить версию Cygwin с
asm("movl temp, %esp");
до
asm("movl _temp, %esp");
Да, это один и тот же компилятор и ассемблер, но они настроены по-разному для совместимости с хост-системой.
Вы можете изолировать системно-зависимый префикс символа, просто указав gcc конкретное имя для использования:
int *temp asm("localname");
...
__asm__("movl localname,%esp");
Это позволяет избежать какого-либо вида #if и удалить зависимость от ОС, но добавляет зависимость от компилятора. Говоря о расширениях компилятора, некоторые люди пишут (см. info as
) что-то вроде:
#ifdef __GNUC__
__asm__("movl %[newbase],%%esp"
:
: [newbase] "r,m" (temp)
: "%esp");
#else
#error haven't written this yet
#endif
Идея в том, что этот синтаксис позволяет компилятору помочь вам, найдя temp
, даже если он лежит в регистре или требует загрузки нескольких инструкций, а также, чтобы избежать конфликта с вами, в этом случае он использовал реестр, который вы забили. Это необходимо, потому что компилятор не обрабатывает простой код __asm__()
.
В вашем случае вы, похоже, реализуете свой собственный пакет потоков, и поэтому все это не имеет значения. Gcc не собирался использовать% esp для расчета. (Но почему бы просто не использовать pthreads ...?)