LINUX.ORG.RU

[GCC][Thumb1][ASM] Проблема с inline ассемблером


0

0

Пробую сделать ассемблерную вставку, но он не компилируется.

Такой код:

void main()
{

  unsigned char x = 200;

  asm("mov r7,%[value]"
      :
      : [value] "I" (x)
      );

}

Сообщение об ошибке:

test.c: In function ‘main’:
test.c:5: warning: return type of ‘main’ is not ‘int’
test.c:9: warning: asm operand 0 probably doesn’t match constraints
test.c:9: error: impossible constraint in ‘asm’
make: *** [bin] Error 1

Компилирую под thumb1 вот такой командой:

arm-elf-gcc -mcpu=arm7tdmi -mthumb -O0 -msoft-float -I/usr/arm-elf/include -c test.c

Версия gcc : arm-elf-gcc (GCC) 4.3.2

Список ограничений для inline assembler взял здесь http://www.ethernut.de/en/documents/arm-inline-asm.html, там есть таблица с перечислением всех возможных ограничителей на операнды.

Прошу подсказать что не так

Задача : занести в регистр значение из переменной(immediate)

recon88 ()

мне недавно пришлось использовать такую штуку:

 uint32_t p;
asm volatile("str sp, %[result]\n"
:[result] "=m" (p)
);

в твоём случае будет похоже. Используй нужный констраинт.

http://www.ethernut.de/en/documents/arm-inline-asm.html

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

>Используй нужный констраинт.
собственно, об этом он (gcc) тебе и говорит:

test.c:9: error: impossible constraint in ‘asm’

тебе нужен «m», по всей видимости..

xydo ★★ ()
Ответ на: комментарий от recon88

занести в регистр значение из переменной

unsigned char x = 200;

asm ( assembler template 
           : output operands                  /* optional */
           : "r" (x)                  /* optional */
           : list of clobbered registers      /* optional */
           );

После этого значение _уже_ в регистре и ты им можешь пользоваться, отдельной инструкции не нужно.

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

Спасибо! Вчера нашел это, но все не было времени отписаться

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