ARM64 学习
2020-04-09 本文已影响0人
化二缺
iOS汇编
- 真机 arm64汇编,GNU
- 模拟器 x86, AT&T 汇编
寄存器 指令 堆栈
通用寄存器
- 64bit的 :x0 到 x28
- 32bit的 :w0 到 w28 (属于x0到 x28的低32bit)
- x0 - x7 通常拿来存放函数的参数,更多的参数使用堆栈进行传递
- x0 通常拿来存放函数的返回值

程序计数器
- pc (Program Counter)
- 记录cpu 当前指令是那一条指令
- 相当于存储当前cpu 正在执行的指令地址
- 类似8086的ip寄存器
堆栈指针
- sp (Stack Pointer)
- fp (frame Pointer) ,也就是 x29
连接寄存器
- lr (Link Reigister) 也就是 x30
register read lr 和 register read x30 一样
没有 w30 所以不是一般寄存器
存储着函数的返回地址(函数执行完之后应该返回的地址 并且往下执行)
程序状态寄存器
- cpsr (Current Program Status Register)
- spsr (Saved Program Status Register) ,异常状态下使用
指令
- ret
就是相当于 C 语言里面的 函数返回 return
将 lr 里面的值赋值给pc 寄存器 - mov
1.建议创建OC 工程 比较好操作 swift函数 没有。main函数





新版本的Xcode 不会断在汇编语句上 断在函数上 单步跳进 可以实现
- add
ADD 目的寄存器 操作数1 操作数2
ADD指令 用于把两个操作数相加 并将结果放到寄存器中,操作数1 应是一个寄存器 操作数2 可以是一个寄存器 被移位的寄存器或者一个立即数
ADD x2 , x4,#0x08 == [ x2 = x4 + #0x08 ]
- sub
SUB x2 , x4,x6 == [x2 = x4 -x6]
- cmp
CMP x1,x2 ==[ x1 减 x2 ,结果影响 cpsr 寄存器 的标志位]


- b
跳转指令 、可以带条件跳转,一般跟cmp配合使用


- EQ: equal, 相等
- NE: not equal , 不相等
- GT: great than ,大于
- GE: great or equal, 大于等于
- LT: less than ,小于
- LE: less equal, 小于等于
- bl指令
带返回的b指令 ,b 跳转的函数里的ret 是无效的 只有 bl 跳转的函数里的ret 才会管用,类似 oc里面的函数调用 执行完函数后 继续执行下面的代码
bl 后面也可以带条件
内存操作相关的指令
- load ,从内存中装载数据
- ldr, ldur
- ldp (p 是 一对的意思)
- store 往内存中存储数据
- str ,stur
- stp
- 零寄存器
- wzr(32bit Word Zero Register) 里面存储的值是0 用来清空某段地址
- xzr (64bit)
stur wzr,[x29 ,#-0x14]
stur xzr,[x29, #-0x20]
CPU 寻址方式
立即寻址
立即寻址.png
寄存器寻址
寄存器寻址.png
寄存器间接寻址
寄存器间接寻址 .png
基址变址寻址
基址变址寻址.png
bl 指令和 b指令的区别
-
bl 会回到函数执行完的下一行
-
b 不会回到函数执行完的下一行
-
b指令只是进行跳转
-
bl指令 1.将一下条指令的地址存储到 lr 寄存器 2.跳转执行
-
ret 是将 lr 的值赋值给pc
堆栈
-
sp (Stack Pointer)
-
fp (frame Pointer) ,也就是 x29
-
函数的类型
- 叶子函数 (内部不再调用其他函数的函数)
- 非叶子函数
1. fp(x29) 和 sp(x30) 之间的空间是函数本身需要的空间
2. fp 和 sp 都需要重新赋值
3. 会存储 lr 因为要调用其他函数 执行完要回到原处 往下执行
部分LLDB 指令
