我有一些内联汇编。我希望GCC在选择要分配的GP寄存器方面有完全的自由。我还想在程序集内部使用漂亮的名称来便于理解未来的维护者。我想我之前(10年前)为ARM 5te做了这个,但现在我正在写一些AArch64代码时摸不着头脑。
在一个更简单的例子中,这就是我想要的:
uint32_t arg1 = 1, arg2 = 2, result;
asm volatile(
"add %result, %arg1, %arg2\n"
// Outputs:
: ???
// Inputs:
: ???
// Clobbered:
: ???
);
我认为我需要正确的伏都教去我上面写的" ???" 。
有可能吗?
答案 0 :(得分:5)
是
[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 */
);