LINUX.ORG.RU

Ругается на асм-вставку

 , ,


0

2
    uint32_t start[14];
    size = 14;
    value = 0xAABBCCDD;

    asm volatile("cld\n\t"
                 "rep\n\t"
                 "stosl"
                 : /* no output registers */
                 : "c" (size), "a" (value), "D" (start)
                 : "%ecx", "%edi"
                 );

Ругается и не собирается:

main.c:44: ошибка: can't find a register in class 'CREG' while reloading 'asm' main.c:44: ошибка: 'asm' operand has impossible constraints

Как лечить? Хочу заполнить массив нужным интом. Для теста взял статичный, потом будет по указателю на char *.

★★

Последнее исправление: Klymedy (всего исправлений: 1)

Похоже, что здесь не нужны ограничения (наверное, первый раз читаю о них, поэтому не уверен). Тут предположили несовместимые изменения, а во втором комментарии указания на повтор выходных регистров. Комментарий похож на правду, так как если вписать, например, "%ebx", то компилируется. Но подходящей цитаты из документации с целью подтверждения найти не удалось.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от xaizek

Закомментил регистры. Работает, копирует, не падает. Спасибо.

sambist ★★
() автор топика
Ответ на: комментарий от xaizek

Но подходящей цитаты из документации с целью подтверждения найти не удалось.

Вот же http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

You may not write a clobber description in a way that overlaps with an input or output operand. … There is no way for you to specify that an input operand is modified without also specifying it as an output operand.

Так что если нужно указать, что будут изменены значения регистров используемых под входные операнды — надо их дублировать в списке выходных операндов, а не в списке изменённых

kim-roader ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.