如何从C源文件调用arm程序集



我找到了一些用Android NDK编译汇编代码的好教程。但是他们没有关于如何从C源文件调用汇编指令的信息,我相信这是可能的。我想我在网上看到过类似的教程。我的问题是,如果我可以有一个C源文件,它发出汇编调用。我也希望能够与NDK编译。但我喜欢避免使用Android Studio和JNI;一个原因是我没有任何Java代码。并且我已经验证了我可以使用NDK编译和运行C源文件。所以基本上我知道如何编译C源文件,并使用NDK汇编文件。我已经验证了C代码在我的手机上运行良好。但是我不确定如何从C源文件中调用arm架构的汇编指令。当我尝试编译一个简单的源文件时,我一直得到以下错误消息:

/tmp/ccwua4Gd.s: Assembler messages:
/tmp/ccwua4Gd.s:18: Error: selected processor does not support Thumb mode `smc #0'

文件如下:

#include <stdio.h>
__asm__(" smc #0");
int main(void)
{
  /*Do something*/
  return 0;
}
顺便说一下,这个问题似乎与拇指和手臂无关。我确实在我的Android中尝试了LOCAL_ARM_MODE := arm声明。Mk,但它没有解决任何问题。我只是得到类似的错误的ARM指令。

更新:我仍然得到那个错误。这是我的Android.mk的副本为了在设备上执行,我不需要在早期的C源文件中指定手臂版本或手臂/拇指规范。我读过关于thumb的文章,它的优点和缺点,以及如何指定对它的支持。但是,即使我输入了configure ABI,这个错误仍然存在。我没有尝试的一件事是将.arm扩展名添加到我的C源文件中。我在早些时候的一篇文章中看到了它的参考资料,但我不明白为什么它会有什么不同。我相信OP,在那个线程中,暗示这将修复错误。有人能详细说明一下吗?有人用过吗?与Android相比,这样做的效果是什么?与架构相关的Mk语句?由于

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 
LOCAL_MODULE := hello  
APP_ABI := armeabi-v7a
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.c)
$(warning here is what is in FILE_LIST after an attempt to collect all the C files$(FILE_LIST))
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.s)
$(warning here is what is in FILE_LIST after an attempt to collect all the S files$(FILE_LIST))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
include $(BUILD_EXECUTABLE)

另一个更新-我尝试在我的C源文件中添加.arm后缀,将foo.c更改为foo.c。但即使这样也没有解决问题。非常感谢任何帮助。这是我现在在安卓上做的事情。可文件:

FILE_LIST := $(patsubst %.c,%.c.arm,$(wildcard $(LOCAL_PATH)/*.c))

这里是错误的更新版本。它只是把单词"thumb"改成了"arm"

/tmp/ccTK9siq.s: Assembler messages:
/tmp/ccTK9siq.s:17: Error: selected processor does not support ARM mode `smc #0'

嘿,我做了更多的研究,找到了这个关于我的问题的链接。我更新了我的安卓系统。按照页面提示,将LOCAL_CFLAGS := -mcpu=cortex-a8添加到mk文件中。问题并没有消失,但我得到了一个翔实的消息说:warning: switch -mcpu=cortex-a8 conflicts with -march=armv5te switch [enabled by default]所以下面建议的命令并没有真正生效。有人知道我是否应该尝试更改ndk-build的默认设置以及如何更改吗?毕竟这是一个警告;不是错误。所以我不确定它是否占用了我的配置,或者我需要做其他事情。现在我也得到了一个关于缺少唯一的头文件stdio.h的错误,这是我以前没有得到的。这告诉我,ndk-build只是在这个警告之后交付了构建过程。有人能提供指导或解决方案吗?

073015更新-我意识到应用程序之间存在差异。Android.mk。配置完应用程序后。使用上述参数,我能够将架构更改为armv7-a,但我得到了相同的错误;看下面:

jni/Android.mk:6: This is in NDK_ROOT /home/sansari/android/android-ndk-r10d
[armeabi-v7a] Assembly       : hello_tz <= main_normal.filtered.s
./obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.filtered.s: Assembler messages:
./obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.filtered.s:16: Error: **selected processor does not support ARM mode `smc #0'**
make: *** [obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.o] Error 1

是否有任何其他配置我需要使得到我想要的功能?

问题是您正在注入ARMv6或更高版本的汇编。如果您没有在NDK应用程序中指定ABI。

最新更新