[51单片机] keil对51单片机变量和函数的编译处理

[复制链接]
 楼主| functions 发表于 2019-10-21 10:57 | 显示全部楼层 |阅读模式
(1)初始值不是0的全局变量
    在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间)。

 楼主| functions 发表于 2019-10-21 10:58 | 显示全部楼层
(2)未初始化的局部变量

    实际的编译后的反汇编程序也看不到这些局部变量的初始化。这些局部变量占据哪些还未被使用的内存或者其他函数中局部变量释放的空间。倘若是后者,其他函数局部变量释放的空间并没有清零,所以使用这些释放空间的局部变量就一开始被赋值了,这是需要程序员小心的。

  1. void function()
  2. {
  3. unsigned char k,j; //k,j都未被初始化
  4. if(k<j) ;
  5. else{
  6. }
  7. }
 楼主| functions 发表于 2019-10-21 10:58 | 显示全部楼层
(3)函数的优化

实验代码

  1. void function()
  2. {
  3. unsigned char i,j,k;
  4. i=j+k;
  5. }


编译结果:如下函数的内容经过keil的编译后,就变成了“REI”,也就是说function的内容全被忽略掉。

解释:keil对程序进行了优化,由于function的内容并没有任何作用,所以优化时就把这些内容忽略掉。倘若在变量前边加上“volatile”,这部分内容就不会被忽略。
hobbye501 发表于 2019-10-21 12:59 | 显示全部楼层
大部分编译器。。。都会赋初值的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部