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

(1)初始值不是0的全局变量

    在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间)。

(2)未初始化的局部变量

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

void function()
{
unsigned char k,j; //k,j都未被初始化
if(k<j) ; 
else{
}
}

(3)函数的优化

实验代码

void function()
{
unsigned char i,j,k;
i=j+k;
}

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

解释:keil对程序进行了优化,由于function的内容并没有任何作用,所以优化时就把这些内容忽略掉。倘若在变量前边加上“volatile”,这部分内容就不会被忽略。

原文地址:https://www.cnblogs.com/amanlikethis/p/3467437.html