.balignl 16,0xdeadbeef淺析
最近在分析u-boot的源代碼,看到這一行:
.balignl 16, 0xdeadbeef
不知道為什么要這樣寫,0xdeadbeef,明顯是個單詞組,寫在這里有何意義呢?查閱了眾多資料的時候才晃然大悟。
下面我一步步來說明:
首先要弄明白.balignl的意思,這其實應該算是一個偽操作符,偽操作符的意思就是機器碼里,並沒有一個匯編指令與其對應,是由編譯器來實現其功能的。
.balign是意思是:以當前地址為開始開始,找到第一次出現的以第一個參數為整數倍的地址,並將其作為結束地址,在這個結束地址前面存儲一個字節長度的數據,存儲內容正是第二個參數。如果當前地址正好是第一個參數的倍數,則沒有數據被寫入到內存。
.balign 8, 0xde這條指令的含義可以用下圖表示:
圖解:以當前地址為開始開始,找到第一次出現的以8為整數倍的地址,並將其作為結束地址,在這個結束地址前面存儲一個字節長度的數據0xde。如果當前地址正好是8的倍數,則沒有數據被寫入到內存。
以此類推,.balignw則表示第二個參數存入的內容長度為2字節:
.balignw 4, 0x368d
因為現在填入的內容為2個字節,那就存在以下幾種情況:
l 當前地址沒有偏移就滿足了以4為倍數的地址
l 當前地址偏移了1個字節就滿足了以4為倍數的地址
l 當前地址偏移了2個字節就滿足了以4為倍數的地址
l 當前地址編移了3個字節就滿足了以4為倍數的地址
分析一下這四種情況:
l 當沒有偏移的時候,地址中間肯定沒有辦法填上信息
l 當偏移1個字節的時候,地址中間空隙不夠,所以填入的數值,是末定義,也就是說,填入什么值,不清楚
l 當偏移2個字節的時候,地址中間的空隙正好填入0x368d兩個字節的內容
l 當偏移3個字節的時候,地址中間的空隙大於所要填的內容。此時填入的數值,是末定義,填入什么值,不清楚
以此類推,.balignl,這個指令用來填與一個字,即4個字節的長度
仔細分析一下就知道,對於.balignl 16, 0xdeadbeef,如果想要0xdeadbeef一定填到當前地址后面某個部分,當前地址偏移量就必須為4字節,這樣才能保證在任何情況下,偏移的地址所留的空隙剛好填入所要填的內容。
注意:0xdeadbeef是什么意思?
類似這樣的值很多,像0xabababab,它們的作用就是為內存做標記,插在那里,就表示從這個位置往后的一段有特殊作用的內存,而這個位置往前,禁止訪問。