手臂霓虹灯内联汇编器出现此问题:
char s[20];
printf("enter input\n");
scanf_s("%s", s); //exception occurs here
strcat_s(s, "$");
n = strlen(s);
指令是使用clang编译的,但是GCC会产生以下错误:(如果我使用mov v5.4s, v8.4s
,就可以了):
mov v5.16b,v8.16b
我想知道是什么原因导致GCC中的错误。我认为/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s: Assembler
messages:
/var/folders/ln/2jr6sq855753h7fjrg_g6hm80000gq/T//ccUbsZid.s:38355:
Error: operand mismatch -- `mov v5.4s,v8.4s'
//ccUbsZid.s:38355:Info:did you mean this?
//ccUbsZid.s:38355:Info:mov v5.8b,v8.8b
//ccUbsZid.s:38355:Info:other valid variant(s):
//ccUbsZid.s:38355:Info:mov v5.16b,v8.16b
等于copy。
答案 0 :(得分:3)
这是一个简单的整个寄存器副本,因此元素类型无关。
汇编指令实际上仅支持8b
和16b
指定双精度或四级寄存器,因此,在这种情况下,尽管在某种程度上会引起误解,但GCC在Clang更宽容的情况下是正确的。 / p>
老实说,我不喜欢aarch64
汇编语法。
在aarch32
上,数据类型由指令后缀指定,而由必须附加到所有操作数寄存器的aarch64
上的寄存器后缀指定。
这种新语法不仅令人讨厌,而且会引起问题。
在这种情况下,在vmov q5, q8
上只需一个简单的aarch32
就足够了。