Arm &引用;内联汇编程序指令没有唯一的大小;手臂拇指-2 IAR

Arm &引用;内联汇编程序指令没有唯一的大小;手臂拇指-2 IAR,arm,inline-assembly,iar,Arm,Inline Assembly,Iar,我对ARM的IAR编译器Cortex-M4的内联汇编有问题。这是我的问题的一个简单例子;将以下代码放入一个名为test.c的文件中 void irqrestore(int flags) { asm volatile( "tst %0, #1\n" "bne 1f\n" "cpsie i\n" "1:\n" : : "r" (flags) : "memory"); } 现在尝试使用IAR编译器编

我对ARM的IAR编译器Cortex-M4的内联汇编有问题。这是我的问题的一个简单例子;将以下代码放入一个名为test.c的文件中

void irqrestore(int flags)
{
  asm volatile(
      "tst    %0, #1\n"
      "bne    1f\n"
      "cpsie  i\n"
      "1:\n"
      :
      : "r" (flags)
      : "memory");
}
现在尝试使用IAR编译器编译:

$ iccarm --thumb test.c

   IAR ANSI C/C++ Compiler V6.40.2.53884/W32 for ARM
   Copyright 1999-2012 IAR Systems AB.

    asm volatile(
    ^
"C:\home\NuttX\nuttx\test.c",6  Error[Og010]: Inline assembler instruction
          does not have a unique size: "        bne    ?1_0"

Errors: 1
Warnings: none

你知道怎么回事吗?如果我将“bne 1f\n”更改为“bne 1\n”,它编译得很好,但我不确定它是否正确。

回答:从IAR,我被告知(并已确认)以下是正确的语法:

  "bne.n  1f\n"
或在上下文中:

void irqrestore(int flags)
{
  asm volatile(
      "tst    %0, #1\n"
      "bne.n    1f\n"
      "cpsie  i\n"
      "1:\n"
      :
      : "r" (flags)
      : "memory");
}

IAR编译器可能不支持as。给
1:
另一个名称,如
branch\u around\u int\u disable:
并使用
bne branch\u around\u intu disable
。如果IAR不理解
1f
,表示正向数字标签,那么您观察到的行为是有意义的。IAR内联汇编程序语法与GNU语法有很大不同。我认为它们根本不兼容。我相信这是一个相关的问题。安:不,像你建议的那样的名字不起作用,在bne指令之前移动标签时,两者都不起作用。RJP:查看了参考资料,但找不到任何适用于这种情况的信息。无论如何谢谢你@RJP,用于ARM的IAR工具的最新版本支持GNU风格的内联汇编程序。因此,IAR编译器的内联汇编程序无法确定分支长度。gcc-4.8使用
gcc-mthumb-O3-c foo.c-o foo.o
(和其他选项)处理此问题。无需指定特定的分支类型。