【发布时间】:2021-03-11 08:59:50
【问题描述】:
我正在学习ARM内联汇编,并且对一个非常简单的功能感到困惑:将x的值分配给y(两者都是int类型),在arm32和arm64上为什么不同的clobber需要说明吗?
代码如下:
#include <arm_neon.h>
#include <stdio.h>
void asm_test()
{
int x = 10;
int y = 0;
#ifdef __aarch64__
asm volatile(
"mov %w[in], %w[out]"
: [out] "=r"(y)
: [in] "r"(x)
: "r0" // r0 not working, but r1 or x1 works
);
#else
asm volattile(
"mov %[in], %[out]"
: [out] "=r"(y)
: [in] "r"(x)
: "r0" // r0 works, but r1 not working
);
#endif
printf("y is %d\n", y);
}
int main() {
arm_test();
return 0;
}
在我的 android 手机上测试,对于 arm32,r0 生成正确的结果,但 r1 不会。对于 arm64,r1 或 x1 生成正确的结果,而 r0 不会。为什么在 arm32 和 arm64 上它们不同?具体规则是什么?在哪里可以找到?
【问题讨论】:
标签: gcc arm inline-assembly arm64