我曾經通過查看反匯編代碼對KEILC編譯器進行了測試,大概有這么一下內容,也得出一些結論。
(1)全局變量:如果程序中定義了全局變量,而且初始值不是0。此時,在程序調到main()函數執(zhí)行前,除了要進行內存清零、初始化堆棧外,還需要將全局變量的初始值加載到內存的指定區(qū)域(編譯過程中為全局變量分配的空間)。
(2)局部變量:局部變量通常使用那些緩沖內存(用作保存運算過程的中間數據)。初始化的局部變量,通常程序中都會對用到的緩沖內存重新賦值。
但是,對于沒有初始化的局部變量需要注意“無知情的情況下被賦了值”。下邊的子函數中定義了變量,但是并未初始化。按照標準C語言的準則,未初始化的變量的初值默認是0,但是KEIL對未初始化的局部變量的處理不是這樣的。
voidfunction()
{
unsignedchark,j;
if(k
}
}
實際的編譯后的反匯編程序看不到對這些局部變量的初始化。這些局部變量可能會占據那些還未被使用的內存或者其他子函數中局部變量已經釋放的空間(但是這些空間可能并沒有清零)。倘若是后者,其他函數局部變量釋放的空間由于并沒有清零,所以這些局部變量就一開始被賦了不能預先知道的值,這是不希望看到的。所以如果使用一個局部變量,就給這個變量賦個初值。
(3)謹防程序在“無知情的情況下被優(yōu)化”。如下函數的內容經過keil的編譯后,就變成了“REI”。也就是說function的內容全被忽略掉。解釋:keil對程序進行了優(yōu)化,由于function的內容并沒有任何作用,所以優(yōu)化時就把這些內容忽略掉。倘若在變量前邊加上volatile”,這部分內容就不會被忽略。
voidfunction()
{
unsignedchari,j,k;
i=j+k;
}
總結如收功 練功不收功 到老一場空





