将代码从GCC移植到LLVM/CLANG时内联汇编传参失败求助
问题分析与解决
错误根源
你遇到的括号缺失错误是编译器解析内联汇编时的误报,真正问题在于:
你的内联汇编使用了ARM架构的指令(mov r3, %0中的r3是ARM专属寄存器),但你使用的是原生GCC(默认编译宿主架构代码,比如x86/x86_64),编译器无法识别ARM指令,导致语法解析逻辑混乱,抛出了错误的提示信息。
解决方法
根据你的实际需求选择对应方案:
方案1:编译ARM架构代码
如果你的目标平台是ARM,需要使用ARM交叉编译器编译,而非原生GCC:
# 示例:使用ARM交叉编译器(需提前安装对应工具链) arm-linux-gnueabi-gcc -c ajay.c
方案2:适配x86/x86_64架构
如果是在x86/x86_64环境下测试内联汇编,修改代码为对应架构的指令:
#define TEST_VALUE 0x1234 // x86架构版本 __asm__("mov eax, %0" : : "r" (TEST_VALUE)); // 或者x86_64架构版本 // __asm__("mov rax, %0" : : "r" (TEST_VALUE));
修改后用原生GCC编译即可正常通过。
补充说明
GCC内联汇编的语法框架是通用的,但汇编指令本身是架构相关的。编写内联汇编时,必须确保指令与编译目标架构一致,否则会触发各种语法解析错误(甚至像这样的误报)。
内容的提问来源于stack exchange,提问作者Ajay Garg
相关产品推荐
相关产品推荐

