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]
这是修改后的整个示例(更改了程序集变量的大小写只是为了说明它们不必相同):
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 */
);
我有一些内联汇编。我希望 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]
这是修改后的整个示例(更改了程序集变量的大小写只是为了说明它们不必相同):
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 */
);