日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arm汇编:.balignl伪指令理解

發布時間:2024/10/14 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm汇编:.balignl伪指令理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

.balign是意思是,以當前地址開始,以第一個參數為整數倍的地址為尾,1個字節1字節的填充第二個參數值(第二個參數也是1個字節的值)。

.balign 8, 0xde

解釋:以當前地址開始,逐字節的往地址單元中填入0xde值,直到遇到第一個地址為8的倍數。如果當前地址(pc值)正好是8的倍數,則沒有東西被寫入到內存。

那么以此類推,.balignw則表示逐半字(2個字節)的填充,第二個參數是2個字節的值,所以一般有這樣的形式出現:

.balignw 4,0x368d

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

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

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

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

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

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

所以以此類推,就知道.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? //不占內存
_start:?b?????? start_code //占4字節內存
?ldr?pc, _undefined_instruction //占4字節內存
?ldr?pc, _software_interrupt //占4字節內存
?ldr?pc, _prefetch_abort //占4字節內存
?ldr?pc, _data_abort //占4字節內存
?ldr?pc, _not_used //占4字節內存
?ldr?pc, _irq //占4字節內存
?ldr?pc, _fiq //占4字節內存

占了4x8=32字節內存。

_undefined_instruction:?.word undefined_instruction //占4字節內存
_software_interrupt:?.word software_interrupt //占4字節內存
_prefetch_abort:?.word prefetch_abort //占4字節內存
_data_abort:??.word data_abort //占4字節內存
_not_used:??.word not_used //占4字節內存
_irq:???.word irq //占4字節內存
_fiq:???.word fiq //占4字節內存

占了4x7=28字節內存。

所以在這個.balignl 16,0xdeadbeef指令之前,一共占了32+28=60bytes的內存,用.balignl 16,0xdeadbeef在地址60后填充4個字節的數據(0xdeadbeef),把當前指針往后移到地址為64的位置,起到對齊的作用!

補充:

.balignl 完整指令格式為:?

.balignl?{alignment}?{,fill}?{,max}。

第一個參數alignment為一個正整數,以alignment的值的整數倍為結束地址進行對齊,以當前地址為起始地址,進行字節填充,比如當前地址為20,而alignment的值我們設定為16,那么字節填充自20開始,結束于20后第一個16的倍數地址處,即32處。

第二個參數fill即我們選定的,用來填充的數值。balignl模式下為4字節,不夠4字節系統會自動補夠4字節,此參數可選,不標則采用默認值0。

第三個參數max也是可選項,默認值為alignment。若對齊時偏移量大于max,則不偏移。同上例,從16--32,偏移量為16,如果max我們設置為8,那么該偏移不進行。

參考:https://www.xuebuyuan.com/3121739.html

?

?

?

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的arm汇编:.balignl伪指令理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。