CPU內(nèi)部的寄存器中愉适,有一種特殊的寄存器犯助,這種寄存器在ARM中,被稱為狀態(tài)寄存器维咸,即CPSR(current program satus register)寄存器剂买;
CPSR和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的癌蓖,都是一個寄存器具有一個含義雷恃。而CPSR寄存器是按位起作用的,也就是說费坊,它的每一位都具有專門的含義倒槐,用來記錄特定的信息;
注:CPSR寄存器是32位的附井;
- CPSR的低8位(包括I讨越、F、T和M[4: 0])稱為控制位永毅,程序無法修改把跨,除非CPU運行于特權(quán)模式下,程序才能修改控制位沼死。
-
N着逐、Z、C意蛀、V均為條件標志位耸别。他們的內(nèi)容可以被算數(shù)運算(加減乘除)或邏輯運算(if判斷)的結(jié)果所修改,并且可以決定某條指令是否被執(zhí)行县钥。意義重大P憬恪!若贮!
N(Negative)標志
- CPSR的第31位是N省有,符號標志位痒留。
- 它記錄了某條指令執(zhí)行的結(jié)果是否為負;如果為負的蠢沿,則N=1伸头;如果為非負的,則N=0舷蟀;
把執(zhí)行結(jié)果當做有符號數(shù)據(jù)熊锭,那么N就是該數(shù)據(jù)的符號位(1代表負數(shù),0代表非負數(shù))
mov x0 #0x0fffffff
adds w0 w0 #0x1
;命令執(zhí)行后雪侥,執(zhí)行結(jié)果為0x10000000, N = 1
Z(Zero)標志
- CPSR的第30位是Z碗殷,0標志位;
- 它記錄了某條指令執(zhí)行的結(jié)果是否為0速缨;如果為0锌妻,則Z=1;如果不為0旬牲,則Z=0仿粹;
mov x0 #0x0
adds w0 w0 #0x0
;命令執(zhí)行后,結(jié)果為0x0, Z=1
C(Carry)標志
- CPSR的第29位是C原茅,進位標志吭历;一般情況下,進行無符號數(shù)的運算擂橘;
- 加法運算:當運算結(jié)果產(chǎn)生了進位時(無符號數(shù)溢出)晌区,C=1;否則C=0通贞;
- 減法運算(包括CMP):當運算結(jié)果產(chǎn)生了借位時(無符號數(shù)溢出)朗若,則C=0,否則C=1昌罩;
C標志用來記錄算數(shù)運算時哭懈,產(chǎn)生的無符號溢出的那一位;
加法運算:兩個8位數(shù)相加茎用,如果產(chǎn)生進位遣总,進位為1,則C為1轨功;如果沒有產(chǎn)生進位旭斥,進位則為0,則C為0夯辖;
減法運算:A減去B琉预,如果A比B小董饰,則要向前借一位蒿褂,則C為0圆米;如果A比B大,則不需要借位啄栓,則C為1娄帖;
進位
當兩個數(shù)相加的時候,有可能產(chǎn)生從最高位向前進一位昙楚;比如兩個32位數(shù)據(jù)0xaaaaaaaa+0xaaaaaaaa近速,將產(chǎn)生進位;由于這個進位值無法再32位中保存堪旧,我們就簡單的說削葱,這個進位值丟失了。其實在CPU運算中淳梦,并不會丟失這個運算值析砸,而是記錄咋一個特殊的寄存器位上,ARM就用C標志來記錄這個進位值爆袍。例如:
mov w0,#0xaaaaaaaa首繁;0xa 的二進制是 1010
adds w0,w0,w0; 執(zhí)行后相當于 1010 << 1 進位1(無符號溢出) 所以C標記為 1
adds w0,w0,w0陨囊; 執(zhí)行后相當于 0101 << 1 進位0(無符號沒溢出) 所以C標記 為 0
adds w0,w0,w0弦疮; 重復(fù)上面操作
adds w0,w0,w0
借位
當兩個數(shù)據(jù)做減法運算時,有可能向更高位借位蜘醋;比如兩個32位數(shù)據(jù)0x00000000-0x000000ff胁塞,將產(chǎn)生借位,借位后压语,相當于計算0x100000000-0x000000ff闲先,得到0xffffff01,由于借了一位无蜂,所以用C來標記借位伺糠,C=0。例如
mov w0,#0x0
subs w0,w0,#0xff
subs w0,w0,#0xff
subs w0,w0,#0xff
V(Overflow)標志
- CPSR的28位V斥季,溢出標志位训桶;
- 在進行有符號運算的時候,如果超出了機器所能標示的范圍酣倾,稱為溢出
正數(shù) + 正數(shù) = 負數(shù) => 溢出
9 + 5 = 14沒溢出01001 + 00101 = 01110
12 + 7 = 19 溢出 01100 + 00111 = 10011
負數(shù) + 負數(shù) = 正數(shù) => 溢出
(-9) + (-5) = (-14) 沒溢出 11001 + 11011 = 110010
(-12)+(-7)=-19 溢出 10100+11001=101101
正數(shù) + 負數(shù) !=> 溢出