如何从C源文件中调用arm汇编?
How to call arm assembly from C source files?
我找到了很多关于使用 Android NDK 编译汇编代码的好教程。但是他们没有关于如何从 C 源文件调用汇编指令的信息,我相信这是可能的。我想我已经在网上看到过类似的教程。我的问题是我是否可以有一个 C 源文件,它发出程序集调用。我也希望能够使用 NDK 进行编译。但我喜欢避免使用 Android Studio 和 JNI;原因之一是我没有任何 Java 代码。我已经验证了我可以使用 NDK 编译和 运行 C 源文件。所以基本上我知道如何使用 NDK 编译 C 源文件和汇编文件。我已经在我的 phone 上验证了 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.mk 中尝试了 LOCAL_ARM_MODE := arm
语句,但它没有解决任何问题。我刚得到 ARM 指令的类似错误。
更新:我仍然收到该错误。这是我的副本 Android.mk
为了在设备上执行,我不必在早期的 C 源文件中指定 arm 版本或 arm/thumb 规范。我已经阅读了关于 thumb 和与该选项相关的优缺点,以及如何指定对它的支持。然而,即使我配置了 ABI,这个错误仍然存在。我没有尝试过的一件事是将 .arm 扩展名添加到我的 C 源文件中。我在较早的 post 中看到了对它的引用,但无法弄清楚为什么会有所不同。我相信 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)
另一个更新 - 我尝试将 .arm 后缀添加到我的 C 源文件中,将 foo.c 更改为 foo.c.arm,但即使那样也没有解决问题。任何帮助是极大的赞赏。这是我现在在 Android.mk 文件中所做的:
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'
嘿,我做了更多的研究,发现 this link 关于我的问题。我按照页面中的说明用 LOCAL_CFLAGS := -mcpu=cortex-a8
更新了我的 Android.mk 文件。问题并没有消失,但我收到一条信息性消息:warning: switch -mcpu=cortex-a8 conflicts with -march=armv5te switch [enabled by default]
所以下面建议的命令并没有真正生效。有谁知道我是否应该尝试更改 ndk-build 的默认设置以及如何更改?毕竟这是一个警告;不是错误。所以我不确定它是否占用了我的配置或者我需要做其他事情。
现在我还收到有关缺少唯一的头文件 stdio.h 的错误,这是我之前没有得到的。这告诉我 ndk-build 只是在那个警告之后将构建过程交给了 make。任何人都可以为此提供指导或解决方案吗?
073015 更新 - 我意识到 application.mk 和 Android.mk 之间存在差异。使用所述参数配置 applicaiton.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 Application.mk 中指定 ABI,则该工具假定为 ARMv5。
我找到了很多关于使用 Android NDK 编译汇编代码的好教程。但是他们没有关于如何从 C 源文件调用汇编指令的信息,我相信这是可能的。我想我已经在网上看到过类似的教程。我的问题是我是否可以有一个 C 源文件,它发出程序集调用。我也希望能够使用 NDK 进行编译。但我喜欢避免使用 Android Studio 和 JNI;原因之一是我没有任何 Java 代码。我已经验证了我可以使用 NDK 编译和 运行 C 源文件。所以基本上我知道如何使用 NDK 编译 C 源文件和汇编文件。我已经在我的 phone 上验证了 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.mk 中尝试了 LOCAL_ARM_MODE := arm
语句,但它没有解决任何问题。我刚得到 ARM 指令的类似错误。
更新:我仍然收到该错误。这是我的副本 Android.mk 为了在设备上执行,我不必在早期的 C 源文件中指定 arm 版本或 arm/thumb 规范。我已经阅读了关于 thumb 和与该选项相关的优缺点,以及如何指定对它的支持。然而,即使我配置了 ABI,这个错误仍然存在。我没有尝试过的一件事是将 .arm 扩展名添加到我的 C 源文件中。我在较早的 post 中看到了对它的引用,但无法弄清楚为什么会有所不同。我相信 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)
另一个更新 - 我尝试将 .arm 后缀添加到我的 C 源文件中,将 foo.c 更改为 foo.c.arm,但即使那样也没有解决问题。任何帮助是极大的赞赏。这是我现在在 Android.mk 文件中所做的:
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'
嘿,我做了更多的研究,发现 this link 关于我的问题。我按照页面中的说明用 LOCAL_CFLAGS := -mcpu=cortex-a8
更新了我的 Android.mk 文件。问题并没有消失,但我收到一条信息性消息:warning: switch -mcpu=cortex-a8 conflicts with -march=armv5te switch [enabled by default]
所以下面建议的命令并没有真正生效。有谁知道我是否应该尝试更改 ndk-build 的默认设置以及如何更改?毕竟这是一个警告;不是错误。所以我不确定它是否占用了我的配置或者我需要做其他事情。
现在我还收到有关缺少唯一的头文件 stdio.h 的错误,这是我之前没有得到的。这告诉我 ndk-build 只是在那个警告之后将构建过程交给了 make。任何人都可以为此提供指导或解决方案吗?
073015 更新 - 我意识到 application.mk 和 Android.mk 之间存在差异。使用所述参数配置 applicaiton.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 Application.mk 中指定 ABI,则该工具假定为 ARMv5。