Gcc 关于arm内联装配的不同clobber描述的混淆
我正在学习ARM内联汇编,对一个非常简单的函数感到困惑:将Gcc 关于arm内联装配的不同clobber描述的混淆,gcc,arm,inline-assembly,arm64,Gcc,Arm,Inline Assembly,Arm64,我正在学习ARM内联汇编,对一个非常简单的函数感到困惑:将x的值分配给y(两者都是int类型),在arm32和arm64上为什么需要不同的clobber描述? 代码如下: #包括 #包括 无效asm_测试() { int x=10; int y=0; #ifdef__aarch64__ 挥发性物质( mov%w[in],%w[out] :[out]“=r”(y) :[in]“r”(x) :“r0”//r0不工作,但r1或x1工作 ); #否则 阿斯姆沃拉提尔酒店( “mov%[输入],%[输出]
x
的值分配给y
(两者都是int
类型),在arm32和arm64上为什么需要不同的clobber描述?
代码如下:
#包括
#包括
无效asm_测试()
{
int x=10;
int y=0;
#ifdef__aarch64__
挥发性物质(
mov%w[in],%w[out]
:[out]“=r”(y)
:[in]“r”(x)
:“r0”//r0不工作,但r1或x1工作
);
#否则
阿斯姆沃拉提尔酒店(
“mov%[输入],%[输出]”
:[out]“=r”(y)
:[in]“r”(x)
:“r0”//r0工作,但r1不工作
);
#恩迪夫
printf(“y是%d\n”,y);
}
int main(){
arm_测试();
返回0;
}
在我的android手机上测试,对于arm32,
r0
生成正确的结果,但r1
不会。对于arm64,r1
或x1
生成正确的结果,而r0
不会。为什么在arm32和arm64上它们是不同的?具体的规则是什么?在哪里可以找到它?ARM/AArch64语法是mov-dst,src
只有当编译器碰巧为“=r”
输出和“r”
输入选择了相同的寄存器时,asm语句才起作用(或者类似的情况,如果有额外的x
浮动副本)
不同的缓冲区只会干扰编译器的寄存器分配选择。查看生成的asm(gcc-s
或on,尤其是使用-fverbose asm
)
由于获取与模板字符串中的指令不匹配的约束而导致的未定义行为仍然可以正常工作;不要仅仅因为asm语句使用一组编译器选项和周围的代码就认为它是正确的。ARM/AArch64语法是
mov-dst,src
只有当编译器碰巧为“=r”
输出和“r”
输入选择了相同的寄存器时,asm语句才起作用(或者类似的情况,如果有额外的x
浮动副本)
不同的缓冲区只会干扰编译器的寄存器分配选择。查看生成的asm(gcc-s
或on,尤其是使用-fverbose asm
)
由于获取与模板字符串中的指令不匹配的约束而导致的未定义行为仍然可以正常工作;不要仅仅因为asm语句使用一组编译器选项和周围的代码就认为它是正确的。谢谢!我的代码使用了错误的语法。修正后会产生正确的结果。谢谢!我的代码使用了错误的语法。修复它以生成正确的结果。