博客
关于我
不能直接用加载伪指令加载的立即数浅谈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/

你可能感兴趣的文章
NEO改进协议提案1(NEP-1)
查看>>
Neo私链
查看>>
NervanaGPU 项目使用教程
查看>>
Nerves 项目教程
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.
查看>>
nestesd exception is java .lang.NoSuchMethodError:com.goolge.common.collect
查看>>
nestJS学习
查看>>
net core 环境部署的坑
查看>>
NET Framework安装失败的麻烦
查看>>
Net 应用程序如何在32位操作系统下申请超过2G的内存
查看>>
Net.Framework概述
查看>>
NET3.0+中使软件发出声音[整理篇]<转>
查看>>
net::err_aborted 错误码 404
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetAssist网络调试工具使用指南 (附NetAssist工具包)
查看>>
Netbeans 8.1启动参数配置
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>