淺談ARM 彙編裡的 literal pools文字池

2020-12-12 電子產品世界

1)ARM彙編literal pool (文字池)本質是什麼

中文說明:

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

literal pool的本質就是ARM彙編語言代碼節中的一塊用來存放常量數據而非可執行代碼的內存塊。

英文說明:

Literal pools are areas of constant data in a code section。

(出自ARM官方文檔《ARM Compiler armcc User Guide》)

2) 使用literal pool (文字池)的原因

當想要在一條指令中使用一個 4位元組長度的常量數據(這個數據可以是內存地址,也可以是數字常量)

的時候,由於ARM指 令集是定長的(ARM指令4位元組或Thumb指令2位元組),所以就無法把這個4位元組

的常量數據編碼在一條編譯後的指令中。此時,ARM編譯器(編譯C源程序)/彙編器(編譯彙編程序)

就會在代碼節中分配一塊內存,並把這個4位元組的數據常量保存於此,之後,再使用一條指令把這個4

字節的數字常量加載到寄存器中參與運算。

在C原始碼中,文字池的分配是由編譯器在編譯時自行安排的,在進行彙編程序設計時,開發者可以自

己進行文字池的分配,如果開發者沒有進行文字池的安排,那麼彙編器就會代勞。

3)實際例子:

圖1是在編譯一個C函數時,編譯器自動進行文字池分配的具體例子。


圖1

4)文字池的替代方案

文字池不是必須的,圖2就是使用MOVW和MOVT取代文字池的使用的具體示例。

圖2

5)文字池的使用原則

在大多數時候,使用文字池可以提高程序性能,不過在特定情況下,使用不使用文字池(亦即使用文字池

的替代方案)才是最理想的。


