Ошибка компиляции ассемблера GNU 'недопустимый операнд во встроенном asm'

Я пытаюсь скомпилировать некоторый ассемблерный код с использованием ассемблера GNU с целью в качестве платформы ARM. Но появляются ошибки. Я не знаком с грамматикой ассемблера.

Кто-нибудь может сказать мне, как обойти эту ошибку?

error: invalid operand in inline asm: 'str  ${2:Q}, $0  
str  ${2:R}, $1

Встроенный код asm, вызвавший эту ошибку компиляции, находится здесь:

static av_always_inline void AV_WN64(void *p, uint64_t v)
{
    __asm__ ("str  %Q2, %0  \n\t"
         "str  %R2, %1  \n\t"
         : "=m"(*(uint32_t*)p), "=m"(*((uint32_t*)p+1))
         : "r"(v));
}

person ciphor    schedule 29.01.2012    source источник
comment
пожалуйста, опубликуйте исходную строку, на которую он также жалуется.   -  person jcopenha    schedule 29.01.2012
comment
Встроенный код asm берется из ffmpeg, libavutil / arm / intreadwrite.h. Добавляю код выше.   -  person ciphor    schedule 29.01.2012


Ответы (1)


Пытаться:

__asm__ ("strd [%0], %1\n\t" : : "r"(p), "r"(v) : "memory");

Компилятор должен понимать, что v как 64-битное количество требует регистровой пары.

person FrankH.    schedule 30.01.2012