arm64匯編篇-07cpsr狀態寄存器

狀態寄存器

? ? CPU內部的寄存器中,有一種特殊的寄存器(對于不同的處理器,個數和結構都可能不同).這種寄存器在ARM中,被稱為狀態寄存器就是CPSR(current program status register)寄存器

? ? CPSR和其他寄存器不一樣,其他寄存器是用來存放數據的,都是整個寄存器具有一個含義.而CPSR寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息.

cpsr特點

1.CPSR寄存器是32位的.

2.CPSR的低8位(包括I、F、T和M[4:0])稱為控制位,程序無法修改,除非CPU運行于特權模式下,程序才能修改控制位!

3.N、Z、C、V均為條件碼標志位。它們的內容可被算術或邏輯運算的結果所改變,并且可以決定某條指令是否被執行!意義重大!

4.32位圖解如下

NZCV介紹

N(Negative)標志

CPSR的第31位是 N,符號標志位。它記錄相關指令執行后,其結果是否為負.如果為負 N = 1,如果是非負數 N = 0.


??注意,在ARM64的指令集中,有的指令的執行時影響狀態寄存器的,比如add\sub\or等,他們大都是運算指令(進行邏輯或算數運算);

Z(Zero)標志

CPSR的第30位是Z,0標志位。它記錄相關指令執行后,其結果是否為0.如果結果為0.那么Z = 1.如果結果不為0,那么Z = 0.

?對于Z的值,我們可以這樣來看,Z標記相關指令的計算結果是否為0,如果為0,則N要記錄下是0這樣的肯定信息.在計算機中1表示邏輯真,表示肯定.所以當結果為0的時候Z = 1,表示結果是0.如果結果不為0,則Z要記錄下不是0這樣的否定信息.在計算機中0表示邏輯假,表示否定,所以當結果不為0的時候Z = 0,表示結果不為0。

C(Carry)標志

CPSR的第29位是C,進位標志位。一般情況下,進行無符號數的運算。加法運算:當運算結果產生了進位時(無符號數溢出),C=1,否則C=0。減法運算(包括CMP):當運算時產生了借位時(無符號數溢出),C=0,否則C=1。

?對于位數為N的無符號數來說,其對應的二進制信息的最高位,即第N - 1位,就是它的最高有效位,而假想存在的第N位,就是相對于最高有效位的更高位。如下圖所示:

V(Overflow)溢出標志

CPSR的第28位是V,溢出標志位。在進行有符號數運算的時候,如果超過了機器所能標識的范圍,稱為溢出。

? ??注意:運算規則

正數 + 正數 為負數 溢出

負數 + 負數 為正數 溢出

正數 + 負數 不可能溢出

相關概念介紹

進位

?我們知道,當兩個數據相加的時候,有可能產生從最高有效位想更高位的進位。比如兩個32位數據:0xaaaaaaaa + 0xaaaaaaaa,將產生進位。由于這個進位值在32位中無法保存,我們就只是簡單的說這個進位值丟失了。其實CPU在運算的時候,并不丟棄這個進位制,而是記錄在一個特殊的寄存器的某一位上。ARM下就用C位來記錄這個進位值。比如,下面的指令:

mov w0,#0xaaaaaaaa;0xa 的二進制是 1010

adds w0,w0,w0; 執行后 相當于 1010 << 1 進位1(無符號溢出) 所以C標記 為 1

adds w0,w0,w0; 執行后 相當于 0101 << 1 進位0(無符號沒溢出) 所以C標記 為 0

adds w0,w0,w0; 重復上面操作\nadds w0,w0,w0

注:adds subs 等后面加s代表其運算會影響標記寄存器

借位

?當兩個數據做減法的時候,有可能向更高位借位。再比如,兩個32位數據:0x00000000 - 0x000000ff,將產生借位,借位后,相當于計算0x100000000 - 0x000000ff。得到0xffffff01 這個值。由于借了一位,所以C位 用來標記借位。C = 0.比如下面指令:

mov w0,#0x0

subs w0,w0,#0xff ;

subs w0,w0,#0xff

subs w0,w0,#0xff

真機實踐:

1.c語言中使用匯編代碼方法:1)在方法中加asm()如下

void func()

{

? ? asm(

? ? ? ? ? ? "mov w0,#0x0\n" ? //這區域中寫匯編代碼 換行用\n

}

2).創建匯編文件command + n 選擇assembly 文件寫匯編代碼,詳情見http://www.lxweimin.com/p/9f63cb7a334c? 這里就不重復介紹了。

2.cpsr作用實例:輸入以下代碼

/** 狀態寄存器 cpsr */

void cpsrFunc(){

? ? /**1. cpsr的作用 */?

? ? ?int a = 1;? ?

? ? ?int b = 2;? ?

? ? if (a == b) {? ? ?

? ? ? ? printf("a==b");?

? }? ? else? ? {? ? ? ?

? ? ? ?printf("a!=b"); ? ?

? ?}

}

運行結果如下圖:

在判斷結束并未執行的時候修改寄存器如下圖:

1)先切換成查看匯編模式

2)設置斷點并修改cpsr寄存器值

3)運行結果

3.N(negative)標志實例:

1)cpsrFunc方法中輸入以下代碼:

/** 2. negative標志符 */? ?

asm(? ?

? ? "mov w0,#0xffffffff\n"?

? ? ? "adds w0,w0,#0x0\n"?

? ? ? );

2)匯編調試

如圖0xffffffff在計算符號時候為負數,現在改成0x0fffffff看結果這個在有符號中為正數。

4.Z標志實例

1)cpsrFunc方法輸入以下代碼

/** 3. zero標志符 */

asm(?

? ? ? "mov w0,#0x0\n"? ? ?

? "adds w0,w0,#0x0\n"? ? ? ?

);

2)執行代碼效果:

3)將相加值修改成大于0 #0x1

5.C標志實例

注:C位主要是無符號的進位和借位問題,上文已經講了,這邊可以系統的理解。

1)進位當相加超限會進1,例如11 + 1 = 100 其中1超限被保存在c位,所以c位為1。

2)借位就是不夠減從前面借一位前面會多出1,例如 00 - 1 為100 - 1 = 11,同理憑空而生的1也保存在c位,所以得到借位為1,進位為1其他為0的結論,如果不理解可以死記。

代碼上面在介紹進位借位已經寫明大家可以自己嘗試。

6.V標志實例。

注:這邊是在有符號位運算。

1)cpsrFunc方法輸入以下代碼

?/** 5. overflow v位標志符號 */?

? asm(? ? ? ?

"mov w0,#0x7fffffff\n"? ? ?

? "adds w0,w0,#0x2\n"? ? ?

? "mov w0,#0x80000000\n"? ? ?

? "subs w0,w0,#0x2\n"? ? ?

? );

2)運行結果

注:mac計算器功能很強大是很好輔助工具。

如上圖當v位滿足正正得負 負負得正的情況下v位為1否則為0。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容