.balignl 16,0xdeadbeef淺析


.balignl 16,0xdeadbeef淺析

    最近在分析u-boot的源代碼,看到這一行:

        .balignl 16, 0xdeadbeef

    不知道為什么要這樣寫,0xdeadbeef,明顯是個單詞組,寫在這里有何意義呢?查閱了眾多資料的時候才晃然大悟。

    下面我一步步來說明:

    首先要弄明白.balignl的意思,這其實應該算是一個偽操作符,偽操作符的意思就是機器碼里,並沒有一個匯編指令與其對應,是由編譯器來實現其功能的

    .balign是意思是:以當前地址為開始開始,找到第一次出現的以第一個參數為整數倍的地址,並將其作為結束地址在這個結束地址前面存儲一個字節長度的數據,存儲內容正是第二個參數。如果當前地址正好是第一個參數的倍數,則沒有數據被寫入到內存。

.balign 8, 0xde這條指令的含義可以用下圖表示:

 

.balignl 16,0xdeadbeef淺析 - U-BOOT - 少即是多,慢即是快!

  

    圖解:以當前地址為開始開始,找到第一次出現的以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,它們的作用就是為內存做標記,插在那里,就表示從這個位置往后的一段有特殊作用的內存,而這個位置往前,禁止訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM