arm汇编:.balignl伪指令理解
首先要弄明白.balignl的意思,這個其實(shí)應(yīng)該算是一個偽操作符,偽操作符的意思就是機(jī)器碼里,并沒有一個匯編指令與其對應(yīng),是編譯器來實(shí)現(xiàn)其功能的。.balignl是.balign的變體。
.balign是意思是,以當(dāng)前地址開始,以第一個參數(shù)為整數(shù)倍的地址為尾,1個字節(jié)1字節(jié)的填充第二個參數(shù)值(第二個參數(shù)也是1個字節(jié)的值)。
.balign 8, 0xde
解釋:以當(dāng)前地址開始,逐字節(jié)的往地址單元中填入0xde值,直到遇到第一個地址為8的倍數(shù)。如果當(dāng)前地址(pc值)正好是8的倍數(shù),則沒有東西被寫入到內(nèi)存。
那么以此類推,.balignw則表示逐半字(2個字節(jié))的填充,第二個參數(shù)是2個字節(jié)的值,所以一般有這樣的形式出現(xiàn):
.balignw 4,0x368d
因?yàn)楝F(xiàn)在填入的內(nèi)容為16位了,那就存在以下幾種情況
1.當(dāng)前地址沒有偏移就滿足了以4為倍數(shù)的地址
2.當(dāng)前地址偏移了1個字節(jié)就滿足了要求
3.當(dāng)前地址偏移了2個字節(jié)就滿足了要求
4.當(dāng)然地址編移了3個字節(jié)就滿足了要求
當(dāng)沒有偏移的時候,地址中間肯定沒有辦法填上信息;
當(dāng)偏移1個字節(jié)的時候,地址中間空隙不夠,所以填入的數(shù)值,是末定義,也就是說,填入的什么值,不清楚;
當(dāng)偏移為2個字節(jié)的時候,地址中間的空隙正好填入手面的數(shù)據(jù),所以就填上了;
當(dāng)偏移為3個字節(jié)的時候,地址中間的空隙大于所要填的內(nèi)容。手冊上給的定義是末定義,在我的理解,其實(shí)這個未定義,是指這三個偏移的地址整體的內(nèi)容是末知的。但是其中必定含有要填的2個字節(jié),只是另一個被填充的字節(jié)內(nèi)容不知道而已
所以以此類推,就知道.balignl的作用了。
在u-boot的start.S匯編代碼中最下面一條對齊指令:
.globl _start //u-boot啟動入口 _start: b ldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq_undefined_instruction: .word undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq.balignl 16,0xdeadbeef其中:
.globl _start? //不占內(nèi)存
_start:?b?????? start_code //占4字節(jié)內(nèi)存
?ldr?pc, _undefined_instruction //占4字節(jié)內(nèi)存
?ldr?pc, _software_interrupt //占4字節(jié)內(nèi)存
?ldr?pc, _prefetch_abort //占4字節(jié)內(nèi)存
?ldr?pc, _data_abort //占4字節(jié)內(nèi)存
?ldr?pc, _not_used //占4字節(jié)內(nèi)存
?ldr?pc, _irq //占4字節(jié)內(nèi)存
?ldr?pc, _fiq //占4字節(jié)內(nèi)存
占了4x8=32字節(jié)內(nèi)存。
_undefined_instruction:?.word undefined_instruction //占4字節(jié)內(nèi)存
_software_interrupt:?.word software_interrupt //占4字節(jié)內(nèi)存
_prefetch_abort:?.word prefetch_abort //占4字節(jié)內(nèi)存
_data_abort:??.word data_abort //占4字節(jié)內(nèi)存
_not_used:??.word not_used //占4字節(jié)內(nèi)存
_irq:???.word irq //占4字節(jié)內(nèi)存
_fiq:???.word fiq //占4字節(jié)內(nèi)存
占了4x7=28字節(jié)內(nèi)存。
所以在這個.balignl 16,0xdeadbeef指令之前,一共占了32+28=60bytes的內(nèi)存,用.balignl 16,0xdeadbeef在地址60后填充4個字節(jié)的數(shù)據(jù)(0xdeadbeef),把當(dāng)前指針往后移到地址為64的位置,起到對齊的作用!
補(bǔ)充:
.balignl 完整指令格式為:?
.balignl?{alignment}?{,fill}?{,max}。
第一個參數(shù)alignment為一個正整數(shù),以alignment的值的整數(shù)倍為結(jié)束地址進(jìn)行對齊,以當(dāng)前地址為起始地址,進(jìn)行字節(jié)填充,比如當(dāng)前地址為20,而alignment的值我們設(shè)定為16,那么字節(jié)填充自20開始,結(jié)束于20后第一個16的倍數(shù)地址處,即32處。
第二個參數(shù)fill即我們選定的,用來填充的數(shù)值。balignl模式下為4字節(jié),不夠4字節(jié)系統(tǒng)會自動補(bǔ)夠4字節(jié),此參數(shù)可選,不標(biāo)則采用默認(rèn)值0。
第三個參數(shù)max也是可選項(xiàng),默認(rèn)值為alignment。若對齊時偏移量大于max,則不偏移。同上例,從16--32,偏移量為16,如果max我們設(shè)置為8,那么該偏移不進(jìn)行。
參考:https://www.xuebuyuan.com/3121739.html
?
?
?
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的arm汇编:.balignl伪指令理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arm汇编指令:ldr和adr的区别
- 下一篇: Makefile中的MAKECMDGOA