相關焦點

  • 有關arm彙編中的align
    經常會看到arm-linux彙編中有如下的指令:.arm-linu是按照2^n的方案對齊的,需要說明的是這個對齊和ld-script裡的對齊不同,不是一會事。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.
  • ARM彙編和內嵌彙編
    一、ldr的確是個複雜的指令,現總結一下: 首先要判斷我們用的是ldr arm指令還是偽指令。 當我們用的是arm指令時,它的作用不是向寄存器裡加載立即數,而是將某個地址裡 的內容加載到寄存器。而偽指令ldr的作用就是向寄存器裡加載立即數。
  • literal什麼意思
    literal什麼意思單詞解析liter,前面背過,意思是升,計量單位。然而literal和liter卻沒什麼關係。liter前綴,文字!al,常見的形容詞後綴,更多例子還有:impratical, immoral, occupational, etc.
  • 常用ARM彙編指令
    在嵌入式開發中,彙編程序常常用於非常關鍵的地方,比如系統啟動時初始化,進出中斷時的環境保護,恢復等對性能有要求的地方。operand2 第2個操作數arm的尋址方式如下:立即尋址寄存器尋址寄存器間接尋址基址加偏址尋址堆棧尋址塊拷貝尋址相對尋址這裡不作詳細描述,可以查閱相關文檔。
  • ARM指令學習筆記
    有了個簡單了解之後,開始投入到了arm指令的學習。參考"arm百度百科","NDS百度百科"本文引用地址:http://www.eepw.com.cn/article/201611/316807.htm接下來就是對arm指令的學習。因為有過前面8086指令的學習,並且也寫過像高精度計算這樣的彙編程序,看arm指心裏面老在比較這兩套指令。
  • 淺談分析Arm linux 內核移植及系統初始化的過程二
    如 s3c24xx_init_irq()函數是通過start_kernel()裡的init_IRQ()函數調用init_arch_irq()實現的。If yes, let it do all* the work //啟動用戶空間的init進程9、淺談分析Arm linux 內核移植及系統初始化的過程 諮詢QQ:313807838 */if (!
  • arm 英語詞組彙編
    >10.with the strong arm用強制[高壓]手段11.with the strong hand用強制[高壓]手段12.chance one's arm[英口]冒險一試; 碰碰運氣13.charge an arm and a leg[口]向(
  • ARM棧回溯——從理論到實踐,開發IDA-arm-unwind-plugin
    ehabi 的回溯方式,再到 elf 文件中的 unwind 信息,最後實現一款 IDA 裡實時進行 arm 棧回溯的插件,覆蓋了現代 arm 棧回溯的全部內容,希望能給大家帶來幫助。我說一直是logcat裡看的,是正確的;那麼 IDA 裡只有一層棧回溯肯定是錯的,但我卻解釋不來原因,於是有了本文和一系列研究。
  • ARM彙編特殊符號 彙編符號引用
    280位元組內存並初始化[|] ----IF ELSE ENDIF----條件編譯,有選擇的確定需要編譯的代碼IF,ELSE,ENDIF,可以嵌套使用----IF 邏輯表達式指令或偽指令ELSE指令或偽指令ENDIF另外還有符號: $如果在串變量前有一個$,則在彙編
  • gcc、arm-linux-gcc和arm-elf-gcc的關係?
    gcc 編譯流程分為四個步驟:預處理、編譯 、彙編、連結。個人認為預處理和編譯主要由 gcc-core 來完成,彙編和連結主要由 Binutils 來完成。那麼何時用到 glibc 呢?看到源碼中的 printf 函數沒有,這個函數在 GCC 中是以庫函數的形式存在,這個庫函數在 glibc 庫中,在 stdio.h 頭文件中被聲明。
  • ARM彙編中^、!、cxsf符號和movs等指令使用
    CS :無符號>=CC :無符號<MI :負數PL :非負[>=0]VS :溢出VC :無溢出HI :無符號>LS :無符號<=GE :有符號>=LT :有符號<GT :有符號>LE :有符號<=AL :總是[默認]對於arm
  • 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的平板電腦上用的
  • 第1個ARM裸板程序及引申
    本篇是arm裸機1期加強版WiKi第8課_第1個ARM裸板程序及引申,共10節,文字無法完整的描述視頻內容,如果您覺得這些文章不錯
  • arm彙編學習(六)跳轉到thumb狀態
    通常函數返回使用 pop {r7,pc}或bx lr等方式(bx,b類似jmp為跳轉指令,但bx可以指定跳轉區域究竟為thumb還是arm指令。
  • OpenCV ffmpeg移植到ARM平臺
    1 下載yasm:到 http://www.tortall.net/projects/yasm/wiki/Download 下載yasm0.7.2(x264需要用到的彙編編譯器)# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --disableassembly[解釋]--disable-assembly :因為xvid沒有針對ARM的彙編優化,所以編譯時必須關掉彙編修改Makefile引用的platform.inc文件,將CC=gcc改為CC=arm-linux-gcc
  • arm:c語言和彙編混合編程
    1.C和彙編可相互調用,彙編子函數格式參考彙編:普通的函數調用的彙編代碼解析http://www.cnblogs.com/mylinux/p/4139972.html本文引用地址:http://www.eepw.com.cn/article/201611/317685.htm  本文演示了 : 彙編嵌入到c語言;
  • android平臺arm指令學習和調試
    */一、Ndk下內聯彙編跟vc下一樣,ndk編譯環境下也能使用內聯彙編,如下:本文引用地址:http://www.eepw.com.cn/article/201611/317575.htmincludeintmy_thumb(intdummy)
  • arm-linux-ld命令 ld連結腳本
    我們對每個c或者彙編文件進行單獨編譯,但是不去連接,生成很多.o 的文件,這些.o文件首先是分散的,我們首先要考慮的如何組合起來;其次,這些.o文件存在相互調用的關係;再者,我們最後生成的bin文件是要在硬體中運行的,每一部分放在什麼地址都要有仔細的說明。
  • ARM常用概念須知
    4. arm啟動代碼設計答:arm啟動代碼直接面對處理器內核和硬體控制器進行編程,一般使用彙編語言。Thumb指令集並沒有改變arm體系地層的程序設計模型,只是在該模型上加上了一些限制條件。Thumb指令集中的數據處理指令的操作數仍然為32位,指令尋址地址也是32位的。8.什麼是ATPCS答:為了使單獨編譯的C語言程序和彙編程序之間能夠相互調用,必須為子程序之間的調用規定一定的規則。ATPCS就是arm程序和Thumb程序中子程序調用的基本規則。
  • 在Cortex-A8平臺下memcpy ARM/NEON彙編性能的測試
    YESYESvec_cpyYESYESYESYESYESYESarm9_memcpyYESYESYESYESYESYESarmv5te_memcpyYESYES>YESYESYESYESmemcpy_armYESYESYESYESYES