有關arm彙編中的align

2020-12-13 電子產品世界
經常會看到arm-linux彙編中有如下的指令:

.align n
它的含義就是使得下面的代碼按一定規則對齊,.align n 指令的對齊值有兩種方案,n 或 2^n ,
各種平臺最初的彙編器一般都不是gas,採取方案1或2的都很多,gas的目標是取代原來的彙編器,
必然要保持和原來彙編器的兼容,因此在gas中如何解釋 .align指令會顯得有些混亂,原因在於保持兼容。
arm-linu是按照2^n的方案對齊的,需要說明的是這個對齊和ld-script裡的對齊不同,不是一會事。
下面的英文就不同平臺的對齊進行了說明:
版本2.11.92.0.12的gas的info(Mandrake 8.2上的)這樣說:

本文引用地址:http://www.eepw.com.cn/article/201611/318973.htm

The way the required alignment is specified varies from system to system. For the a29k,
hppa, m68k, m88k, w65, sparc, and Hitachi SH, and i386 using ELF format, the first expression
is the alignment request in bytes. For example `.align 8 advances the location counter until
it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed.

For other systems, including the i386 using a.out format, and the arm and strongarm,
it is the number of low-order zero bits the location counter must have after advancement.
For example `.align 3 advances the location counter until it a multiple of 8.
If the location counter is already a multiple of 8, no change is needed.

從這段文字來看,ARM的.align 5就是2的5次方對齊,也就是4位元組對齊,通過反彙編也可以看出對齊方式:
.align 5
stmfd sp!, {r0 - r3, lr}
mov r0, ip
ldmfd sp!, {r0 - r3, pc}^

.align 5
stmfd sp!, {r0 - r3, lr}
mov r0, ip
mov ip, r0
ldmfd sp!, {r0 - r3, pc}^

反彙編:
00000000 <.text>:
0: e92d400f stmdb sp!, {r0, r1, r2, r3, lr}
4: e1a0000c mov r0, ip
8: e8fd800f ldmia sp!, {r0, r1, r2, r3, pc}^
...
20: e92d400f stmdb sp!, {r0, r1, r2, r3, lr}
24: e1a0000c mov r0, ip
28: e1a0c000 mov ip, r0
2c: e8fd800f ldmia sp!, {r0, r1, r2, r3, pc}^
30: e1a00000 nop (mov r0,r0)
34: e1a00000 nop (mov r0,r0)
38: e1a00000 nop (mov r0,r0)
3c: e1a00000 nop (mov r0,r0)

一些忠告:
In the future, everytime when you build an elf file, you need meantime created your map file.
And then you will avoid mistakes like this align.

Also, please also pick up some linker script knowlege part. For embedded system,
we frequently play the linker script to tune an image, for example,
align some special section and so on for protection or/and cache purpose.
wish helpful

