keil對51單片機變量和函數(shù)的編譯處理
(1)初始值不是0的全局變量
在程序調(diào)到main()函數(shù)執(zhí)行前,除了要進行內(nèi)存清零、初始化堆棧外,還需要將全局變量的初始值加載到RAM的指定區(qū)域(編譯過程中為全局變量分配的空間)。
(2)未初始化的局部變量
實際的編譯后的反匯編程序也看不到這些局部變量的初始化。這些局部變量占據(jù)哪些還未被使用的內(nèi)存或者其他函數(shù)中局部變量釋放的空間。倘若是后者,其他函數(shù)局部變量釋放的空間并沒有清零,所以使用這些釋放空間的局部變量就一開始被賦值了,這是需要程序員小心的。
voidfunction(){unsignedchark,j;//k,j都未被初始化if(k(3)函數(shù)的優(yōu)化
實驗代碼
voidfunction(){unsignedchari,j,k;i=j+k;}
編譯結(jié)果:如下函數(shù)的內(nèi)容經(jīng)過keil的編譯后,就變成了“REI”,也就是說function的內(nèi)容全被忽略掉。
解釋:keil對程序進行了優(yōu)化,由于function的內(nèi)容并沒有任何作用,所以優(yōu)化時就把這些內(nèi)容忽略掉。倘若在變量前邊加上“volatile”,這部分內(nèi)容就不會被忽略。