Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在androidndk项目中使用内联ARM-asm_C++_Assembly_Android Ndk_Arm - Fatal编程技术网

C++ 在androidndk项目中使用内联ARM-asm

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编译器

我正在使用Android NDK做一个小项目,我必须为ARM架构插入一些asm代码

除了asm之外的一切都很好,但是asm代码告诉我

操作数1应为整数寄存器

当你编写简单的代码时,比如

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中遇到的错误之一。