0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ARM匯編語言代碼節(jié)中的文字池是什么

電子工程師 ? 來源:單片機(jī)匠人 ? 作者:蔡琰老師 ? 2021-08-13 15:14 ? 次閱讀

說到文字池,首先第一個(gè)問題:什么是文字池?文字池又叫l(wèi)iteral pool,它的本質(zhì)就是ARM匯編語言代碼節(jié)中的一塊用來存放常量數(shù)據(jù)而非可執(zhí)行代碼的內(nèi)存塊。

那為什么要使用文字池呢?當(dāng)想要在一條指令中使用一個(gè) 4字節(jié)長度的常量數(shù)據(jù)(這個(gè)數(shù)據(jù)可能是內(nèi)存地址,可能是數(shù)字常量)的時(shí)候,由于ARM指令集是定長的(ARM指令4字節(jié)或Thumb指令2字節(jié)),就無法把這個(gè)4字節(jié)的常量數(shù)據(jù)編碼在一條編譯后的指令中。此時(shí),ARM編譯器(編譯C源程序)/匯編器(編譯匯編程序) 就會在代碼節(jié)中分配一塊內(nèi)存,并把這個(gè)4字節(jié)的數(shù)據(jù)常量保存起來,之后,再使用一條指令把這個(gè)4 字節(jié)的數(shù)字常量加載到寄存器中參與運(yùn)算。 在寫C程序中,文字池的分配是由編譯器在編譯時(shí)自行分配安排的,但是,在寫匯編程序時(shí),開發(fā)者可以自己進(jìn)行文字池的分配,當(dāng)然如果沒有自己分配匯編器也會代勞。不管何種情況,這不影響我們來了解學(xué)習(xí)一下文字池的知識。

LDR Rd,=const 偽指令可在單個(gè)指令中構(gòu)造任何 32 位數(shù)字常數(shù)。使用此偽指令可生成超出MOV和MVN指令范圍的常數(shù)。LDR 偽指令可為特定的常數(shù)生成最高效的單個(gè)指令:如果可以用單個(gè)MOV或MVN 指令構(gòu)造該常數(shù),則匯編器會生成適當(dāng)?shù)闹噶?。如果不能用單個(gè)MOV或MVN 指令構(gòu)造該常數(shù),則匯編器會執(zhí)行下列操作:將該值放入文字池中,生成一個(gè)使用程序相對地址的 LDR 指令,用于從文字池中讀取該常數(shù)。說的通俗一點(diǎn),如果LDR Rd, =const能夠被轉(zhuǎn)換成MOV 或者M(jìn)VN指令,則匯編器將轉(zhuǎn)換成它成為相應(yīng)的指令,如果不能被轉(zhuǎn)換,則匯編器會將value存放在文字池中,并且產(chǎn)生一個(gè)LDR指令操作。

匯編器默認(rèn)把文字池放在每一個(gè)代碼節(jié)的末尾處。代碼節(jié)的末尾的確定或者是由匯編源文件尾部的指示符END確定,或者由相鄰代碼節(jié)的起始行AREA確定。在大的代碼節(jié)中(通俗理解為這個(gè)節(jié)中的代碼量比較大),默認(rèn)文字池在最后,可能與代碼節(jié)中一條或多條LDR偽指令的距離很遠(yuǎn),可能超出LDR偽指令操作數(shù)的尋址范圍。

當(dāng)偽指令是32位時(shí),在ARM或Thumb代碼中,必須小于4K字節(jié),文字池常量數(shù)據(jù)的位置可以是在偽指令的前面,也可以是在偽指令的后面。當(dāng)偽指令是16位Thumb指令時(shí),必須小于1K字節(jié),且文字池必須位于偽指令的后面。

LDR Rd, =const 偽指令需要一個(gè)文字池來存放立即數(shù)常量時(shí),匯編器會檢查已經(jīng)存在的文字池中是否有相同的常量并且檢查文字池是否在偽指令允許尋址的范圍內(nèi)。如果條件滿足,匯編器引用這個(gè)滿足條件的常量,否則匯編器會嘗試把該常量值放到文字池未用的空間中。如果空間地址超出偽指令的尋址范圍,匯編器會產(chǎn)生一條錯(cuò)誤信息。這種情況下,程序員必須得自己用指示符LTORG在代碼中設(shè)置增加一個(gè)文字池。指示符LTORG放在導(dǎo)致錯(cuò)誤的偽指令后面,并且位于偽指令LDR的有效尋址范圍內(nèi)(一般節(jié)的代碼量不是特別大的情況下,可以放于中間位置)。而且要保證設(shè)置的這個(gè)文字池,處理器執(zhí)行代碼的時(shí)候不會執(zhí)行到這個(gè)地址。它們應(yīng)放在無條件跳轉(zhuǎn)指令的后面,或者放在子例程末尾處的返回指令的后面。

應(yīng)用舉例如下:

Fun1

LDR R0, =0X12345678

ADD R1, R1, R0

BX LR ;子程序返回

LTORG ;聲明文字池,存儲0x12345678

POOL SPACE 20

