带有内联汇编代码

时间:2015-05-14 13:02:52

标签: c gcc assembly

我有下面的内联汇编代码。我收到编译错误"错误:无效' asm':%-letter"之后缺少操作数在%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));
}

在进一步分析中,我发现只要找到%符号,内联汇编就需要一个数字(%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?

1 个答案:

答案 0 :(得分:1)

GNU AS不支持%hi()%lo()。相反,它在符号上使用@h@l后缀来表示高低部分。另请注意,您不能将其与寄存器操作数一起使用,并使用r约束。