【发布时间】: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