【问题标题】:Confusion about different clobber description for arm inline assembly对手臂内联装配的不同clobber描述感到困惑
【发布时间】: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,r1x1 生成正确的结果,而 r0 不会。为什么在 arm32 和 arm64 上它们不同?具体规则是什么?在哪里可以找到?

【问题讨论】:

    标签: gcc arm inline-assembly arm64


    【解决方案1】:

    ARM / AArch64 语法为mov dst, src

    只有当编译器碰巧为"=r" 输出和"r" 输入选择了相同的寄存器时,您的asm 语句才有效(或类似的,给定x 的额外副本浮动)。

    不同的clobbers只会扰乱编译器的寄存器分配选择。查看生成的asm(gcc -Shttps://godbolt.org/,尤其是-fverbose-asm。)

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

    【讨论】:

    • 谢谢!我的代码确实使用了错误的语法。修复它生成正确的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多