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,其处理方法仍然不变。

转载于:https://blog.51cto.com/superguang/212580

ADS下C语言中局部变量的存储位置分配相关推荐

  1. 以太坊智能合约开发:Solidity语言中变量的存储位置与作用域

    在Solidity中,有一些数据类型是引用类型,如: 数组(string和bytes是特殊的数组,也是引用类型) 结构体(struct) 映射(mapping) 在Solidity中使用引用类型的时候 ...

  2. C语言中局部变量和全局变量 变量的存储类别

    C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register)   局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用 ...

  3. A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...

    C语言中局部变量和全局变量_等在内存中的存放位置.doc C 语言中局部变量和全局变量 变量的存储类别static,extern,auto,register 8.8 局部变量和全局变量在讨论函数的形参 ...

  4. c语言中负数的读取和存储,C语言中负数的存储方式

    详细介绍负数的文章: https://blog.csdn.net/daiyutage/article/details/8575248 1.以char类型举例,其取值范围是 -128 ~ 127,即-2 ...

  5. C++下的OpenCV中Mat类型存储的图像格式

    在调用CV进行图像处理时,经常涉及图像格式转换,经常出现原始图像输入后CV_32F与ushort之间的数据差异导致程序报错,可使用std::cout << "dilated_ty ...

  6. C语言中汉字的存储和输出

    C语言中汉字的存储和输出 #include<stdio.h> int main() { int b,a=0; char c[]={"我是"}; //在数组存储为{&qu ...

  7. c语言变量定义位置区别,C语言中变量定义的位置(C89和C99的区别)

    C语言中变量定义的位置(C89和C99的区别) 在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了"哪里使用哪里定义"的这种做法,所以当用C语言进行编程 ...

  8. c语言中静态存储类别是,小议C语言中数据的存储类型

    C语言中的一些说明和定义会用到存储类型这样一个概念,在C语言中存储类型会用到下述几个关键字:auto,static,register,extern. 看下面的简略图大家可以明确程序在进行存储时是分为三 ...

  9. c语言中字符串的加法运算,C语言中字符串的存储和运算

    字符串是程序设计中一个重要的数据结构(在经典的数据结构教材中,字符串是作为一章来独立讲解的,从这里也能看出字符串是程序设计中的一个重要的数据结构),然而C语言中竟然没有专门的字符串变量.C中如何来处理 ...

最新文章

  1. python的QT5:如何用QT5实现菜单
  2. pt-archiver 数据归档bug
  3. java url 本地文件是否存在_我的应用程序知道URL中是否存在文件会一直停止[重复]...
  4. hadoop集群搭建 修改配置文件(三台主机都要配置)
  5. Simulink之大功率晶体管(GTR)
  6. 使用MybatisPlus在实体中添加数据库表中不存在的字段
  7. react ssr php,一文吃透 React SSR 服务端渲染和同构原理
  8. 语音识别现在发展到什么阶段了?
  9. html跳转多个域名自动选择,nginx实现两个域名之间跳转配置
  10. 拓端tecdat|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化
  11. springmvc的运行原理个人见解
  12. ETL调度开发(5)——连接数据库运行数据库命令子程序
  13. 主生产计划 操作教程 用友u8_【用友u8操作教程(用友财务软件u8实际操作教程)】免费在线试用_软件库_选软件网...
  14. Android开发从0到1学习(知识+路线)
  15. Linux Lite下打印机驱动安装及针式打印机校准
  16. WinCE开发流媒体播放器--MPEG4
  17. 服务器pbs傻瓜操作
  18. 接口测试平台代码实现11: 用户管理模块设计和开发
  19. 注册石墨文档无法连接服务器,石墨文档没有访问权限怎么办
  20. 3D打印开源软件Cura分析(1) 【转】

热门文章

  1. LeetCode 17. Letter Combinations of a Phone Number
  2. vs2013中的error c4996的问题
  3. Django 的F查询与Q查询,事物
  4. VMware中CentOS7网卡无法启动故障
  5. linux-压缩与解压缩(gz,zip,tar,jar,war)
  6. Handler Bundle Runnable
  7. tensorflow l2_loss函数
  8. 如何编程实现开启或关闭GPS(转)
  9. jquery.treeview.js树控件的应用
  10. Java通过JDBC来连接SqlServer数据库