相關焦點

  • ARM彙編指令:.align理解和用法
    偽指令的作用是:告訴彙編程序,本偽指令下面的內存變量必須從下一個能被Num整除的地址開始分配。如果下一個地址正好能被Num整除,那麼,該偽指令不起作用,否則,彙編程序將空出若干個字節,直到下一個地址能被Num整除為止。
  • ARM彙編和內嵌彙編
    一、ldr的確是個複雜的指令,現總結一下: 首先要判斷我們用的是ldr arm指令還是偽指令。 當我們用的是arm指令時,它的作用不是向寄存器裡加載立即數,而是將某個地址裡 的內容加載到寄存器。而偽指令ldr的作用就是向寄存器裡加載立即數。
  • 常用ARM彙編指令
    在嵌入式開發中,彙編程序常常用於非常關鍵的地方,比如系統啟動時初始化,進出中斷時的環境保護,恢復等對性能有要求的地方。operand2 第2個操作數arm的尋址方式如下:立即尋址寄存器尋址寄存器間接尋址基址加偏址尋址堆棧尋址塊拷貝尋址相對尋址這裡不作詳細描述,可以查閱相關文檔。
  • ARM處理器寄存器和彙編指令系統
    3.ARM的常用彙編指令1)基本尋址方式包括有寄存器尋址、立即尋址、寄存器移位尋址、寄存器間尋址、變址尋址、多寄存器尋址、堆棧尋址/Images/OutliningIndicators/None.gif" align="top" />{-} Rm {, shift}- 是可選符號,表示從Rn中減去偏移量,否則是加650) this.width=650;" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align
  • ARM彙編中^、!、cxsf符號和movs等指令使用
    .htm其他指令正在學習中[隨時補充gliethttp]-----------------------------1.ldr ip,[sp],#4將sp中內容存入ip,之後sp=sp+4; ldr ip,[sp,#4]將sp+4這個新地址下內容存入ip,之後sp值保持不變 ldr ip,[sp,#4]!
  • arm 英語詞組彙編
    21.glass arm麻木的手臂; 體弱的工人22.golf arm高爾夫臂(高爾夫球手過度運動後的一種神經機能症)23.have a long arm有深遠的勢力或影響24.in arms懷抱中的, 不會走路的(嬰兒)
  • arm-linux-ld命令 ld連結腳本
    我們對每個c或者彙編文件進行單獨編譯,但是不去連接,生成很多.o 的文件,這些.o文件首先是分散的,我們首先要考慮的如何組合起來;其次,這些.o文件存在相互調用的關係;再者,我們最後生成的bin文件是要在硬體中運行的,每一部分放在什麼地址都要有仔細的說明。
  • ARM指令學習筆記
    有了個簡單了解之後,開始投入到了arm指令的學習。參考"arm百度百科","NDS百度百科"本文引用地址:http://www.eepw.com.cn/article/201611/316807.htm接下來就是對arm指令的學習。因為有過前面8086指令的學習,並且也寫過像高精度計算這樣的彙編程序,看arm指心裏面老在比較這兩套指令。
  • Align Technology 宣布在中國商業推出 Invisalign隱適美產品
    Invisalign G3具備新的特點和功能,使得採用Invisalign隱適美產品治療二類和三類患者變得更為簡單,並可應對亞洲人群中更為複雜的咬合不正問題。於此次推出之前,Align Technology已在中國成立全資子公司,並將中國總部設在上海,進行全國性管理、銷售、市場推廣,並提供臨床教育及支持等。
  • ARM彙編特殊符號 彙編符號引用
    如果$後是數字變量(與串變量區分),在彙編時編譯器將該數字變量的數值轉換成十六進位的串,然後用該十六進位的串取代$後的數字變量。如果$後是邏輯變量,在彙編時編譯器將該邏輯變量替換成它的取值(T或者F)。如果程序中需要$,則用$$來表示,編譯器將不進行變量替換。
  • gcc、arm-linux-gcc和arm-elf-gcc的關係?
    gcc 編譯流程分為四個步驟:預處理、編譯 、彙編、連結。個人認為預處理和編譯主要由 gcc-core 來完成,彙編和連結主要由 Binutils 來完成。那麼何時用到 glibc 呢?看到源碼中的 printf 函數沒有,這個函數在 GCC 中是以庫函數的形式存在,這個庫函數在 glibc 庫中,在 stdio.h 頭文件中被聲明。
  • Android ARM 指令學習
    6.2.3必須要了解的ARM知識總結:1:c語言編寫代碼在編譯時有一個過程,是將其轉換成ARM彙編代碼,所以可以這麼理解,c語言實現的功能ARM彙編語言都能實現。2,ARM彙編語言中特有的寄存器。寄存器是處理特有的高速存儲部件,它們可以用來暫存指令,數據和位址,高級語言用到中用到的變量,常量,結構體,類等數據用到了ARM彙編語言中,就是使用寄存器保存的值或內存地址,寄存器的數據量有限,ARM微處理器共有37個32位寄存器,其中31個為通用寄存器,6個為狀態寄存器,ARM處理器器支持7中運行模式。1;用戶模式(usr)ARM 處理器正常的程序執行狀態。
  • 哪幾種情況中必須使用內聯彙編或嵌入型彙編?
    ARM系列文章,請點擊以下匯總連結:《從0學arm合集》一、gcc 內聯彙編內聯彙編即在C中直接使用彙編語句進行編程,使程序可以在C程序中實現C語言不能完成的一些工作,例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編。
  • ARM棧回溯——從理論到實踐,開發IDA-arm-unwind-plugin
    ehabi 的回溯方式,再到 elf 文件中的 unwind 信息,最後實現一款 IDA 裡實時進行 arm 棧回溯的插件,覆蓋了現代 arm 棧回溯的全部內容,希望能給大家帶來幫助。,前兩段 sp 的內容並沒有被保存到任意一個寄存器裡,但它可以被正確棧回溯,暗示棧回溯信息不在這段彙編裡;後兩段,把 sp 放到 r7 裡,把 sp+8 放到 r7 裡,有點像棧幀的感覺,並且函數內也沒有覆蓋掉 r7 的內容,有點 x86 的感覺。
  • android平臺arm指令學習和調試
    */一、Ndk下內聯彙編跟vc下一樣,ndk編譯環境下也能使用內聯彙編,如下:本文引用地址:http://www.eepw.com.cn/article/201611/317575.htmincludeintmy_thumb(intdummy)
  • Android逆向學習|對ARM指令的一次學習
    Intel的架構中x86代表32位cpu,x86_64代表64位的cpu,x86彙編語言學習最為普遍。ARM架構也有32位和64位之分。armeabi     : 32位 arm cpu 庫,幾乎所有手機都支持armeabi-v7a : 64位 arm cpu 庫,現在我們買的手機基本上都是64位的cpu了x86         : 在電腦上運行的模擬器或者基於Intel x86的平板電腦上用的
  • 跟大家Align一下Align對應的中文說法
    1.如果大家使用英文版本的word,會發現中文word的「對齊」就是英文中的「alignment」。這個時候,使用的就是牛津字典中的釋意:「~ (sth)(with sth)to arrange sth in the correctposition, or to be in the correct position, in relation to sth else, especiallyin a straight line 排整齊;校準;(尤指)使成一條直線」
  • OpenCV ffmpeg移植到ARM平臺
    )四個頭文件拷貝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include中。將/root/libjpeg-arm/lib中(libjpeg.la, libjpeg.so, libjpeg.so.62, libjpeg.so.62.0.0)四個庫文件拷貝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib中注意:執行以下命令檢查生成的libjpeg.so是否為ARM版:# file
  • arm:c語言和彙編混合編程
    1.C和彙編可相互調用,彙編子函數格式參考彙編:普通的函數調用的彙編代碼解析http://www.cnblogs.com/mylinux/p/4139972.html本文引用地址:http://www.eepw.com.cn/article/201611/317685.htm  本文演示了 : 彙編嵌入到c語言;
  • ARM常用概念須知
    4. arm啟動代碼設計答:arm啟動代碼直接面對處理器內核和硬體控制器進行編程,一般使用彙編語言。Thumb指令集並沒有改變arm體系地層的程序設計模型,只是在該模型上加上了一些限制條件。Thumb指令集中的數據處理指令的操作數仍然為32位,指令尋址地址也是32位的。8.什麼是ATPCS答:為了使單獨編譯的C語言程序和彙編程序之間能夠相互調用,必須為子程序之間的調用規定一定的規則。ATPCS就是arm程序和Thumb程序中子程序調用的基本規則。