【问题标题】:ARM7TDMI does not support requested special purpose registerARM7TDMI 不支持请求的专用寄存器
【发布时间】:2012-02-08 22:18:33
【问题描述】:

我需要将一些使用 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...的解决方法...

知道我的问题是什么吗?

【问题讨论】:

  • 你是用 thumb 还是 arm 指令集编译的? Thumb 模式可能对访问寄存器有一些限制,因此您可以尝试 arm 指令。

标签: gcc assembly arm


【解决方案1】:

要读取一个特殊用途的寄存器,你应该使用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(输入-输出)。

【讨论】:

  • 感谢代码现在编译得很好。我会仔细看看你的变化!
  • 不客气。顺便说一句,如果你认为答案很好,你可以投票,除了接受它;)
猜你喜欢
  • 2020-07-20
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2022-09-27
相关资源
最近更新 更多