建工程

十九、 ARM64汇编(一)

2018-12-23  本文已影响40人  Lovell_

一、简介

1、模拟器和真机的汇编是不一样的

其实都是GNU的汇编,只是架构不一样,汇编是严重依赖机器的,机器架构不一样,所以对应的汇编指令也就不一样。

所以我们调试程序的时候,统一运行在真机上面,因为我们的程序最终也是运行在真机上面的。

所以,就不用去了解模拟器上的汇编,作用并不大。

2、真机和模拟器上各自的汇编代码样式:

真机上的汇编 模拟器上的汇编

从上两图来看,二者汇编语言差别还是蛮大的。

3、如何学好arm64汇编

除了有arm64,还有arm32汇编,不过以后手机都是arm64构架,所以没必要学arm32汇编。

学好arm64汇编要学好3个东西:

学好这三个东西,这门汇编语言也就掌握的差不多了。



二、通用寄存器

这些是暂时需要用到的寄存器。

如何查看寄存器?

通用寄存器有什么用呢?
——通用的,存放些东西,如何存放呢?这需要学些指令,来操作。



三、mov指令

mov:move

如何编写汇编指令:
1、在OC或C中嵌入汇编;

在OC或C中嵌入汇编

2、外部建立一个汇编文件.s,再配个.h文件暴露函数的声明,以函数的形式来练习汇编(实现文件后缀.asm或.s);


注意:
1、在.h中是test(),但是在.s中是_test,因为底层调用带下划线的函数。
2、如果不想公开这个函数,可以不带下划线,怎么写都行。

1、给寄存器赋值

2、寄存器间赋值



四、add、sub指令

add 加法
sub 减法

汇编代码——mov add sub 断点调试结果

注意:汇编中,函数最后一定要写ret,否则会一直按顺序执行下去。他会认为下一个函数名只是下个代码块的标记。

实现加法和减法功能:

传进来的参数在哪呢?

打断点 参数存放结果

哪个寄存器用来返回?

公开函数 汇编实现 结果



五、cmp指令、cpsr寄存器

cmp:compare 比较
cpsr:Current Program Status Register 程序状态寄存器器
spsr:Saved Program Status Register,异常状态下使⽤用

另外:c:进位;v:溢出

为正的情况:

register write

为负情况:



六、b指令

跳转指令



七、带条件的b指令

使用方法 b后面的条件对应cpsr的位置

根据上上图,beq,去会看cpsr中的z位看是否为1.



八、带if-else反汇编

image.png

蓝色部分的跳转,是为了实现执行完if的代码后,不执行else if的代码,继续执行后面的公共代码。

上一篇下一篇

猜你喜欢

热点阅读