函數(shù)的局部變量
接下來(lái)我們新建項(xiàng)目,在main.m文件中寫(xiě)下如下代碼
int sum(int a,int b){
return a+b;
}
int main(int argc,char * argv[]){
sum(10,20);
return 0;
}
斷點(diǎn)斷住sum函數(shù).我們看看sum函數(shù)內(nèi)部的匯編.
我們可以看到.sp拉伸了16個(gè)字節(jié).
接下來(lái)我們修改一下代碼在看看sum函數(shù)的匯編
int sum(int a,int b){
int c = 10;
int d = 20;
int f = 30;
return a+b;
}
int main(int argc,char * argv[]){
sum(10,20);
return 0;
}
接來(lái)下sum函數(shù)里面.棧拉伸了32個(gè)字節(jié)(ARM64中對(duì)sp的操作是16字節(jié)對(duì)齊的,也就是16的整數(shù)倍).
那么我們剛才在sum函數(shù)中定義的局部變量,就被放在了函數(shù)的棧空間中.
函數(shù)的局部變量是放在函數(shù)的楃枋希空間中的.
函數(shù)的嵌套調(diào)用
那么剛才的函數(shù)屬于"葉子"函數(shù).也就是說(shuō),這個(gè)函數(shù)內(nèi)部沒(méi)有再調(diào)用其他函數(shù)了.
如果函數(shù)是嵌套調(diào)用會(huì)怎樣呢?我們來(lái)看下下面的案例:
int sum(int a,int b){
int c = 10;
int d = 20;
printf("%d",d);
return a+b;
}
int main(int argc,char * argv[]){
sum(10,20);
return 0;
}
從匯編可以看出.我們一旦是嵌套調(diào)用,就立刻多開(kāi)辟了16個(gè)字節(jié)的空間.
因?yàn)橹灰乔短渍{(diào)用,我們需要保護(hù)x29和x30兩個(gè)寄存器(本函數(shù)調(diào)用的返回地址,"回家的路").
ARM匯編入門(mén)(一) — 進(jìn)制本質(zhì)
ARM匯編入門(mén)(二) — 寄存器&pc&bl指令
ARM匯編入門(mén)(三) — 寄存器&cpu補(bǔ)充
ARM匯編入門(mén)(四) — 棧SP&FP寄存器
ARM匯編入門(mén)(五) — bl&ret函數(shù)的調(diào)用與返回
ARM匯編入門(mén)(六) — 函數(shù)的參數(shù)和返回值
ARM匯編入門(mén)(七) — 函數(shù)的局部變量與嵌套調(diào)用
ARM匯編入門(mén)(八) — 狀態(tài)寄存器
ARM匯編入門(mén)(九) — 內(nèi)存分區(qū)全局變量和局部變量
ARM匯編入門(mén)(十) — 循環(huán)選擇判斷
待續(xù)…