GCC inline assembler

Тема в разделе "LANGS.C", создана пользователем Microedition, 15 июн 2009.

  1. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Привет всем.
    Помогите, пожалуйста с этим гребаным inline-ассембером в gcc. (MinGW)
    В общем, вот код:
    Код (Text):
    1. void *rtl_memcpy(void *dest, void *src, size_t size)
    2. {
    3.     __asm__(
    4.         "cld\n\t"
    5.         "rep\n\t"
    6.         "movsb"
    7.         ::"c"(size), "S"(src), "D"(dest)
    8.         :"cx","si","di");
    9.  
    10.     return dest;
    11. }
    При компиляции к ключами -O2 -c -o test.o test.c
    пишет:
    error: can't find a register in class `CREG' while reloading `asm'

    Если убрать ключ -O2, то все нормально компилируется (и работает).

    Собственно, вопрос: а почему с ключем -O2 не компилируется?
     
  2. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Кстати, этот код из Linux первой версии
    Только имя функции изменено
     
  3. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Хмм.. хотя нет. что с ключем оптимизации, что без - все равно не компилится.
     
  4. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    Гребаный AT&T синтаксис(сам его ненавижу).
    Вот почитай: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
     
  5. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    SmanxX1 так уже читал. Или что-то недочитал?
     
  6. herm1t

    herm1t New Member

    Публикаций:
    0
    Регистрация:
    1 янв 2004
    Сообщения:
    22
    Попробуй убрать clobber description и прочитать info gcc (5.34)
     
  7. the_bishop

    the_bishop New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    1
    to Microedition
    Если для Вас все еще актуален данный вопрос, то следующий код компилируется успешно*:

    Код (Text):
    1. typedef unsigned int    size_t;
    2.  
    3. void *rtl_memncpy(void *dest, void *src, size_t size)
    4. {
    5.     __asm__ __volatile__ (
    6.         "cld\n\t"
    7.         "rep\n\t"
    8.         "movsb"
    9.         :: "c" (size), "S" (src), "D" (dest));
    10.     return dest;
    11. }
    * MinGW, gcc-3.4.5
     
  8. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    the_bishop Да, спасибо.