通过Android JNI编程来学习三大结构的ARM汇编

来源:互联网 发布:数控加工编程代码 编辑:程序博客网 时间:2024/06/07 03:49

有一段时间不更新了,不得不佩服人的惰性的强大,最怕水平底还比较懒得人,譬如我,哎,废话不说了,开始学习

目标:这篇文章主要是学习ARM汇编,通过JNI开发技术,编译出对应的SO文件,然后通过IDA分析,既能够稳固JNI开发,也能够学习ARM汇编:

一.首先第一个for循环结构

1.首先按照之前一篇JNI开发技术,写一个简答的应用,把关键点代码段写在JNI里面,这里就是把for循环这个写在这个里面,具体的步骤就不讲了,源代码见下载一点击打开链接.

核心代码是:


应用的运行结果是:


很简单就是把第一个参数进行一个for循环相加,再加上第二个参数。

2.接下来把对应的libaddcomputer.so拉进去IDA里面:

在Exports选项框里面找到这个函数如图:


点进去为:


接下来才进入主题:

分析这段代码:

一句一句解释:

首先如果这个结果不明显,可以空格键后显示为如下:


我们可以根据这个进行分析:

首先CMP R2,#0

就是将寄存器R2的值与立即数0进行比较,根据结果设置CPSR的标志位。这里面重点关注loc_c74这一块:

可以知道:

loc_c74

ADD   R0,R0,R1

ADD   R1,R1,#1

CMP   R1,R2

BNE   loc_c74

这块对应的就是如下:

别的很好理解,循环这块就理解到这。

二.if-else选择结构:

我简单写了一个小的应用程序,源代码见下载二.

把if-else写在核心SO文件里面:如下:


运行的结果是:


同样的把SO文件拉进去IDA里面我们同样的找到核心的函数:


STMFD与LDMFD指令的理解:

简单来看就是现场的保护,数据复制,等等就是表示一个函数要开始执行了.就是压栈出栈的一个过程。

首先开始时,R2,R3寄存器的值给了寄存器R4,R0;然后调用函数

_extendsfdf2,回车进去可以看到:






0 0
原创粉丝点击