ADS下C語言中局部變量的存儲位置分配

ADS下C語言中局部變量的存儲位置分配 發佈:xlander | 發佈時間: 2008年8月12日

做研發很多年了,起初開發的軟件都是在臺式機上運行的,臺式機上豐富的資源從來沒讓我仔細的思考過有關變量的分配問題。做嵌入式系統的開發是最近兩年的事兒,最近系統總是出現莫名其妙的錯誤,開始關注有關堆棧溢出的問題,特意考察一下ADS下C語言局部變量的分配問題。

按照一般教科書上的說法,C語言中的局部變量應該是分配在"棧"中的。而實際情況,有些出入,看看我下面的調試紀錄,肯能更容易理解。

這是我寫的一段代碼,唯一的用途,就是分配變量。

int func1(void)
{
int father;
int mother;
int boy;
int girl;
father = 30;
mother = boy = girl = father;
return father;
}

int func2(void)
{
int father;
int mother;
int boy;
int girl;
int unnecessary;
father = 30;
mother = boy = girl = father;
unnecessary = 0;
return father;
}

int func3(void)
{
int stone[2];
stone[0] = 30;
return stone[0];
}

int func4(void)
{
int stone[2];
stone[0] = 30;
if (stone[0] == 30)
{
int father;
father = 91;
}
else
{
int mother;
mother = 90;
}
return stone[0];
}

int func5(void)
{
int stone[2];
stone[0] = 30;
if (stone[0] == 30)
{
int boy[2];
boy[0] = 91;
}
else
{
int girl[2];
girl[0] = 90;
}
return stone[0];
}

int func10(int a, int b, int c, int d)
{
return a + b + c + d;
}

int func11(int a, int b, int c, int d)
{
int father = a;
int mother = b;
int boy = c;
int girl = d;
return father + mother + boy + girl;
}

typedef struct Home
{
int father;
int mother;
} THome;
int func12()
{
THome home;
home.father= 12;
home.mother = 12;
return home.father + home.mother;
}

typedef int uint32;
int func13()
{
uint32 home = 2;
home *= 2;
return home;
}

int main(void)
{
func1();
func2();
func3();
func4();
func5();

func10(1,2,3,4);
func11(1,2,3,4);
func12();
func13();
}

通常,ADS編譯的代碼使用R13作爲堆棧指針,也就是SP。

先看看剛進入main()函數的時候,R13=0x08000000。

單步執行一步後,R13=0x07FFFFC。減少了4字節,PC入棧引起。

進入fun1()後,R13=0x07FFFFC。沒有變化,說明這幾個變量沒有入棧,實際上他們分別分配在R0-R3。

進入fun2()後,R13=0x07FFFF8。比0x07FFFFC少4字節,前4個仍然分配在R0-R3,第5個變量入棧。

進入fun3()後,R13=0x07FFFF0。比0x07FFFFC少12字節,除了數組入棧外,還有PC。

進入fun4()後,R13=0x07FFFF0。跟func4()一樣,數組和PC入棧,分支中的變量放在R0中。

進入fun5()後,R13=0x07FFFE8。比fun4()少8字節,說明分支中的數組也入棧了。

進入fun10()後,R13=0x07FFFFC。4個函數形參也是分配在R0-R3。

進入fun11()後,R13=0x07FFFEC。比0x07FFFFC少16字節,4個形參仍然分配在R0-R3,另外4個變量入棧。

進入fun12()後,R13=0x07FFFF0。跟func4()一樣,結構體變量也是入棧的。

進入fun13()後,R13=0x07FFFFC。沒有變化,char、int這些變量即使經過typedef,其處理方法仍然不變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章