最近在分析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,它的作用大概就是為內存做標記,有點兒像個小旗子,插在那裡,表示從這個位置往後,就是干什麼的內存,這個位置往前,禁止訪問。
以上僅僅是我個人的理解,有可能由於記憶的關系有所不一致,請有更了解這塊的大俠給予指正