歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

U-Boot中的.balignl 16,0xdeadbeef的理解

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

.balignl 16,0xdeadbeef

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

相關閱讀:U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

下面我一步步來說明:

首先要弄明白.balignl的意思,這個其實應該算是一個偽操作符,偽操作符的意思就是機器碼裡,並沒有一個匯編指令與其對應,是編譯器來實現其功能的。.balignl是.balign的變體,.balign是意思是,在以當前地址開始,地址計數器必須是以第一個參數為整數倍的地址為尾,在前面記錄一個字節長度的信息,信息內容為第二個參數。

.balign 8, 0xde

它的意思就是在以當前地址開始,在地址為8的倍數的位置的前面填入一個字節內容為0xde的內容。如果當前地址正好是8的倍數,則沒有東西被寫入到內存。

那麼以此類推,.balignw則表示第二個參數存入的內容長度為一個字長,即16位,所以一般有這樣的形式出現:

.balignw 4,0x368d

因為現在填入的內容為16位了,那就存在以下幾種情況

1.當前地址沒有偏移就滿足了以4為倍數的地址

2.當前地址偏移了1個字節就滿足了要求

3.當前地址偏移了2個字節就滿足了要求

4.當然地址編移了3個字節就滿足了要求

當沒有偏移的時候,地址中間肯定沒有辦法填上信息;
當偏移1個字節的時候,地址中間空隙不夠,所以填入的數值,是末定義,也就是說,填入的什麼值,不清楚;
當偏移為2個字節的時候,地址中間的空隙正好填入手面的數據,所以就填上了;
當偏移為3個字節的時候,地址中間的空隙大於所要填的內容。手冊上給的定義是末定義,在我的理解,其實這個未定義,是指這三個偏移的地址整體的內容是末知的。但是其中必定含有要填的2個字節,只是另一個被填充的字節內容不知道而已

所以以此類推,

.balignl,這個指令用來填與一個長字,即內容長度為長字,即4個字節的長度

如果仔細分析一下填入的情況就知道,如果想要0xdeadbeef一定填到當前地址後面某個部分,就一定得是偏移量為16字節才行,這樣才能保證在任何情況下,偏移的地址所留的空隙都能填入所要填的內容。

那0xdeadbeef是什麼意思呢?經過我查找才發現,類似這樣的值很多,像0xabababab,它的作用大概就是為內存做標記,有點兒像個小旗子,插在那裡,表示從這個位置往後,就是干什麼的內存,這個位置往前,禁止訪問。


以上僅僅是我個人的理解,有可能由於記憶的關系有所不一致,請有更了解這塊的大俠給予指正 

Copyright © Linux教程網 All Rights Reserved