CPSR
- 在ARM64中存在一種特殊的寄存器,即CPSR--current program status register 狀態(tài)寄存器咒彤。
- CPSR寄存器是32位的
- CPSR寄存器每一位具有專門的含義
CPSR 32位含義
CPSR高四位分別稱為NZCV,N位--Negative標志位,Z位--Z ero標志位, C位--Carry標志位, V位--OverFlow標志位陵珍。
NZCV均為條件碼標志位,可被某些指令執(zhí)行的算數(shù)或邏輯運算結(jié)果改變违施,并可以決定決定指令的執(zhí)行邏輯互纯。意義重大。
CPSR的低8位(包括I磕蒲、F留潦、T和M[4:0])稱為控制位只盹,程序無法修改,除非CPU運行于特權(quán)模式下兔院,程序才能修改控制位殖卑。
我們重點關(guān)注NZCV條件碼標志位。
NZCV條件碼標志位
- N-- Negative標志位
相關(guān)指令運算結(jié)果為負數(shù)坊萝,則N = 1, 否則N= 0孵稽。即結(jié)果為負數(shù)的時候,Negative標志位為真十偶。
- Z-- Zero標志位
相關(guān)指令運算結(jié)果為0菩鲜,則Z = 1, 否則Z= 0。即結(jié)果為0的時候惦积,Zero標志位為真接校。
- C--Carry標志位
Carry標志位為進位標志位, 相關(guān)指令運算結(jié)果最高位產(chǎn)生進位則C = 1, 否則C= 0。
兩數(shù)相加荣刑,可能產(chǎn)生最高位的進位馅笙。這個最高位的進位可以保存在C標志位伦乔。
如下列指令列出的加法元算:
mov w0,#0xaaaaaaaa厉亏; w0的最高位為1
adds w0,w0,w0; 執(zhí)行后 相當(dāng)于 1010 << 1 最高位進位1 C標記 為 1
adds w0,w0,w0烈和; 執(zhí)行后 相當(dāng)于 0101 << 1 最高位進位0 C標記 為 0
adds w0,w0,w0爱只; 重復(fù)上面操作
adds w0
如果是兩個數(shù)相減,將減法轉(zhuǎn)換位加法后招刹,如果最高位有進位則C = 1, 否則C = 0;
如下列指令列出的減法元算
mov w0,#0x0; wo = 0x0, 二進制0000
subs w0,w0,#0xff ; w0 - 0xff = 0x00 - 0xff = 0x00 + 0xffffff01 = 0xffffff01恬试,沒有進位, C = 0
subs w0,w0,#0xff; wo - 0xff = 0xffffff01 - 0xff = 0xffffff01 + 0xffffff01, 有進位疯暑, C = 1
subs w0,w0,#0xff
在某些人的理解中训柴,把C標志位為理解為無符號運算的時候:1)加法元素,有進位妇拯,則C = 1幻馁,無進位,C = 0越锈; 2)加法運算仗嗦, 有借位, 則C = 0, 無借位甘凭, 則C = 1
我個人會把減法轉(zhuǎn)換為加法后再進行理解稀拐。
- V--Overflow標志位
Overflow標志位為溢出標志位,相關(guān)指令運算結(jié)果超過機器表示的范圍后丹弱,稱為溢出德撬。溢出則V = 1, 無溢出則V = 0;
如
- 正數(shù) + 正數(shù) 為負數(shù) 溢出 兩個操作數(shù)的最高位(即符號位)為0铲咨, 計算結(jié)果變?yōu)榱?(即負數(shù))
- 負數(shù) + 負數(shù) 為正數(shù) 溢出 兩個操作數(shù)的最高位(即符號位)為1, 計算結(jié)果變?yōu)榱?(即正數(shù))
- 正數(shù) + 負數(shù) 不可能溢出
注意:
- 不是所有運算指令(進行邏輯或算術(shù)運算)都能改變狀態(tài)寄存器的蜓洪,如add不能改變狀態(tài)寄存器鸣驱,adds能改變狀態(tài)寄存器。什么指令能改變狀態(tài)寄存器應(yīng)該是CPU的指令集里決定了的蝠咆。
- C和V溢出位的區(qū)別:C位是最高位產(chǎn)生了進位踊东,V位是符號位與兩個同為正數(shù)或同為負數(shù)的符號位不同。