C-与Inline Assembly代码的%HI()和%LO()的汇编错误



我的在线装配代码下面。我遇到了一个汇编错误"错误:无效的'asm':在%hi,%lo出现的每一行之后丢失的操作数编号。

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));
}

在进一步的分析中,我发现Inline Assembly每当找到%符号时都会期望一个数字(%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不支持%hi()%lo()。相反,它在符号上使用@h@l后缀来表示高和低零件。另请注意,您不能将其用于寄存器操作数,并且使用了r约束。

最新更新