函数的参数和返回值:
ARM64下,函数的参数是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,就会入栈.
函数的返回值是放在X0 寄存器里面的.
这些是系统规定的,也正是这些规则我们才能逆向去解析别人的代码。
函数的局部变量:
函数的局部变量放在栈里面。这个大家都知道,下面我们建个项目来研究下函数执行的汇编代码。
堆栈操作例子:
使用32个字节空间作为这段程序的栈空间,然后利用栈将x0和x1的值进行交换.
以下代码[ ]中括号表示取指向的地址因为栈是从高地址向低地址开辟的所以用sub减地址内存,但是读写是从低地址向高地址的所以sp会指向到需要读写地址的前面,而通用寄存器为31个不变0-28 fp lr,所以寄存器会不断和内存交互存取值。
str stp是将数据从寄存器中取出存到内存,ldr ldp 是将数据从内存读取出来存到寄存器,所以一下操作是在sp开辟的栈内高地址先将寄存器x0 x1中的数据先存到对应的内存中,然后将对应寄存器中的数据存到寄存器中不同的是换了寄存器的存储顺序,从而实现寄存器中的数据交换。理解这个实例后下面的理解就方便多了。
sub sp, sp, #0x20 ;拉伸栈空间32个字节
stp x0, x1, [sp, #0x10] ;sp往上加16个字节,存放x0 和 x1
ldp x1, x0, [sp, #0x10] ;将sp偏移16个字节的值取出来,放入x1 和 x0
add sp,sp,#0x20; 栈平衡即释放开辟的空间
实例:
注:执行代码都需要连真机执行5s以上型号。模拟器是x86的系统架构跟arm64有区别。
1.创建Demo->comman