ARM7TDMI不支持请求的特殊目的寄存器。

3

我需要将一些用ARMASM编译的代码转换为gcc(code sourcery 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

根据这篇帖子的内容(我是在Windows上构建的,但问题可能相同?),我已经使用了不使用-march=all的解决方法...

你有什么想法吗?


你是用Thumb指令集还是ARM指令集来编译它?Thumb模式在访问寄存器方面可能有一些限制,所以你可以尝试使用ARM指令。 - Zuljin
1个回答

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(仅输出)而不是+r(输入输出)。


谢谢,代码编译成功了。我会仔细看一下你的更改! - Martin Allard
不用谢。顺便说一下,如果你认为答案很好,除了接受答案外,你也可以给它点个赞 ;) - user784668

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接