GCC 内联汇编中的寄存器可以使用漂亮的变量名吗?

Can pretty variable names be used for registers in GCC inline assembly?

我有一些内联汇编。我希望 GCC 在选择要分配的 GP 寄存器方面拥有完全的自由。我还想为程序集内的寄存器使用漂亮的名称,以便于未来的维护者理解。我想我以前(10 多年前)为 ARM 5te 做过这个,但现在在编写一些 AArch64 代码时摸不着头脑。

在一个更简单的例子中,这就是我想要的:

uint32_t arg1 = 1, arg2 = 2, result;

asm volatile(
  "add  %result, %arg1, %arg2\n"
  // Outputs:
  : ???
  // Inputs:
  : ???
  // Clobbered:
  : ???
);

我想我需要正确的巫术才能到达上面写的 "???"

可能吗?

是的。

[arg1] "r" (arg1)

例如。这两个名称(上面的 [arg1](arg1))可以不同。

在汇编代码中,您将使用:

add %[result], %[arg1], %[arg2]

Documentation link.

这是修改后的整个示例(更改了程序集变量的大小写只是为了说明它们不必相同):

uint32_t arg1 = 1, arg2 = 2, result;

asm volatile(
  "add  %[RESULT], %[ARG1], %[ARG2]\n"
  : [RESULT]"=r"(result)             /* output */
  : [ARG1]"r"(arg1), [ARG2]"r"(arg2) /* inputs */
  :                                  /* no clobbers */
);