汇编函数参数和变量(六)

函数的参数和返回值

ARM64下,函数的参数是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,就会入栈.
函数的返回值通常是放在X0 寄存器里面的.如何证明,看下面代码:

把上面汇编add x0,x0,x1 改成x1 是不是结果也对?答案是不对的,x0就是接受的它的返回值结果

返回值在x30主要是记住return(在arm中x29 和x30都会进栈)

函数的局部变量

函数的局部变量放在栈里面!

*str w10 [sp] : 把w10放sp的区域中

*x30:保护函数返回

*叶子函数:函数中不调用别的函数 ,它不用开辟栈空间   如:


函数嵌套

解析:

x0(w0)是用来保存函数返回值,不是return那个(return是x30(w30))

1.看函数functionA,首页把参数a,b入栈(也就是w0,w1入栈)#mark1,#mark2

2.sumA(a,b); 会把上面栈中的2个参数读到寄存器 #mark2下面2行

3.int pr1 对应#mark3 w0入栈

4.pr2和pr1也一样,寄存器和内存交互

5.add sp 栈平衡

总结:

函数调用会开辟一段空间(栈空间)。函数局部变量 桉树 寄存器的保护。

bl跳转将下一个指令放入lr(x30)寄存器,ret返回lr

x0-x7(个数有关系,数据结构有关系),多余的入栈

函数嵌套调用 A(开辟栈空间) > B(开辟栈空间)   > A(开辟栈空间)    A<->A (内存溢出) 每次调用都会开辟空间

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud