带有内联汇编代码的 %hi() 和 %lo() 编译错误

标签 c gcc assembly

我有下面的内联汇编代码。我在存在 %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/

相关文章:

c - 显示5乘5排列的25个数字

c - 在 C 中使用 fgets 的段错误

c - gcc 为什么以及如何发出 gets() 警告?

c - 在 gcc 编译器之前构建 binutils

打印数组所有元素的汇编代码

C 中的带有回文检查器的字符指针

带指针的C题

c - 在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器

c++ - 如何在 NaCl 中为 ARM 提供不同的实现

assembly - 如何在汇编 8086 中使用带符号整数的 ADD 指令?