ARM7TDMI不支持请求的专用寄存器

时间:2012-01-12 16:09:09

标签: gcc assembly arm

我需要将使用ARMASM编译的一些代码转换为gcc(代码源代码GCC-4.6.2 eabi)。我使用ARM7TDMI,我的编译参数是

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

(我省略了-I和-D参数......)

在我的一个文件中,我有这个不能编译的代码:

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: trouble building linux-linaro-3.0-2011.08-0(我建立在Windows上,但问题可能是一样的?)我已经在使用不使用-march = all的解决方法......

知道我的问题是什么吗?

1 个答案:

答案 0 :(得分:3)

要阅读专用寄存器,您应该使用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(仅输出)而不是{ {1}}(输入 - 输出)。