http://blog.csdn.net/zhangqingsup/article/details/6026776
最近在分析u-boot的源代碼,看到這一行:
.balignl 16,0xdeadbeef
不理解了,不知道爲什麼要這樣寫,0xdeadbeef,明顯是個單詞組,寫在這裏有何意義呢?然後在查閱了衆多資料的時候才晃然大悟。
下面我一步步來說明:
首先要弄明白.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,它的作用大概就是爲內存做標記,有點兒像個小旗子,插在那裏,表示從這個位置往後,就是幹什麼的內存,這個位置往前,禁止訪問。