C++ 在androidndk项目中使用内联ARM-asm
我正在使用Android NDK做一个小项目,我必须为ARM架构插入一些asm代码 除了asm之外的一切都很好,但是asm代码告诉我 操作数1应为整数寄存器 当你编写简单的代码时,比如C++ 在androidndk项目中使用内联ARM-asm,c++,assembly,android-ndk,arm,C++,Assembly,Android Ndk,Arm,我正在使用Android NDK做一个小项目,我必须为ARM架构插入一些asm代码 除了asm之外的一切都很好,但是asm代码告诉我 操作数1应为整数寄存器 当你编写简单的代码时,比如 asm(“mov r0,r0”) 那么,问题是什么?我的计算机是否正在尝试编译x86_64而不是ARM?如果是,我应该如何改变 此外,我还尝试了x86_64等效的arm(“mov-rax,rax”)但错误是相同的。所有的C源代码都是针对应用程序ABI中提到的每个体系结构编译的。所以,毫无疑问,为什么x64编译器
asm(“mov r0,r0”)代码>
那么,问题是什么?我的计算机是否正在尝试编译x86_64而不是ARM?如果是,我应该如何改变
此外,我还尝试了x86_64等效的arm(“mov-rax,rax”)代码>但错误是相同的。所有的C源代码都是针对应用程序ABI
中提到的每个体系结构编译的。所以,毫无疑问,为什么x64编译器没有卸载ARM程序集,反之亦然
不要使用内联程序集。最好将所有汇编内容放入专用的*.S
源代码中,这些源代码将由处理,就像一样(NDK工具链有它)。程序集源应放在适当的文件夹中,如arch-arm/
,arch-x86/
。然后您应该将它们正确地添加到Android.mk中:
LOCAL_SRC_FILES := arch-$(TARGET_ARCH)/my_awesome_code.S
$(TARGET\u ARCH)
有助于以正确、无痛的方式解析到适当源的路径
另外,独立汇编比内联汇编提供了更多的功能。这是避免使用内联程序集的另一个原因。此外,内联汇编语法因编译器而异,因为它不是标准的一部分 您为哪个ABI构建?试试mov x0,x0
。如果它没有给出错误,那么您的问题是您正在使用32位ARM汇编语言和64位ARM工具链。您需要切换到32位工具或64位汇编语言。顺便说一下,您应该调查是否真的需要使用内联汇编。很难做到正确。查看是否不能使用intrinsic来执行所需的操作。针对x86时,默认asm语法为AT&t样式,因此asm(“mov%rax,%rax”)代码>应作为禁止操作。使用gcc-S
生成asm输出文件。在代码周围查找#APP
/#NO#u APP
,并查看它是否与周围编译器生成的asm相似。e、 g.Re:@Ross的最后一点,见。另请看一个例子,说明出错是多么容易,一个顽固的OP拒绝相信他的asm是不安全的,因为它恰好与他当前的周围代码一起工作。@RossRidge如果我把mov x0,x0
放进去,它说“mov”的内存引用太多了,即使这样做,拥有`.text.global MyAsmFunction.type MyAsmFunction:mov x0,#2`作为我的.s
文件,按照你说的做,并拥有extern“C”void MyAsmFunction()代码>它输出错误,期望操作数在“,”之后;什么都没有,这是我在内联asm中遇到的错误之一。