2012-03-10 37 views
1

我知道,程序的BSS部分存儲全局未初始化的變量。那麼爲什麼我(在分支指令「clearzi」中的啓動代碼內部)必須檢查該部分大小是否等於「0」,然後繼續?我發現這部分的啓動代碼,這是我需要了解的。BSS部分和clearzi

LDR r0, =__gnu_bssstart 
    LDR r1, =__gnu_bssend 
    MOV r2, #0 

clearzi: 
    CMP r0, r1 
    BEQ clearzi_exit 
    STR r2, [r0] 
ADD r0, r0, #4 
    B clearzi 

clearzi_exit: 

這只是啓動代碼的一小部分。

回答

2

此代碼片段清除BSS部分。它轉化爲

for (int* p = __gnu_bssstart; p < __gnu_bssend; ++p) *p=0; 

如果大小爲零,條件是不正確的,因此初始化部分被跳過。

+0

我明白**如何**此功能檢查BSS部分的結束是否等於BSS部分的開始,但我不知道**爲什麼**會有人去檢查此? **爲什麼這個這麼重要?是否有可能,這是我們如何檢查程序是否剛剛開始,因爲在atartup中沒有初始化變量,這些變量在BSS部分中都是通用的? – 71GA 2012-03-11 10:01:10

+1

此架構保證在程序啓動之前清除BSS。這是爲了保證,如果程序在寫入BSS之前從位於BSS中的變量中讀取,則返回零。 – hirschhornsalz 2012-03-11 20:02:39

+1

@ 71GA此外,如果BSS是零大小,這不是檢查。這是一個循環,如果BSS大小爲零,則該循環不會執行。 – hirschhornsalz 2012-03-11 20:08:40