在Android Studio上使用ARM64-V8A的汇编语言

 2023-01-19    462  

问题描述

我正在使用Android Studio在ARM64-v8a上构建一个Android应用程序,该应用程序可以要求组装功能.
在线搜索了很多信息之后,我仍然无法处理此问题.

我的CMakeList.txt如下:

在Android Studio上使用ARM64-V8A的汇编语言

cmake_minimum_required(VERSION 3.4.1)

enable_language(ASM)
set(can_use_assembler TRUE)
set(CMAKE_VERBOSE_MAKEFILE on)
#add_definitions(-DANDROID -DNDEBUG -DOC_ARM_ASM)

set_source_files_properties(multiple.s PROPERTIES COMPILE_FLAGS "-x 
assembler-with-cpp")

add_library( # Sets the name of the library.
         native-lib

         # Sets the library as a shared library.
         SHARED

         # Provides a relative path to your source file(s).
         src/main/cpp/native-lib.cpp
         src/main/cpp/multiple.s
         )

multiple.s的代码为

.session .text
.align  2
.global armFunction
.type   armFunction, %function

armFunction:
    @ Multiply by 10. Input value and return value in r0
    stmfd   sp!, {fp,ip,lr}
    mov r3, r0, asl #3  @ r3=r0<<3=r0*8
    add r0, r3, r0, asl #1  @ r0=r3+r0<<1=r0*8+r0*2=r0*10
    ldmfd   sp!, {fp,ip,lr}
    bx  lr
    .size   armFunction, .-armFunction

native-lib.cpp的代码如下:

extern "C"

int armFunction(int);

JNIEXPORT jstring JNICALL
Java_com_example_zyf_testarm_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++ ";
    int x = 1;
    char info[1024] = "";
    x = x + armFunction(10);

    sprintf(info,"%d",x);
    return env->NewStringUTF(info); //hello.c_str()
}

和错误消息是

错误:未知指令
.session .Text

错误:声明开始时意外令牌
@乘以10.输入值和返回R0

中的值

这些只是错误消息的一部分.实际上,它表明multiple.s中的每个指令is unknown.

更新:

有人指出问题可能是case sensitive.因此,我尝试使用另一个名为main_asm.S的文件.
main_asm.S的代码如下:

.text
.global asm_main
 asm_main:
    mov r0, #1
    bx lr

问题仍然存在:

未知指令

更新:

我提出了另一个问题问题链接.

我认为问题是由相同原因引起的.也许我的clang工作不好?我不知道,请帮忙:)

非常感谢您帮助我解决这个问题:)

推荐答案

bx lr和寄存器r0..r15是32位的臂,而不是Aarch64/arm64-V8A. ARM64寄存器是X0..31(且其低半部分是W0..31),您用ret返回(br的别名)

确保64位构建不会尝试构建32位ASM源文件.
或者,如果您确实有32位ASM源,请确保只做32位构建.

其他推荐答案

我与Android Studio(v3.1.2)(v3.1.2)一起遇到了同样的问题”未知令牌/指令/…”,并使用Abifilters(在App/build.gradle中)解决了它,但没有引用NDK:

android {
...
    defaultConfig {
...
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }}}
...    
}

(也许更改ARM64-V8A的ARMEABI-V7A)

(您可以在此处查看项目: https://github.com/denisb/genisb/genisb/gperf )

以上所述是小编给大家介绍的在Android Studio上使用ARM64-V8A的汇编语言,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25808.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。