首页 > 解决方案 > 值大小与约束和修饰符指定的寄存器大小不匹配

问题描述

在 arm64 中,编译下面的内联程序集会导致以下警告:

值大小与约束和修饰符 [-Wasm-operand-widths] 指定的寄存器大小不匹配。

这是因为 arm64 的寄存器是 64 位的。

int a = 1;
int b = 2;
asm volatile(
   "add %[a], %[a], %[b]  \n"
   :
   [a] "+r"(a)
   :
   [b] "r"(b)
   :
    );

并且clang给出修复建议,使用约束修饰符“w”。

标签: armclanginline-assemblyarm64

解决方案


这个警告的关键是无与伦比的。在 arm64 中,寄存器是 64 位宽,但 int/float 变量是 32 位。如果类型是 double/int64_t 或变量是指针,则不会引起警告。所以,你可以试试这个方法。


推荐阅读