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

其实都是GNU的汇编,只是架构不一样,汇编是严重依赖机器的,机器架构不一样,所以对应的汇编指令也就不一样。
所以我们调试程序的时候,统一运行在真机上面,因为我们的程序最终也是运行在真机上面的。
所以,就不用去了解模拟器上的汇编,作用并不大。
2、真机和模拟器上各自的汇编代码样式:


从上两图来看,二者汇编语言差别还是蛮大的。
3、如何学好arm64汇编
除了有arm64,还有arm32汇编,不过以后手机都是arm64构架,所以没必要学arm32汇编。
学好arm64汇编要学好3个东西:

学好这三个东西,这门汇编语言也就掌握的差不多了。
二、通用寄存器

这些是暂时需要用到的寄存器。
如何查看寄存器?

通用寄存器有什么用呢?
——通用的,存放些东西,如何存放呢?这需要学些指令,来操作。
三、mov指令
mov:move
如何编写汇编指令:
1、在OC或C中嵌入汇编;

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

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


2、寄存器间赋值


四、add、sub指令
add 加法
sub 减法


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

传进来的参数在哪呢?


哪个寄存器用来返回?



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

另外:c:进位;v:溢出
为正的情况:


为负情况:


六、b指令
跳转指令


七、带条件的b指令



根据上上图,beq,去会看cpsr中的z位看是否为1.
八、带if-else反汇编


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