博客
关于我
不能直接用加载伪指令加载的立即数浅谈ARM 汇编里的 literal pools文字池以及LTORG文字池放置指令
阅读量:152 次
发布时间:2019-02-27

本文共 689 字,大约阅读时间需要 2 分钟。

1)ARM汇编中 literal pool (文字池)本质是什么

      中文说明:      

               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)文字池的使用原则

       在大多数时候,使用文字池可以提高程序性能,不过在特定情况下,使用不使用文字池(亦即使用文字池

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

转载地址:http://kspb.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0085---TCP粘包拆包内容梳理
查看>>
Netty常用组件一
查看>>
Netty常见组件二
查看>>
netty底层——nio知识点 ByteBuffer+Channel+Selector
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty心跳检测
查看>>
Netty心跳检测机制
查看>>
netty既做服务端又做客户端_网易新闻客户端广告怎么做
查看>>
Netty核心模块组件
查看>>
Netty框架内的宝藏:ByteBuf
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—1.服务端启动流程一
查看>>
Netty源码—1.服务端启动流程二
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—2.Reactor线程模型二
查看>>
Netty源码—3.Reactor线程模型三
查看>>
Netty源码—3.Reactor线程模型四
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>