0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ARM汇编语言代码节中的文字池是什么

电子工程师 来源:单片机匠人 作者:蔡琰老师 2021-08-13 15:14 次阅读

说到文字池,首先第一个问题:什么是文字池?文字池又叫literal pool,它的本质就是ARM汇编语言代码节中的一块用来存放常量数据而非可执行代码的内存块。

那为什么要使用文字池呢?当想要在一条指令中使用一个 4字节长度的常量数据(这个数据可能是内存地址,可能是数字常量)的时候,由于ARM指令集是定长的(ARM指令4字节或Thumb指令2字节),就无法把这个4字节的常量数据编码在一条编译后的指令中。此时,ARM编译器(编译C源程序)/汇编器(编译汇编程序) 就会在代码节中分配一块内存,并把这个4字节的数据常量保存起来,之后,再使用一条指令把这个4 字节的数字常量加载到寄存器中参与运算。 在写C程序中,文字池的分配是由编译器在编译时自行分配安排的,但是,在写汇编程序时,开发者可以自己进行文字池的分配,当然如果没有自己分配汇编器也会代劳。不管何种情况,这不影响我们来了解学习一下文字池的知识。

LDR Rd,=const 伪指令可在单个指令中构造任何 32 位数字常数。使用此伪指令可生成超出MOV和MVN指令范围的常数。LDR 伪指令可为特定的常数生成最高效的单个指令:如果可以用单个MOV或MVN 指令构造该常数,则汇编器会生成适当的指令。如果不能用单个MOV或MVN 指令构造该常数,则汇编器会执行下列操作:将该值放入文字池中,生成一个使用程序相对地址的 LDR 指令,用于从文字池中读取该常数。说的通俗一点,如果LDR Rd, =const能够被转换成MOV 或者MVN指令,则汇编器将转换成它成为相应的指令,如果不能被转换,则汇编器会将value存放在文字池中,并且产生一个LDR指令操作。

汇编器默认把文字池放在每一个代码节的末尾处。代码节的末尾的确定或者是由汇编源文件尾部的指示符END确定,或者由相邻代码节的起始行AREA确定。在大的代码节中(通俗理解为这个节中的代码量比较大),默认文字池在最后,可能与代码节中一条或多条LDR伪指令的距离很远,可能超出LDR伪指令操作数的寻址范围。

当伪指令是32位时,在ARM或Thumb代码中,必须小于4K字节,文字池常量数据的位置可以是在伪指令的前面,也可以是在伪指令的后面。当伪指令是16位Thumb指令时,必须小于1K字节,且文字池必须位于伪指令的后面。

LDR Rd, =const 伪指令需要一个文字池来存放立即数常量时,汇编器会检查已经存在的文字池中是否有相同的常量并且检查文字池是否在伪指令允许寻址的范围内。如果条件满足,汇编器引用这个满足条件的常量,否则汇编器会尝试把该常量值放到文字池未用的空间中。如果空间地址超出伪指令的寻址范围,汇编器会产生一条错误信息。这种情况下,程序员必须得自己用指示符LTORG在代码中设置增加一个文字池。指示符LTORG放在导致错误的伪指令后面,并且位于伪指令LDR的有效寻址范围内(一般节的代码量不是特别大的情况下,可以放于中间位置)。而且要保证设置的这个文字池,处理器执行代码的时候不会执行到这个地址。它们应放在无条件跳转指令的后面,或者放在子例程末尾处的返回指令的后面。

应用举例如下:

Fun1

LDR R0, =0X12345678

ADD R1, R1, R0

BX LR ;子程序返回

LTORG ;声明文字池,存储0x12345678

POOL SPACE 20

好了,关于文字池,本片文章就讲到这里了,大家有不明白的地方可以留言提问哦,谢谢大家。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8651

    浏览量

    361773
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92383

原文标题:一文带你读懂ARM文字池

文章出处:【微信号:CanaanTech,微信公众号:嘉楠科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ARM的启动代码为什么要用汇编语言

    ARM的启动代码为什么要用汇编语言
    发表于 02-26 07:17

    【原创】一文带你读懂ARM文字

    作者:蔡琰老师(张飞实战电子高级工程师)说到文字,首先第一个问题:什么是文字文字又叫li
    发表于 08-11 15:05

    ARM汇编语言与指令格式资料分享

    1、ARM汇编语言与指令格式介绍汇编语言介绍概念指的是用助记符代替操作码,用地址符号或标签(:#&)代替地址码的编程语言。优缺点优点:可以直接访问硬件目标,
    发表于 04-22 16:10

    ARM汇编语言入门

    ,我们可以在函数编写自己的汇编代码,而无需担心运行程序所需的所有其他代码。 然后,我们将使用这种方法来查看用Arm
    发表于 08-08 07:28

    汇编语言程序设计pdf

    汇编语言程序设计的内容:每种高级语言程序在连接为可执行程序之前,都必须被编译为汇编语言程序,因此对于高级语言程序设计者来说,了解编译器如何生成汇编语
    发表于 10-21 17:38 0次下载
    <b class='flag-5'>汇编语言</b>程序设计pdf

    汇编语言代码分析

    汇编语言代码分析 查看源代码将发现它由4 4个文件组成,其中:• 两个是汇编语言文件,它们的名字带后缀“ . s”;• 28个是用“C”
    发表于 02-09 16:18 26次下载

    Linux中的汇编语言

    在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成
    发表于 04-07 20:43 55次下载

    Assemble汇编语言设计技术

    汇编语言 设计程序,是所有程序语言的基本资源。我们不管你使用除汇编语言或指令代码以外的程序语言编程,仅仅是编程表达、编程规则和变成环境的变化
    发表于 07-07 15:47 0次下载

    ARM汇编语言官方手册(中文)

    ARM汇编语言官方手册(中文)汇编语言ARM汇编语言官方手册(中文)
    发表于 12-28 15:02 203次下载

    汇编语言

    汇编语言举例,比如读寄存器内容的源代码汇编语言制作的光带菜单及源程序、获得操作系统版本的汇编代码
    发表于 12-31 10:40 29次下载

    浅谈C、C++ 和 ARM 汇编语言之间的调用

    12.4 C target=_blank style=cursor:pointer;color:#D05C38;text-decoration:underline;》C、C++ 和 ARM 汇编语言
    发表于 10-19 09:24 2次下载

    ARM汇编语言工具V5.1用户指南

    这本书帮助你学习如何使用德克萨斯仪器汇编语言工具专门为ARM的32位设备设计。
    发表于 04-13 15:41 6次下载
    <b class='flag-5'>ARM</b><b class='flag-5'>汇编语言</b>工具V5.1用户指南

    单片机闪烁灯汇编语言代码大全(四款闪烁灯的汇编语言代码

    本文主要介绍了四款闪烁灯的汇编语言代码,具体的跟随小编一起来了解一下。
    发表于 04-26 14:47 2.5w次阅读

    CPU如何执行代码 汇编语言教程

    的是低级语言,它专门用来控制硬件。汇编语言就是低级语言,直接描述/控制 CPU 的运行。如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习
    的头像 发表于 08-25 11:14 3296次阅读
    CPU如何执行<b class='flag-5'>代码</b> <b class='flag-5'>汇编语言</b>教程

    ARM汇编语言官方手册

    ARM汇编语言官方手册
    发表于 10-10 10:44 15次下载