好了,關(guān)于文字池,本片文章就講到這里了,大家有不明白的地方可以留言提問哦,謝謝大家。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365051
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93273

原文標(biāo)題:一文帶你讀懂ARM文字池

文章出處:【微信號:CanaanTech,微信公眾號:嘉楠科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ARM的啟動代碼為什么要用匯編語言?

    ARM的啟動代碼為什么要用匯編語言
    發(fā)表于 02-26 07:17

    【原創(chuàng)】一文帶你讀懂ARM文字

    作者:蔡琰老師(張飛實(shí)戰(zhàn)電子高級工程師)說到文字,首先第一個(gè)問題:什么是文字?文字又叫l(wèi)i
    發(fā)表于 08-11 15:05

    ARM匯編語言與指令格式資料分享

    1、ARM匯編語言與指令格式介紹匯編語言介紹概念指的是用助記符代替操作碼,用地址符號或標(biāo)簽(:#&)代替地址碼的編程語言。優(yōu)缺點(diǎn)優(yōu)點(diǎn):可以直接訪問硬件目標(biāo),
    發(fā)表于 04-22 16:10

    ARM匯編語言入門

    ,我們可以在函數(shù)編寫自己的匯編代碼,而無需擔(dān)心運(yùn)行程序所需的所有其他代碼。 然后,我們將使用這種方法來查看用Arm
    發(fā)表于 08-08 07:28

    匯編語言代碼分析

    匯編語言代碼分析 查看源代碼將發(fā)現(xiàn)它由4 4個(gè)文件組成,其中:• 兩個(gè)是匯編語言文件,它們的名字帶后綴“ . s”;• 28個(gè)是用“C”
    發(fā)表于 02-09 16:18 ?26次下載

    匯編語言自學(xué)教程

    匯編語言自學(xué)教程 匯編語言(AssemblyLanguage)是面向機(jī)器的程序設(shè)計(jì)語言。在匯編語合,用助記符(Memoni)代替操作碼,
    發(fā)表于 03-15 14:24 ?510次下載

    Linux匯編語言

    在閱讀Linux源代碼時(shí),你可能碰到一些匯編語言片段,有些匯編語言出現(xiàn)在以.S為擴(kuò)展名的匯編文件,在這種文件
    發(fā)表于 04-07 20:43 ?55次下載

    Assemble匯編語言設(shè)計(jì)技術(shù)

    匯編語言 設(shè)計(jì)程序,是所有程序語言的基本資源。我們不管你使用除匯編語言或指令代碼以外的程序語言編程,僅僅是編程表達(dá)、編程規(guī)則和變成環(huán)境的變化
    發(fā)表于 07-07 15:47 ?0次下載

    ARM匯編語言官方手冊(中文)

    ARM匯編語言官方手冊(中文)匯編語言ARM匯編語言官方手冊(中文)
    發(fā)表于 12-28 15:02 ?210次下載

    匯編語言

    匯編語言舉例,比如讀寄存器內(nèi)容的源代碼、匯編語言制作的光帶菜單及源程序、獲得操作系統(tǒng)版本的匯編代碼
    發(fā)表于 12-31 10:40 ?33次下載

    ARM匯編程序設(shè)計(jì)之匯編語言文件格式

    10.3.1 ARM匯編語言語句格式 ARM(Thumb)匯編語法語句格式如下所示。 {symbol}{instruction|directive|pseudo-instruction
    發(fā)表于 10-19 10:14 ?7次下載

    ARM匯編語言工具V5.1用戶指南

    這本書幫助你學(xué)習(xí)如何使用德克薩斯儀器匯編語言工具專門為ARM的32位設(shè)備設(shè)計(jì)。
    發(fā)表于 04-13 15:41 ?6次下載
    <b class='flag-5'>ARM</b><b class='flag-5'>匯編語言</b>工具V5.1用戶指南

    嵌入式系統(tǒng)原理及應(yīng)用教程之ARM匯編語言程序設(shè)計(jì)的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式系統(tǒng)原理及應(yīng)用教程之ARM匯編語言程序設(shè)計(jì)的詳細(xì)資料說明包括了:1.偽操作和偽指令 ,2.ARM匯編語言語句格式,3.
    發(fā)表于 03-20 10:26 ?11次下載
    嵌入式系統(tǒng)原理及應(yīng)用教程之<b class='flag-5'>ARM</b><b class='flag-5'>匯編語言</b>程序設(shè)計(jì)的詳細(xì)資料說明

    CPU如何執(zhí)行代碼 匯編語言教程

    的是低級語言,它專門用來控制硬件。匯編語言就是低級語言,直接描述/控制 CPU 的運(yùn)行。如果你想了解 CPU 到底干了些什么,以及代碼的運(yùn)行步驟,就一定要學(xué)習(xí)
    的頭像 發(fā)表于 08-25 11:14 ?3451次閱讀
    CPU如何執(zhí)行<b class='flag-5'>代碼</b> <b class='flag-5'>匯編語言</b>教程

    ARM匯編語言官方手冊

    ARM匯編語言官方手冊
    發(fā)表于 10-10 10:44 ?28次下載