ios现在都是arm64汇编
x0 – x7 用于子程序调用时的参数传递,超过八个会放到线上传递
x0和w0时同一寄存器的不同尺寸,x0为8字节,w0为4字节,x0寄存器的低位4字节
x0/w0还可以用于返回值的传递 ;是注释符号
mov x1, x0 ;将寄存器x0 赋值给x1
add x0,x1,x2 ;x0 = x1 + x2
sub x0,x1,x2 ;x0 = x1 – x2
mul x0,x1,x2 ;x0 = x1 * x2
sdiv x0,x1,x2 ;x0 = x1 / x2
add x0, x0 , #0xF ; x0 = x0 & #0xF 与操作
orr x0,x0, #9 ; x0 = x0 | #9 或操作
eor x0, x0, #0xF ; x0 = x0 ^ #0xF 异或操作
寻址指令
L开头的从内存中取值 LDR load Register LDP load Pair
S开头往内存中存值 SDR store Register STP Store Pair
ldr x0,[x1] ; 从内存地址x1中取出值来给寄存器x0
ldp x1,x2 [x10, #0x10] ;从内存地址 x10 + 10 取出两个64位的值 赋值给寄存器x1,x2
str x5, [sp, #24] ; 偏移量为正 将寄存器x5里面的64位值存到内存地址sp + 24
stur w0, [x29, #0x8] 偏移量为负的 将寄存器w0的值存入x29 – 0x8 的内存地址
大多数时候,寄存器可以用来计算,内存是存数据的,所以经常是寄存器和内存交换数据
堆: 当程序运行时,操作系统会为程序划分出来一段内存空间,起始位置0x1000,结束位置0x8000,
这段内存空间开始有一段静态数据,从起始位置开始分配内存
动态占用请求,新建对象,malloc
这种用户主动申请的而划分出来的,叫堆 heap 从低位到高位, 不能自动释放,只能手动释放,或者垃圾回收机制来回收
栈是一种因为函数运行而临时占用的内存区域,从高位到低位,每个函数都有一个帧frame,临时变量都存在这里,一层层栈,有多少个帧frame, 等函数运行结束后,就把帧释放掉了
arm64里面每次占用字节都是16字节,不足的话自动补全