代码之家  ›  专栏  ›  技术社区  ›  Boooooooooms

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

  •  1
  • Boooooooooms  · 技术社区  · 7 年前

    我正在使用Android studio构建一个Android应用程序 ARM64-v8a 它可以要求装配功能。 在网上搜索了很多信息后,我仍然无法处理这个问题。

    我的 CMakeList.txt 具体如下:

    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()
    }
    

    错误信息是

    错误:未知指令 一场文本

    错误:语句开头出现意外标记 @乘以10。r0中的输入值和返回值

    这些只是错误消息的一部分。事实上,它表明 倍数s unknown

    更新时间:

    有人指出问题可能是 case sensitive .所以我试着用另一个 .S 文件名为 main_asm.S 。 的代码 main\u asm。s 具体如下:

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

    问题仍然存在:

    未知指令

    更新时间:

    我提出另一个问题 Question Link

    我认为这个问题是由同样的原因造成的。也许是我的 clang 工作不顺利吗?我不知道,请帮忙:)

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

    2 回复  |  直到 3 年前
        1
  •  2
  •   Peter Cordes    3 年前

    bx lr 和寄存器 r0..r15 是32位ARM,而不是AARC64/ARM64-v8a。ARM64寄存器为x0。。31(他们的下半身是w0..31),你带着 ret (别名 br )

    确保64位生成不会尝试生成32位asm源文件。
    或者,如果您确实有32位asm源,请确保只执行32位构建。

        2
  •  1
  •   Denis B.    6 年前

    我也有同样的问题“未知令牌/指令/…”使用Android Studio(V3.1.2)并使用abiFilters(在app/build.gradle中)解决了该问题,但没有参考ndk:

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

    (可能将armeabi-v7a更改为arm64-v8a)

    希望有帮助

    (您可以在此处看到该项目: https://github.com/denisb/GPerf )