1. 棧
1.1 棧的概念
??棧是一種具有特殊訪問方式的存儲空間(后進(jìn)先出)趁桃。
1.2 棧中最重要的兩個(gè)寄存器
??SP寄存器:棧頂寄存器逢防,在任意時(shí)刻都會保存棧頂?shù)牡刂贰?br> ??FP寄存器:棧底寄存器(也稱為x29寄存器震捣,屬于通用寄存器直秆,在某些時(shí)刻利用它來保存棧底的地址)
??注意:ARM64中對棧的操作是16字節(jié)對齊的蔫劣,寄存器存儲空間是8字節(jié)大小的船庇,也就是128bit
1.3 棧的讀寫指令
- 讀指令:ldr(load register)吭产、LDR 、LDP鸭轮,將內(nèi)容讀取到寄存器中臣淤。
- 寫指令:str(store register)、STR窃爷、STP邑蒋,將寄存器其中的值存儲到內(nèi)存中
1.4 匯編練習(xí)
- 指令
1. sub sp, sp, #0x10 ;拉伸16個(gè)字節(jié)大小的棧空間
2. stp x29, x30, [sp, #0x10] ;往sp所在位置向高地址方向分別存儲x29以及x30的值 - 簡寫形式:stp x29, x30, [sp, #-0x10]! (不需要額外的棸蠢澹空間的時(shí)候可以這么寫医吊,!的意思是將[]中運(yùn)算的結(jié)果保存到sp寄存器中)。(這句匯編應(yīng)該是先寫入逮京,再拉伸椙涮茫空間)
注意:在ARM64中棧的開口方向是由高地址向低地址的,保存寄存器的值是從棧底開始存儲的造虏。
2. bl指令
- bl指令:跳轉(zhuǎn)指令御吞,表示程序執(zhí)行到標(biāo)號處麦箍,會將下一條指令的地址保存到lr寄存器中。b代表跳轉(zhuǎn)陶珠,l代表lr(x30寄存器)挟裂。
3. ret指令
??ret指令:返回指令,類似函數(shù)中的return揍诽,讓cpu執(zhí)行l(wèi)r寄存器所指向的指令诀蓉。
**??注意:函數(shù)內(nèi)部調(diào)用函數(shù)的時(shí)候就需要保護(hù)現(xiàn)場,在ret指令調(diào)用之前暑脆,將之前存在棧中的lr寄存器的值取出來賦值給lr寄存器 **
4. 函數(shù)的參數(shù)
??在ARM64中渠啤,參數(shù)是存放在x0到x7這8個(gè)寄存器中的。
注意:如果是浮點(diǎn)數(shù)添吗,就會用浮點(diǎn)寄存器沥曹,如果超過8個(gè)參數(shù),就會使用棧傳遞參數(shù)
5. 函數(shù)的返回值
??在ARM64中碟联,一般函數(shù)的返回值是使用x0寄存器保存的妓美。
注意:如果返回值大于8個(gè)字節(jié),就會利用內(nèi)存?zhèn)鬟f返回值鲤孵。
??在函數(shù)的編寫過程中壶栋,參數(shù)一般都不應(yīng)超過8個(gè),返回值的字節(jié)大小也不應(yīng)大于8字節(jié)普监,因?yàn)闀档托?/p>