ARM7TDMI не поддерживает запрошенный регистр специального назначения - PullRequest
3 голосов
/ 12 января 2012

Мне нужно преобразовать некоторый код, скомпилированный с помощью ARMASM, в gcc (исходный код GCC-4.6.2 eabi).Я использую ARM7TDMI, и мои аргументы компиляции

arm-none-eabi-gcc -c -march=armv4t -mcpu=arm7tdmi -mlittle-endian -g -O1 

(я пропустил аргументы -I и -D ...)

В одном из моих файлов у меня есть этот код, который выиграл 't compile:

extern inline void ngEnable( void)
{
    int tmp;
    asm volatile(
        "msr %[tmp], CPSR\n\t"
        "bic %[tmp], %[tmp], #0xC0\n\t"
        "msr CPSR_c, %[tmp]"
        : [tmp] "+r" (tmp)
    );
}

Я получаю эту ошибку:

C:\DOCUME~1\MALLAR~1.ISC\LOCALS~1\Temp\ccA9cCgQ.s: Assembler messages:
C:\DOCUME~1\MALLAR~1.ISC\LOCALS~1\Temp\ccA9cCgQ.s:267: Error: selected processor does not support requested special purpose register -- `msr r3,CPSR'
make: *** [cdbini.o] Error 1

согласно этому сообщению Re: проблема сборки linux-linaro-3.0-2011.08-0 (Я строю на Windows, но проблема может быть та же?) Я уже использую обходной путь не использования -march = all ...

Есть идеи, что моя проблема?

1 Ответ

3 голосов
/ 12 января 2012

Чтобы прочитать регистр специального назначения, вы должны использовать инструкцию mrs:

extern inline void ngEnable(void)
{
  int tmp;
  asm volatile(
    "mrs %[tmp], CPSR\n\t"
    "bic %[tmp], %[tmp], #0xC0\n\t"
    "msr CPSR_c, %[tmp]"
    : [tmp] "=r" (tmp)
  );
}

После этого исправления код работает для меня очень хорошо.

Кроме того, так как выне используйте значение tmp, и вы даже не устанавливаете его, вы должны использовать =r (только вывод) вместо +r (ввод-вывод).

...