美文网首页
C内嵌汇编实战-ARM

C内嵌汇编实战-ARM

作者: 半笔闪 | 来源:发表于2020-03-24 14:11 被阅读0次
cd /opt
unzip android-ndk-r7c-linux-x86.zip

如ubuntu没有安装make工具,可用利用下列命令安装:

apt-get install make

如还未安装adb工具,可用如下命令安装:

apt-get install android-tools-adb
  • C内嵌汇编简单例子
    如深度学习加速优化文集中的gnu C内嵌汇编中的格式说明,C内嵌汇编的格式可以概况为如下:
asm(
        代码1
        代码2
        ...
        :输入列表
        :输出列表
        :被更改列表
);

下面举个简单的例子,1+3=4的例子

#随便找个测试目录
cd ~/
mkdir armtest && cd armtest
vim armtest.c 

armtest.c

#include <stdio.h>

int main(void){
    int abc = 0;
    asm(
        "mov r1, #1\n\t"                       //mov指令将立即数1放入r1寄存器
        "mov r2, #3\n\t"                       //mov指令将立即数3放入r2寄存器
        "add %[result], r1, r2\n\t"         //add指令将r1、r2中的值相加,结果放入变量abc中,这里result是abc的别名
        :[result]"=r"(abc)                       //声明输入来自变量abc
        :                                                //无输入
        :                                                //无更改列表
        );
    printf("1+3=%d\n", abc);              //打印结果
    return 0;
}

为了方便起见,我写了Makefile,当然也可以不写,直接在命令行中用ndk的gcc去编译(注意要链接stl库),为了复用简单,我把Makefile分成两份,一份公用代码提出了以后写其他的Makefile可以简单一些,一份Makefile.def、一份Makefile,Makefile中会包含Makefile.def文件,如下:
~/armtest/Makefile.def

CXX_DEFINES = -DARM_WITH_OMP -DHPPL_STUB_FUNC -DLITE_WITH_ARM -DLITE_WITH_LIGHT_WEIGHT_FRAMEWORK \
              -DLITE_WITH_LINUX -DPADDLE_DISABLE_PROFILER -DPADDLE_NO_PYTHON -DPADDLE_WITH_TESTING
LDFLAGS = -latomic -pthread -ldl

SYSROOT_COMPLILE = --sysroot=/opt/android-ndk-r17c/sysroot


SYSTEM_INCLUDES = -I/opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/include \
                  -I/opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++abi/include \
                  -I/opt/android-ndk-r17c/sources/android/support/include \
                  -I/opt/android-ndk-r17c/sysroot/usr/include \


ifeq ($(ARM_ABI), arm8)
    CC = /opt/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++
    CXX_FLAGS = -funwind-tables -no-canonical-prefixes -D__ANDROID_API__=22 -fexceptions -frtti  -std=c++11 -fopenmp -O3 -DNDEBUG -fPIE
    CXXFLAGS_LINK = $(CXX_FLAGS) -fpie -Wl,--gc-sections
    SYSROOT_LINK = --sysroot=/opt/android-ndk-r17c/platforms/android-24/arch-arm64
    SYSTEM_LIBS = /opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_static.a \
                  /opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++abi.a
    INCLUDES = $(SYSTEM_INCLUDES) -I/opt/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android
else
    CC = /opt/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
    CXX_FLAGS = -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=softfp -funwind-tables -no-canonical-prefixes \
                -D__ANDROID_API__=22 -fexceptions -frtti  -std=c++11 -fopenmp -O3 -DNDEBUG -fPIE
    CXXFLAGS_LINK = $(CXX_FLAGS) -pie -Wl,--fix-cortex-a8 -Wl,--gc-sections -Wl,-z,nocopyreloc
    SYSROOT_LINK = --sysroot=/opt/android-ndk-r17c/platforms/android-22/arch-arm
    SYSTEM_LIBS = /opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_static.a \
                  /opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++abi.a \
                  /opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libandroid_support.a \
                  /opt/android-ndk-r17c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libunwind.a
    INCLUDES = $(SYSTEM_INCLUDES) -I/opt/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi
endif

~/armtest/Makefile

ARM_ABI = arm7
export ARM_ABI

include ./Makefile.def


CXX_INCLUDES = $(INCLUDES)

CXX_LIBS =  $(SYSTEM_LIBS)

armtest: armtest.o
        $(CC) $(SYSROOT_LINK) $(CXXFLAGS_LINK) armtest.o -o armtest  $(CXX_LIBS) $(LDFLAGS)

armtest.o: armtest.c
        $(CC) $(SYSROOT_COMPLILE) $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o armtest.o -c armtest.c


.PHONY: clean
clean:
        rm -f armtest.o
        rm -f armtest

在armtest目录下执行:

make

此时会在目录下生成一个armtest.o和armtest,armtest就是我们的可执行程序,把armtest adb到手机上执行:

adb push armtest /data/test/
adb shell
cd /data/test/
chmod 777 armtest
./armtest

此时会打印出


image.png

证明我们的例子成功执行。

相关文章

网友评论

      本文标题:C内嵌汇编实战-ARM

      本文链接:https://www.haomeiwen.com/subject/tbxbfhtx.html