Warm tip: This article is reproduced from serverfault.com, please click

gcc-对手臂直插式装配的不同罩子描述的困惑

(gcc - Confusion about different clobber description for arm inline assembly)

发布于 2020-11-29 03:02:13

我正在学习ARM内联汇编,并且对一个非常简单的功能感到困惑:在arm32和arm64上将xto的值y(均为int类型)赋值,为什么需要使用不同的内容描述?

这是代码:

#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上它们不同?具体的规则是什么?在哪里可以找到?

Questioner
ChrisZZ
Viewed
11
Peter Cordes 2020-11-29 11:25:18

ARM / AArch64语法为mov dst, src

仅当编译器碰巧为"=r"输出和"r"输入选择相同的寄存器(或类似的东西,给定额外的x浮动副本)时,你的asm语句才起作用

不同的Clobber只会干扰编译器的寄存器分配选择。 查看生成的asm(gcc -S或在https://godbolt.org/上,尤其是使用-fverbose-asm。)

通过使约束与模板字符串中的指令不匹配而导致的未定义行为仍然可以起作用。永远不要仅仅因为它与一组编译器选项和周围的代码一起工作就认为asm语句是正确的。