回顾:
bl 跳转,将下一条要执行的指令放入lr(X30)寄存器
ret 返回lr所保存的地址执行代码
pc 指向要执行的代码地址
sp 指向栈,栈平衡(函数调用后,将拉伸的栈空间平衡sub,add)
函数调用会开辟一段栈空间(函数的局部变量、参数、寄存器的保护)
参数放在X0 - X7(个数有关,与数据类型有关 浮点、结构体...),多余的入栈
函数嵌套调用,死递归,不断开辟空间 -> 内存溢出
状态寄存器 CPSR
CPU内部的寄存器中,有一种特殊的寄存器(不同的处理器,个数和结构可能不同),在ARM中,被称为状态寄存器CPSR(current program status register),其他寄存器是用来存放数据的,而CPSR是按位起作用的,即它的每一位都有专门的含义,记录特定的信息。
注:CPSR是32位的
N(Negative)
符号标志位,记录相关指令执行后,结果是否为负,负:1 非负:0
Z(Zero)
0标志位,记录相关指令执行后,结果是否为0,0:1 非0:0
C(Carry)
进位标志位,一般情况下,进行无符号数的运算。
加法:当结果产生了进位时(无符号数溢出),C=1,否则C=0
减法:当运算时产生了借位时(无符号数溢出),C=0,否则C=1
- 进位:当两个数相加时,可能产生从最高有效位向更高位的进位,由于这个进位值在32位中无法保存,CPU在运算时并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上,ARM就用C位来记录这个进位值。
- 借位:两个数做减法时,可能向更高位借位,用C位来标记借位,C=0
V(Overflow)
溢出标志位,在进行有符号数运算时,如果超过了机器所表示的范围,称为溢出。
- 正数 + 正数 = 负数 溢出
- 负数 + 负数 = 正数 溢出
- 正数 + 负数 不可能溢出