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
?