Cygwin gcc - ошибка asm: - PullRequest
       11

Cygwin gcc - ошибка asm:

2 голосов
/ 12 сентября 2009

У меня есть проект, написанный на C, который изначально делался в Linux, но теперь должен быть выполнен в Windows. Часть кода включает эту строку в нескольких местах

asm("movl temp, %esp");

Но это приводит к ошибке «неопределенная ссылка на« temp »».

Это без проблем компилируется в Linux с использованием компилятора gcc 4.3.2 (протестировано на другой машине), который является версией, которую я имею на Cygwin. Есть ли другой способ выполнить то, что делает эта линия?

1 Ответ

3 голосов
/ 12 сентября 2009

Вам нужно изменить версию 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 ...?)

...