我有下面的内联汇编代码。我在存在 %hi、%lo 的每一行收到编译错误“错误:无效的‘asm’:%-字母后缺少操作数”。
void func()
{
__asm__ (
"lis %%r4, %hi(%0);"
"ori %%r4,%%r4,%lo(%0);"
"stw r3, 0(%%r4);"
"lis %%r4, %hi(%0);"
"ori %%r4,%%r4,%lo(%0);"
"lis %%r3, %hi(%1);"
"ori %%r3,%%r3,%lo(%1);"
"stw %%r3, 0(%%r4);"
::"r"(var1), "r"(var2));
}
在进一步分析中,我发现内联汇编在发现 % 符号时需要一个数字(%0、%1...)。所以将所有 % 更改为 %%(这只是一个盲目射击),然后最终得到许多如下所示的结果。
{standard input}: Assembler messages:
{standard input}:3394: Error: bad expression
{standard input}:3394: Error: syntax error; found `h', expected `,'
{standard input}:3394: Error: junk at end of line: `hi(%r9)'
{standard input}:3394: Error: bad expression
{standard input}:3394: Error: syntax error; found `l', expected `,'
{standard input}:3394: Error: junk at end of line: `lo(%r9)'
{standard input}:3394: Error: bad expression
经过大量努力,我发现如果在内联汇编代码中使用 %hi() 或 %lo 会出现一些问题。如果我从我的代码中删除 %hi 和 %lo,它就会被编译。谁能建议我如何在内联汇编代码中使用 %hi() 和 %lo?
最佳答案
GNU AS 不支持 %hi()
和 %lo()
。相反,它在符号上使用 @h
和 @l
后缀来表示高低部分。另请注意,您不能将其与寄存器操作数一起使用,并且您使用了 r
约束。
关于带有内联汇编代码的 %hi() 和 %lo() 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30238118/