我需要将使用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的解决方法......
知道我的问题是什么吗?
答案 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}}(输入 - 输出)。