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

Gcc ARM7TDMI不支持请求的专用寄存器,gcc,assembly,arm,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(

我需要将一些使用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
根据这篇文章(我是在windows上构建的,但问题可能是一样的?)我已经在使用不使用-march=all的解决方法了


知道我的问题是什么吗?

要读取专用寄存器,应使用
mrs
说明:

extern内联void ngEnable(void)
{
int tmp;
挥发性物质(
mrs%[tmp],CPSR\n\t
“bic%[tmp],%[tmp],#0xC0\n\t”
“msr CPSR_c,%[tmp]”
:[tmp]“=r”(tmp)
);
}
在这个修复之后,代码对我来说运行得很好


此外,由于您不使用
tmp
的值,而且实际上您甚至没有设置它,因此您应该使用
=r
(仅输出)而不是
+r
(输入-输出)。

您是使用thumb还是arm指令集编译它的?Thumb模式在访问寄存器时可能有一些限制,因此您可以尝试arm指令。感谢代码,现在编译很好。我会仔细看看你的变化!不客气。顺便说一句,如果你认为答案是好的,除了接受它之外,你还可以投它一票;)