一:ARM寄存器
ARM指令主要是对寄存器,栈、内存的操作。寄存器位于CPU中,个数少速度快,ARM指令集中大部分指令都是对寄存器操作,但有些指令是对栈和内存的操作。下方会对操作栈、寄存器以及内存的指令进行介绍。
指令占4个字节
command shfit m:放入地址,查看指令
共31个寄存器:X0~X30,分别如下
X0~X28、fp、Ir
0~28、29、30
cpsr: 标记寄存器
ldr: 加载寄存器(load register)
stur: 这个指令
bl指令 跳转,将下一条执行的指令放入lr(X30)寄存器
ret 返回到lr寄存器所保存的地址 执行代码
lr 寄存器
pc 寄存器 指向马上要执行的代码地址
sp 指向了我们栈
栈平衡(每个函数调用完毕之后,将拉伸的栈空间平衡(将sp加回去))
函数调用会开辟一段空间(栈空间)
函数的局部变量、参数、寄存器的保护
参数:x0 -- x7(个数有关系、数据类型也有关)
多余的就会入栈
函数嵌套调用:
| - A(开辟) --> B(开辟) --> A(开辟)
| - A<-->A 死的递归(内存溢出)
内存分区域
代码区 特点: 可读可写可执行
栈区域 放参数和局部变量
堆区域 动态申请 可读可写
全局: 可读可写
常量区: 只读!
adrp x0, 1
1. 将1的值,左移12位 1 0000 0000 0000 == 0x1000
2.将PC寄存器的低12位清零 0x1002e6874 ==> 0x1002e6000
3.将将1 和 2 的结果相加 给 X0 寄存器!!
adrp 是计算指定的数据地址 到当前PC值的相对偏移
由于得到的结果是低12bit为0
10 1024
12 == 4KB
1002e7f28
1.栈操作---- push 与pop
先简单的聊一下栈的概念,“栈”说白了就是数据结构的一种,栈的数据结构具有LIFO(last in first out) ---- 后进先出的特点。栈在ARM中所指的其实是一块具有栈数据结构特点内存区。栈中主要用来暂存寄存器中的值得,比如R0寄存器正在使呢,可是现在有一个优先级比较高的函数要使用R0, 那么就先把R0的值Push到栈中暂存,然后等R0被优先级更高的函数使用完毕后在从栈中Pop出之前的值。在函数调用时一般会对栈进行操作。
对栈操作的命令就是push和pop了,一般会成对出现,在函数开始时将该函数执行时要使用的寄存器中的值push入栈,然后在函数结束时将之前push到栈中的值在pop到相应的寄存器中。
下方就是push和pop的用法的一个实例。在下方函数开始执行前,将该函数要使用的寄存器r4, r5, r7, lr使用push进行入栈操作,lr是该函数执行后要返回的地址。在函数执行完毕后,使用pop命令将函数执行前入栈的值在pop到相应的寄存器中。有一点需要注意的是将lr寄存器中的值在函数结束后pop到pc (Program Counter)寄存器中,pc寄存器中存储的是将要执行的命令的地址。这样一来,函数执行后就会返回到之前执行的地址上继续执行。
2. pc寄存器中的中的标志位
此处我们以32位指令为例,pc寄存器中的后四位是标志位,第28 - 31位分别对应着V (oVerflow),C (Carry),Z (Zero),N (Negative)。下面分别来介绍一下这四种符号所表示的状态。
N (Negative): 如果结果是负数则置位。
Z (Zero): 如果结果是零则置位。
C (Carry): 如果有进位则置位。
V (Overflow): 在发生溢出的时候置位。
二:Xcode指令
当你新建一个类的时候, Xcode 会自动给你写上以下代码。
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
#import "Car.h"
@implementation Car
@end
Objective-C 编译器指令是以 @ 打头,它通常用来描述文件中的内容。.h 文件中 @interface 指令用来标识文件的接口代码的起始位置,而 @end 指令标示该段的结束位置。在 .m 文件中,@implementation 指令用来标识实现的起始位置,@end 标识结束位置
@interface 用于定义类的公共接口,通常,接口被称为 API(application programming interface)而真正使对象能够运行的代码,位于 @implementation 中。