【问题标题】:Using inline ARM asm in Android NDK project在 Android NDK 项目中使用内联 ARM asm
【发布时间】:2016-12-29 07:25:27
【问题描述】:

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

除了 asm 之外的所有东西都可以正常工作,但是 asm 代码告诉我

操作数 1 应该是一个整数寄存器

在编译类似的简单代码时

asm("mov r0, r0");


那么,问题出在哪里?我的计算机是否试图为 x86_64 而不是 ARM 编译?如果是这样,我应该如何改变它?

另外,我试过 x86_64 等效的 arm("mov rax, rax");,但错误是一样的。

【问题讨论】:

  • 您正在为哪些 ABI 构建?
  • 试试mov x0, x0。如果它没有给出错误,那么您的问题是您使用 32 位 ARM 汇编语言和 64 位 ARM 工具链。您需要切换到 32 位工具或 64 位汇编语言。顺便说一句,您应该调查一下您是否真的需要使用内联汇编。很难做对。看看你是否不能使用内在函数来做你想做的事。
  • 当面向 x86 时,默认的 asm 语法是 AT&T 样式,所以 asm("mov %rax, %rax"); 应该作为空操作。使用gcc -S 生成一个asm 输出文件。在您的代码周围寻找#APP / #NO_APP,看看它是否看起来像周围的编译器生成的asm。例如godbolt.org/g/h8JIEy
  • 回复:@Ross 的最后一点,请参阅gcc.gnu.org/wiki/DontUseInlineAsm。另请参阅 my answer on this Q&A 以了解错误是多么容易的示例,以及一个顽固的 OP,拒绝相信他的 asm 是不安全的,因为它恰好可以与他当前的周围代码一起使用。
  • @RossRidge 如果我输入mov x0, x0,它会说对于`mov'的内存引用过多

标签: c++ assembly android-ndk arm


【解决方案1】:

您的所有 C 源代码都是针对您的 APP_ABI 中提到的每个架构编译的。因此,没有必要怀疑为什么 x64 编译器不理解 ARM 程序集,反之亦然。

不要使用内联汇编。最好将所有组装内容放入专用的*.S 源中,这将由as 处理(NDK 工具链有它)。该程序集源应放置在适当的文件夹中,例如arch-arm/arch-x86/。然后你应该将它们正确添加到Android.mk

LOCAL_SRC_FILES := arch-$(TARGET_ARCH)/my_awesome_code.S

$(TARGET_ARCH) 有助于以正确无痛的方式解决到适当来源的路径。

附:与内联程序集相比,独立程序集还为您提供了更多功能。这是避免使用内联汇编的另一个原因。此外,编译器与编译器的内联汇编语法不同,因为它不是标准的一部分。

【讨论】:

  • 即使这样做,将 ` .text .global MyAsmFunction .type MyAsmFunction 函数 MyAsmFunction: mov x0,#2` 作为我的.s 文件,按照你说的做并且拥有extern "C" void MyAsmFunction(); 它输出错误在“,”之后需要操作数;什么都没有,这是我在 inline asm 中遇到的错误之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 2013-10-13
  • 1970-01-01
  • 2012-01-25
  • 2021-10-19
  • 2013-11-21
相关资源
最近更新 更多