2014-01-31 54 views
5

我試過尋找這個答案,但找不到明確的原因。爲什麼使用數據而不是xdata顯着減少代碼空間

我想優化一些8051 C代碼以減少代碼空間。我做了如下改變..

xdata unsigned char a, b; 

data unsigned char a, b; 

...看到我的代碼大小由39Bytes(感覺像聖誕節)減少。

來源:程序大小:數據= 9.0 ...碼= 10509

到:程序大小:數據= 11.0 ...碼= 10468

問:爲什麼在代碼空間減少了這麼多對於這樣的小改變?

+0

我知道使用數據可以通過不必使用DPTR訪問內存來保存指令。但是39Bytes比預期的要多。 – user968722

+0

這取決於您使用該變量的程度。它重載值越大,代碼越大 –

+0

這看起來很像彙編器,而不是C ... – RedX

回答

4

這取決於你如何使用(以及你使用多少次)這些變量。 xdata需要16位尋址,並佔用更多空間。只是作爲一個例子,在一個固定的地址加載到儲液器的值取與XDATA兩倍代碼空間,因爲它與數據的作用:

負載累加器與30H值(數據):

MOV A, 30h  ; 2 bytes 

與負載值累加器在1230h(XDATA):從數據到數據

MOV DPTR, #1230h ; 3 bytes 
MOVX A, @DPTR ; 1 byte 

複製有三個字節(MOV direct, direct),從XDATA複製到XDATA可能需要八個字節(MOV DPTR, #addr1; MOVX; MOV DPTR #addr2; MOVX)。如果您多次訪問這些變量並且編譯器無法優化其與寄存器的使用,則它可以快速加起來。

+0

謝謝。這可以解釋爲什麼當我使用數據而不是xdata時,編譯器並不總是優化代碼。所以我想這取決於編譯器已經優化了多少(Keil Level 9非常高效)以及變量被訪問多少。 – user968722

+1

再一次,它真的取決於你的算法對這些變量做什麼。快速用完寄存器後,編譯器無法做更多的事情來加快內存訪問速度。我們也使用Keil,並且我們總是看到像這樣的大跳躍。總是使用小型模型,並根據需要將少用或大變量移至xdata以騰出空間。你會以更快,更緊湊的代碼結束。 –

+0

謝謝。是的,我已經看到了Keil的隨機跳躍。我希望我知道如何每次擊敗編譯器。但它似乎太隨意了。 – user968722

相關問題