完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
按照一般教科书上的说法,C语言中的局部变量应该是分配在“栈”中的。而实际情况,有些出入录,肯能更容易理解。
这一段代码,唯一的用途,就是分配变量。 int func1(void) { volatile int father; volatile int mother; volatile int boy; volatile int girl; father = 30; mother = boy = girl = father; return father; } int func2(void) { volatile int father; volatile int mother; volatile int boy; volatile int girl; volatile int unnecessary; father = 30; mother = boy = girl = father; unnecessary = 0; return father; } int func3(void) { volatile int stone[2]; stone[0] = 30; return stone[0]; } int func4(void) { volatile int stone[2]; stone[0] = 30; if(stone[0] == 30) { volatile int father; father = 91; } else { volatile int mother; mother = 90; } return stone[0]; } int func5(void) { volatile int stone[2]; stone[0] = 30; if(stone[0] == 30) { volatile int boy[2]; boy[0] = 91; } else { volatile 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) { volatile int father = a; volatile int mother = b; volatile int boy = c; volatile 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,其处理方法仍然不变。 |
|
|
|
只有小组成员才能发言,加入小组>>
12180 浏览 2 评论
4499 浏览 3 评论
3750 浏览 5 评论
9754 浏览 47 评论
4592 浏览 9 评论
745浏览 0评论
555浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:40 , Processed in 0.645250 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号