IAR 7.40 编译器生成无效程序集
IAR 7.40 compiler generating invalid assembly
我有一个用于 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)));
}
当使用 IAR 7.40 编译器在 Thumb 模式下通过将 --cpu_mode=thumb 设置为编译器标志进行编译时,生成的程序集为
`.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(我得到这个没有拇指选项)。
大家能帮我定位一下问题吗
您代码中 MSR 指令的语法不正确。 MSR 指令要求状态寄存器的名称(在您的情况下为 CPSR)应以应更新的字段为后缀。因此,如果您将 mtcpsr 宏更改为以下内容,您将获得预期的输出
#define mtcpsr(v) __asm volatile(\
"msr CPSR_cxsf,%0\n"\
: : "r" (v)\
)
我只能猜测为什么编译器在 arm 和 thumb 模式下表现不同或者为什么它不发出警告但它可能是一个错误。
附带说明一下,如果您只想启用中断,可以使用 CPSIE if
指令或 __enable_interrupts()
内部函数。
我有一个用于 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)));
}
当使用 IAR 7.40 编译器在 Thumb 模式下通过将 --cpu_mode=thumb 设置为编译器标志进行编译时,生成的程序集为
`.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(我得到这个没有拇指选项)。 大家能帮我定位一下问题吗
您代码中 MSR 指令的语法不正确。 MSR 指令要求状态寄存器的名称(在您的情况下为 CPSR)应以应更新的字段为后缀。因此,如果您将 mtcpsr 宏更改为以下内容,您将获得预期的输出
#define mtcpsr(v) __asm volatile(\
"msr CPSR_cxsf,%0\n"\
: : "r" (v)\
)
我只能猜测为什么编译器在 arm 和 thumb 模式下表现不同或者为什么它不发出警告但它可能是一个错误。
附带说明一下,如果您只想启用中断,可以使用 CPSIE if
指令或 __enable_interrupts()
内部函数。