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, там есть таблица с перечислением всех возможных ограничителей на операнды.

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


Ответ на: комментарий от 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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.