C51工具是怎么進(jìn)行覆蓋分析的
C51工具針對(duì)8051微控制器的有限存儲(chǔ)器資源進(jìn)行了優(yōu)化設(shè)計(jì)。
為了最有效地利用存儲(chǔ)器,根據(jù)一個(gè)很容易解釋的方法,自動(dòng)變量和函數(shù)參數(shù)在存儲(chǔ)器中均進(jìn)行覆蓋處理。
首先,連接器根據(jù)源程序生成調(diào)用樹(shù)。例如:
OVERLAY MAP OF MODULE: SAMPLE (SAMPLE)
SEGMENT DATA_GROUP
+--> CALLED SEGMENT START LENGTH
----------------------------------------------
?C_C51STARTUP ----- -----
+--> ?PR?MAIN?SAMPLE
?PR?MAIN?SAMPLE 0009H 0001H
+--> ?PR?GETCHAR?GETCHAR
+--> ?PR?_TOUPPER?TOUPPER
+--> ?PR?PUTCHAR?PUTCHAR
?PR?GETCHAR?GETCHAR ----- -----
+--> ?PR?_GETKEY?_GETKEY
+--> ?PR?PUTCHAR?PUTCHAR
在上例中,我們可以看到?C_C51STARTUP調(diào)用了MAIN函數(shù),MAIN函數(shù)調(diào)用了GETCHAR、TOUPPER和PUTCHAR函數(shù),而GETCHAR調(diào)用了GETKEY和PUTCHAR。
通過(guò)構(gòu)造調(diào)用樹(shù),連接器便可分析出哪些函數(shù)的哪些數(shù)據(jù)段是相斥的,而后覆蓋利用它們。
例如,假設(shè)MAIN C函數(shù)調(diào)用調(diào)用函數(shù)A、函數(shù)B和函數(shù)C。函數(shù)A使用了10字節(jié)的自動(dòng)變量,函數(shù)B使用了20字節(jié)的自動(dòng)變量,而函數(shù)C使用了16字節(jié)的自動(dòng)變量。若函數(shù)A、B和C之間沒(méi)有相互調(diào)用,則它們所使用的存儲(chǔ)器可以進(jìn)行覆蓋利用。因此,相對(duì)于總的46字節(jié)(A使用10+B使用20+C使用16)數(shù)據(jù)存儲(chǔ)器開(kāi)銷來(lái)說(shuō),經(jīng)過(guò)覆蓋利用,最終僅消耗20字節(jié)的數(shù)據(jù)存儲(chǔ)器空間。
覆蓋利用的存儲(chǔ)器空間被稱為DATA_GROUP、BIT_GROUP和XDATA_GROUP。