1.函數(shù)的局部變量
定義一個局部變量c耍缴,斷點查看匯編中c的存儲調(diào)用
w0 存儲著10滥酥,w1存儲著20
進funcA中查看
上面的函數(shù)為
葉子函數(shù)
履澳,不再調(diào)用其它的函數(shù)草描,都是基于sp進行操作别瞭,沒有對x29(fp)懂算,x30(lr)進行保護只冻,因為該函數(shù)中沒有對其進行改變。
2.函數(shù)的嵌套調(diào)用
定義2個函數(shù)计技,funcA中調(diào)用sum
斷點查看
與葉子函數(shù)調(diào)用相比發(fā)現(xiàn)多了x29,x30的入棧保護
3.狀態(tài)寄存器
CPU內(nèi)部的寄存器中,有一種特殊的寄存器(對于不同的處理器,個數(shù)和結(jié)構(gòu)都可能不同).這種寄存器在ARM中,被稱為狀態(tài)寄存器就是CPSR(current program status register)寄存器
CPSR和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個寄存器具有一個含義.而CPSR寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息喜德。
CPSR寄存器是32位的
- CPSR的低8位(包括I、F垮媒、T和M[4:0])稱為控制位舍悯,程序無法修改,除非CPU運行于特權(quán)模式下,程序才能修改控制位!
- N、Z睡雇、C萌衬、V均為條件碼標(biāo)志位。它們的內(nèi)容可被算術(shù)或邏輯運算的結(jié)果所改變它抱,并且可以決定某條指令是否被執(zhí)行!意義重大!
3.1 N(Negative)標(biāo)志
CPSR的第31位是 N秕豫,符號標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為負(fù).如果為負(fù)則N = 1,如果是非負(fù)數(shù)則N = 0观蓄。
在ARM64的指令集中,有的指令的執(zhí)行時影響狀態(tài)寄存器的,比如add\sub\or等,他們大都是運算指令(進行邏輯或算數(shù)運算)
3.2 Z(Zero)標(biāo)志
CPSR的第30位是Z混移,0標(biāo)志位。它記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為0蜘腌。如果結(jié)果為0沫屡,那么Z = 1。如果結(jié)果不為0撮珠,那么Z = 0沮脖。
如果為0金矛,則為真,1表示真勺届,Z=1驶俊。
如果不為0,則為假免姿,0表示假饼酿,Z=0。
3.3 C(Carry)標(biāo)志
CPSR的第29位是C胚膊,進位標(biāo)志位故俐。一般情況下,進行
無符號數(shù)的運算
。
加法運算:當(dāng)運算結(jié)果產(chǎn)生了進位時(無符號數(shù)溢出)紊婉,C=1药版,否則C=0。
減法運算(包括CMP):當(dāng)運算時產(chǎn)生了借位時(無符號數(shù)溢出)喻犁,C=0槽片,否則C=1。
-
進位
:我們知道肢础,當(dāng)兩個數(shù)據(jù)相加的時候还栓,有可能產(chǎn)生從最高有效位想更高位的進位。比如兩個32位數(shù)據(jù):0xaaaaaaaa + 0xaaaaaaaa,將產(chǎn)生進位传轰。由于這個進位值在32位中無法保存剩盒,我們就只是簡單的說這個進位值丟失了。其實CPU在運算的時候慨蛙,并不丟棄這個進位制勃刨,而是記錄在一個特殊的寄存器的某一位上。ARM下就用C位來記錄這個進位值股淡。比如身隐,下面的指令
mov w0,#0xaaaaaaaa;0xa 的二進制是 1010
adds w0,w0,w0唯灵; 執(zhí)行后 相當(dāng)于 1010 << 1 進位1(無符號溢出) 所以C標(biāo)記 為 1
adds w0,w0,w0贾铝; 執(zhí)行后 相當(dāng)于 0101 << 1 進位0(無符號沒溢出) 所以C標(biāo)記 為 0
adds w0,w0,w0; 重復(fù)上面操作
adds w0,w0,w0
-
借位
:當(dāng)兩個數(shù)據(jù)做減法的時候埠帕,有可能向更高位借位垢揩。再比如,兩個32位數(shù)據(jù):0x00000000 - 0x000000ff,將產(chǎn)生借位敛瓷,借位后叁巨,相當(dāng)于計算0x100000000 - 0x000000ff。得到0xffffff01 這個值呐籽。由于借了一位锋勺,所以C位 用來標(biāo)記借位蚀瘸。C = 0。比如下面指令
mov w0,#0x0
subs w0,w0,#0xff;產(chǎn)生借位C=0
subs w0,w0,#0xff;不產(chǎn)生借位C=1
subs w0,w0,#0xff;不產(chǎn)生借位C=1
3.4 V(Overflow)溢出標(biāo)志
CPSR的第28位是V庶橱,溢出標(biāo)志位贮勃。在進行
有符號數(shù)運算
的時候,如果超過了機器所能標(biāo)識的范圍苏章,稱為溢出
- 正數(shù) + 正數(shù) 為負(fù)數(shù) 溢出
- 負(fù)數(shù) + 負(fù)數(shù) 為正數(shù) 溢出
- 負(fù)數(shù) - 正數(shù) 為負(fù)數(shù) 溢出
- 正數(shù) + 負(fù)數(shù) 不可能溢出
3.5 CPSR練習(xí)
在main函數(shù)中用內(nèi)聯(lián)匯編寫一段匯編寂嘉,內(nèi)聯(lián)匯編可以直接打斷點
把狀態(tài)寄存器先清零,等會方便查看變化
下面2個圖是實際運行結(jié)果
4. 全局變量和常量
定義一個全局變量g枫绅,字符串常量haha
學(xué)習(xí)一下如何找到他們的內(nèi)存地址
si進入func函數(shù)中
po下結(jié)果
5. 總結(jié)
學(xué)習(xí)了函數(shù)局部變量和函數(shù)嵌套調(diào)用在匯編中的查找調(diào)用泉孩,了解了狀態(tài)寄存器的作用,還有全局變量和常量的地址查找并淋。