一般来说学习汇编可以从寄存器、指令、堆栈 入手,下面我们慢慢学习:
生成汇编文件:
xcrun --sdk iphoneos clang -S -arch arm64 main.c -o main.s
寄存器
1. 通用寄存器:
64bit的:x0 ~ x28
32bit的:w0 - w28
x0 - x7通常用来存放函数的参数,更多的参数使用堆栈来传递
x0通常拿来存放函数的返回值
2. 程序计数器:
pc (Program Counter)
记录CPU当前指令的是哪一条指令
存储着当前CPU正在执行的指令的地址
3. 堆栈指针
sp (Stack Pointer)
fp (Frame Pointer) ,也就是x29
4. 链接寄存器
lr (Link Register),也就是x30
存储着函数的返回地址
5. 程序状态寄存器
cpsr (Current Program Status Register)
spsr (Saved Program Status Register),异常状态下使用
指令
mov
ret
ret是函数返回指令
将lr (x30) 寄存器的值赋给pc寄存器
add
sub
cmp
cmp是将2个寄存器相减
相减的结果会影响cpsr寄存器的标志位
b
b是跳转指令
可以带条件跳转,一般跟cmp配合使用
bl
bl是带返回的跳转指令
执行的操作:将下一条指令的地址存储到lr (x30) 寄存器中,
跳转到标记处开始执行代码
条件域
EQ: equal,相等
NE: not equal , 不相等
GT: great than, 大于
GE: great equal,大于等于
LT: less than,小于
LE: less equal,小于等于
内存操作
load,从内存中读取数据
ldr 、ldur 、dp
store,往内存中写入数据
str、stur、stp、零寄存器,里面存储的值是0(wzr、xzr)
函数的堆栈
函数的类型:
叶子函数
非叶子函数