Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c文件中内联汇编代码的编译错误,可能是分支错误_C_Gcc_Assembly - Fatal编程技术网

c文件中内联汇编代码的编译错误,可能是分支错误

c文件中内联汇编代码的编译错误,可能是分支错误,c,gcc,assembly,C,Gcc,Assembly,我有下面的代码。当我试图编译代码片段后提到的给出错误时 void func() __asm__ ( "mfspr 12, 1017;" "rotrwi 12,12,%0;" "andi. 11, 12, %1;" "beq done;" "3:;" "mfspr 12, 1017;" "andi. 11, 12, %2;" "bne 3b;" "ori 1

我有下面的代码。当我试图编译代码片段后提到的给出错误时

void func()
  __asm__ (
    "mfspr     12, 1017;"
    "rotrwi    12,12,%0;"
    "andi.     11, 12, %1;"
    "beq       done;"
"3:;"
    "mfspr     12, 1017;"
    "andi.     11, 12, %2;"
    "bne       3b;"
    "ori       12, 12, %2;"
    "mtspr     1017, 12;"
    "isync;"
"3:;"
    "mfspr     12, 1017;"
    "andi.     11, 12, %2;"
    "bne       3b;"
"done:;"
    ::"r"(31), "r"(1), "r"(2048));     
}
错误:

{standard input}: Assembler messages:
{standard input}:3607: Error: bad expression
{standard input}:3607: Error: missing ')'
{standard input}:3607: Error: missing ')'
{standard input}:3607: Error: syntax error; found `r', expected `,'
{standard input}:3607: Error: junk at end of line: `r9)!31)&((%r9)|31),0,31'
我认为我正在做的分支有一些问题,但我不确定到底出了什么问题。有人能帮我修一下吗?

试试这个:

  void func()
    __asm__ (
      "mfspr     12, 1017\n"
      "rotrwi    12,12,%0\n"
      "andi.     11, 12, %1\n"
      "beq       done\n"
  "3:\n"
      "mfspr     12, 1017\n"
      "andi.     11, 12, %2\n"
      "bne       3b\n"
      "ori       12, 12, %2\n"
      "mtspr     1017, 12\n"
      "isync\n"
  "3:\n"
      "mfspr     12, 1017\n"
      "andi.     11, 12, %2\n"
      "bne       3b\n"
  "done:\n"
      ::"i"(31), "i"(1), "i"(2048));
  }
更改为
\n
,以便更容易看出哪一行是错误的


“r”(N)
更改为
“i”(N)
,用于使用立即数而不是寄存器的指令。

您编译的是哪种体系结构?请尝试在编译器中使用--save temps选项来获取编译器生成的汇编代码,然后在此处发布相关部分。您应该会在第3607行看到一些奇怪的东西…我正在为e500mc编译。从保存时间我在3607得到了这个…MFSPR121017;rotrwi 12,12%,r9;安迪。11,12%,r10;beq完成;3b:;MFSPR121017;安迪。11,12%,r8;bne3b;ori 12,12%,r8;mtspr 1017,12;isync;3b:;MFSPR121017;安迪。11,12%,r8;bne3b;完成:;。也许汇编器不喜欢所有的东西都在一条线上。尝试将每个“;”替换为“\n”。
rotrwi
接受操作数
寄存器、寄存器、立即数
。您尝试了
immediate、immediate、register
,但这是无效的。既然您还是传入了immediate,那么只需将
r
约束更改为
i