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() 内部函数。