回顧:
bl 跳轉(zhuǎn),將下一條要執(zhí)行的指令放入lr(X30)寄存器
ret 返回lr所保存的地址執(zhí)行代碼
pc 指向要執(zhí)行的代碼地址
sp 指向棧,棧平衡(函數(shù)調(diào)用后,將拉伸的??臻g平衡sub,add)
函數(shù)調(diào)用會(huì)開辟一段??臻g(函數(shù)的局部變量、參數(shù)、寄存器的保護(hù))
參數(shù)放在X0 - X7(個(gè)數(shù)有關(guān),與數(shù)據(jù)類型有關(guān) 浮點(diǎn)、結(jié)構(gòu)體...),多余的入棧
函數(shù)嵌套調(diào)用,死遞歸,不斷開辟空間 -> 內(nèi)存溢出
狀態(tài)寄存器 CPSR
CPU內(nèi)部的寄存器中,有一種特殊的寄存器(不同的處理器,個(gè)數(shù)和結(jié)構(gòu)可能不同),在ARM中,被稱為狀態(tài)寄存器CPSR(current program status register),其他寄存器是用來存放數(shù)據(jù)的,而CPSR是按位起作用的,即它的每一位都有專門的含義,記錄特定的信息。
注:CPSR是32位的
狀態(tài)寄存器.png
N(Negative)
符號(hào)標(biāo)志位,記錄相關(guān)指令執(zhí)行后,結(jié)果是否為負(fù),負(fù):1 非負(fù):0
Z(Zero)
0標(biāo)志位,記錄相關(guān)指令執(zhí)行后,結(jié)果是否為0,0:1 非0:0
C(Carry)
進(jìn)位標(biāo)志位,一般情況下,進(jìn)行無符號(hào)數(shù)的運(yùn)算。
加法:當(dāng)結(jié)果產(chǎn)生了進(jìn)位時(shí)(無符號(hào)數(shù)溢出),C=1,否則C=0
減法:當(dāng)運(yùn)算時(shí)產(chǎn)生了借位時(shí)(無符號(hào)數(shù)溢出),C=0,否則C=1
- 進(jìn)位:當(dāng)兩個(gè)數(shù)相加時(shí),可能產(chǎn)生從最高有效位向更高位的進(jìn)位,由于這個(gè)進(jìn)位值在32位中無法保存,CPU在運(yùn)算時(shí)并不丟棄這個(gè)進(jìn)位值,而是記錄在一個(gè)特殊的寄存器的某一位上,ARM就用C位來記錄這個(gè)進(jìn)位值。
- 借位:兩個(gè)數(shù)做減法時(shí),可能向更高位借位,用C位來標(biāo)記借位,C=0
V(Overflow)
溢出標(biāo)志位,在進(jìn)行有符號(hào)數(shù)運(yùn)算時(shí),如果超過了機(jī)器所表示的范圍,稱為溢出。
- 正數(shù) + 正數(shù) = 負(fù)數(shù) 溢出
- 負(fù)數(shù) + 負(fù)數(shù) = 正數(shù) 溢出
- 正數(shù) + 負(fù)數(shù) 不可能溢出