作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将一些使用 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... 的解决方法
知道我的问题是什么吗?
最佳答案
要读取一个特殊用途的寄存器,你应该使用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
(输入-输出)。
关于gcc - ARM7TDMI 不支持请求的专用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838256/
我是一名优秀的程序员,十分优秀!