IAR 7.40编译器生成无效程序集

时间:2017-02-22 12:08:34

标签: assembly inline iar thumb

我有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(我没有拇指选项)。 你能帮我找到问题吗?

1 个答案:

答案 0 :(得分:2)

代码中MSR指令的语法不正确。 MSR指令要求状态寄存器的名称(在您的情况下为CPSR)应以应更新的字段为后缀。因此,如果您将mtcpsr宏更改为以下内容,则会获得预期的输出

#define mtcpsr(v)   __asm volatile(\
          "msr  CPSR_cxsf,%0\n"\
          : : "r" (v)\
        )

我只能猜测为什么编译器在手臂和拇指模式下表现不同,或者为什么它没有发出警告,但它可能是一个错误。

作为旁注,如果您只想启用中断,可以使用CPSIE if指令或__enable_interrupts()内在函数。