当前位置: 首页 > news >正文

arm汇编中的literal pools .

 literal pools是一个用于存储32bit数据的字池,由于机器码的操作数operand2只有12位,所以其能操作的立即数是及其有限的,因此不得不使用一个literal pools来配合指令执行操作。这样一个ldr指令就有可能需要两个32bit的存储空间来完成一个任务。 如果一段代码中需要访问字池时,编译器首先寻找现有的字池,看看里面是否有想要的数据,如果没有则自动在代码段结尾处创建一个字池,当然也可以使用伪指令LTORG来自行创建一个字池。下面说一下字池的位置:
1、字池的位置一般是放在一个代码段的结束位置(一个代码段一般用AREA来定义),一般是在END的后面,或者下一个段(即下一个AREA指令)之前。
2、也可以使用伪指令LTORG自定义一个位置,但一般是在无条件跳转指令的后面,以保证literal pools不会被误当做可执行指令被执行。
3、还有一点,字池的位置要在指令的可执行位置范围内,即要在距离PC指针4k的范围内(原因同样是因为operand2只有12位,即可寻址范围只有4k)。
    举例如下:
        start
                bl func1
                bl func2
        stop
                mov r0,#0x18
                ldr r1,=0x20026
        ;        SVC #0x123456
        func1
                ldr r0,=42
                ldr r1,=0x55555555
                ldr r2,=0xffffffff
                bx lr
                LTORG
        func2
                ldr r3,=0x55555555
                ldr r4,=0x66666666
                bx lr
        LargeTable
                SPACE 4200
                END
    反汇编可以看见
           29 00000018 E3E02000        ldr     r2,=0xffffffff
           30 0000001C E12FFF1E        bx      lr
           31 00000020 00020026
                      55555555         LTORG
           32 00000028         func2
     subroutine结尾处,bx lr后面使用了两个32bit的存储单元用来存放stop中的0x20026以及func1中的0x55555555.(0xffffffff可以用指令mvn解决),但是该段代码编译后会在指令ldr r4,=0x66666666处产生一个错误,即literal pools is too distant, use LTORG to assemble it within 4KB。即literal pools超出可寻址范围4kB。
     如果此时将LargeTable后面的SPACE 4200改成4092(因为bx lr要占用一个32bit空间).
                LargeTable
                SPACE 4200
                END
     就不会出现上面的错误了。

相关文章:

  • ARM的向量中断和非向量中断
  • C语言中的强符号与弱符号
  • 关键字volatile有什么含意?并给出三个不同的例子
  • 【大学生活】优秀的有趣的博客
  • Linux shell 进制转换
  • ubuntu下多个gcc版本切换
  • glibc--memcpy源码分析
  • glibc--strcpy源码分析
  • 使用GDB调试C库
  • glibc -- strlen源码分析
  • linux下利用backtrace追踪函数调用堆栈以及定位段错误
  • ssh登陆virtualbox安装的Ubuntu的同时也能连上互联网
  • Stack Backtracing Inside Your Program
  • Obtaining a stack trace in C upon SIGSEGV
  • StackTraces
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Java 内存分配及垃圾回收机制初探
  • Java,console输出实时的转向GUI textbox
  • JS+CSS实现数字滚动
  • Node + FFmpeg 实现Canvas动画导出视频
  • Nodejs和JavaWeb协助开发
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • React-flux杂记
  • ViewService——一种保证客户端与服务端同步的方法
  • vuex 笔记整理
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 大数据与云计算学习:数据分析(二)
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 一个项目push到多个远程Git仓库
  • 数据库巡检项
  • #NOIP 2014# day.1 T2 联合权值
  • #大学#套接字
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • ( 10 )MySQL中的外键
  • ()、[]、{}、(())、[[]]命令替换
  • (1)Nginx简介和安装教程
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一一四)第九章编程练习
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)hibernate缓存
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(六):替换字符串中匹配的子串
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net Web项目创建比较不错的参考文章
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)