我有arm cortex-R5的内联汇编代码
#include <stdio.h>
#define mtcpsr(v) __asm volatile(\
"msr cpsr,%0\n"\
: : "r" (v)\
)
int mfcpsr (void)
{
int rval;
asm("mrs %0, cpsr" : "=r"(rval));
return rval;
}
void main(void)
{
/*
* Enable interrupts in the ARM
*/
mtcpsr(mfcpsr() & ~ ((0x80U) & (0x40U | 0x80U)));
}
通过将--cpu_mode = thumb作为编译器标志设置为在Thumb模式下使用IAR 7.40编译器进行编译时,生成汇编为
`.text6`:
mfcpsr:
0xfffc040c: 0xf3ef 0x8000 MRS R0, APSR
0xfffc0410: 0x4770 BX LR
0xfffc0412: 0x0000 MOVS R0, R0
main:
0xfffc0414: 0xb580 PUSH {R7, LR}
0xfffc0416: 0xf7ff 0xfff9 BL mfcpsr ; 0xfffc040c
0xfffc041a: 0xf020 0x0080 BIC.W R0, R0, #128 ; 0x80
0xfffc041e: 0xf380 0x8000 MSR ??-0-0, R0
0xfffc0422: 0xbd01 POP {R0, PC}
MSR ?? - 0-0,R0是无效的程序集。 我期待它作为MSR CPSR_fc,R0(我没有拇指选项)。 你能帮我找到问题吗?
答案 0 :(得分:2)
代码中MSR指令的语法不正确。 MSR指令要求状态寄存器的名称(在您的情况下为CPSR)应以应更新的字段为后缀。因此,如果您将mtcpsr宏更改为以下内容,则会获得预期的输出
#define mtcpsr(v) __asm volatile(\
"msr CPSR_cxsf,%0\n"\
: : "r" (v)\
)
我只能猜测为什么编译器在手臂和拇指模式下表现不同,或者为什么它没有发出警告,但它可能是一个错误。
作为旁注,如果您只想启用中断,可以使用CPSIE if
指令或__enable_interrupts()
内在函数。