LDR指令和LDR伪指令详解

2023-11-01

ARM32位指令的构成

ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。 32bit = 指令码 + 数据。所以32bit的一条指令不可能表示再带一个32bit的数据,实际只有其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。这就产生了非法立即数和合法立即数的问题,经过移位操作,不为零的部分不能用8bit表示的数就是非法立即数。ldr伪指令就是用来解决非法立即数问题的。

ldr指令和ldr伪指令的使用区别:

ldr r0, =0xFFF0 @伪指令
ldr r0, 0xFFFF @指令
直观的区别就是ldr伪指令使用时,后面的数据前会有"=",实际使用时,大部分都使用伪指令,这样就不用考虑合法和非法立即数的问题。在编译的时候,编译器会将ldr伪指令进行替换,用文字池的方式来解决非法立即数的问题。文字池就是划分出一段地址空间用来存放常量或者地址,需要时用基址+变址的方式去取数据,这样就不用受到合法立即数的限制,可以表示32bit的数据。例如:
汇编源代码:
_start:
ldr r0, =0x11111111
经过反汇编:
00000000 <_start>:
0: e59f009c ldr r0, [pc, #156] ; a4 <delay_loop+0x10>
·
·
·
98: e1520003 cmp r2, r3
9c: 1afffffc bne 94 <delay_loop>
a0: e1a0f00e mov pc, lr
a4: 11111111 tstne r1, r1, lsl r1
分析:
通过反汇编可以看到,ldr伪指令被一条寄存器基址变址指令给替代了。其中以pc为基址,偏移156个字节(16进制是0x9c)。这条指令的作用是将内存地址"pc + 156"开头的4个字节读取到r0中,此时pc的值等于当前执行指令的地址+8(因为流水线的原因),因此pc + 156 = 0xa4,而0xa4地址处存的值刚好是0x11111111。这样就完成了将0x11111111加载到r0。

补充:

RAM处理器存在流水线,目前已经有十几级流水线,但是ARM为了兼容,无论Soc有多少级流水线,PC的值都是等于当前指令地址 + 8。PC = 当前指令地址 + 8, 记住就行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LDR指令和LDR伪指令详解 的相关文章

  • 单片机课程设计-温度检测(STM32)

    单片机课程设计 温度检测 STM32 原理 KEY配置 ADC配置 中断配置 UI及主函数 原理 STM32ADC采样 我选用PA5作为ADC接口 并做了UI设计 KEY配置 key c include key h include SysT
  • 第七章——二叉树

    二叉树的基本概念 二叉树类似于2次树 但和2次树有一些不同 1 度为2的树至少有一个结点的度为2 而二叉树没有这种要求 简而言之二叉树可以退化成一条链 2 度为2的树可以不区分左右子树 二叉树中左右子树 结点 的次序严格区分排列 有关满二叉
  • 网络安全——Cobaltstrike

    一 原理 CobaltStrike 以下简称 CS 工具 是攻击队常用的团队协作工具之一 本实验将由服务器和攻击机 模拟组成攻击队的CS工具环境 完成相关配置 并通过简单的攻击实践 测试协作效果 二 Cobalt Strike的安装配置服务

随机推荐

  • MYSQL8.0.31解压版下载、安装、环境配置

    目录 1 下载 2 解压 3 配置my ini 4 打开命令提示符 5 安装mysql服务 6 初始化mysql数据库 7 启动mysq服务 8 修改密码 9 配置环境变量 1 下载 官网 https dev mysql com downl
  • 开源无国界?vue-cli、node-ipc被投毒事件分析

    简述 近日我们监测到 Vue js 生态中的 vue cli 包遭遇供应链投毒 而被投毒的 node ipc 包在 npm 上每周下载量超百万 影响非常广泛 被投毒的情况如下 vue cli是Vue js 开发的标准工具 该工具被广泛应用于
  • 解决多线程高并发问题常用类

    Volatile关键字 1 volatile解决可见性 创建一个类继承Thread类 public class MyThread extends Thread 定义一个共享的静态成员变量 供多个线程一起使用 给共享的成员变量 添加一个vol
  • 详解卷积神经网络(CNN)在语音识别中的应用

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 侯艺馨 前言 总结目前语音识别的发展现状 dnn rnn lstm和cnn算是语音识别中几个比较主流的方向 2012年 微软邓力和俞栋老师将前馈神经网络FFDNN Feed Fo
  • 面试经典数据库查询题目(学生、课程、选课)

    这是前几天一刚毕业的朋友的面试题 算是面试常遇到的sql经典题目 记录一下 如图 在此我在电脑数据库上建立了对应的表结构 以供检验sql语句正误 建表语句 学生表 student info CREATE TABLE student info
  • 解决过拟合现象的六种姿势

    前面一文讲述的了过拟合现象产生的原因 现在讲述过拟合现象如何解决 1 增加训练数据 这是解决过拟合现象的根本办法 若没有过多的训练数据 我们可以自己增加一些假数据来在增加数据的数量 从而让模型的泛化能力增强 2 控制模型的复杂度 过于复杂的
  • Linux搭建FTP服务器

    FTP文件传输协议 什么是FTP FTP相关信息 FTP工作流程 FTP与HTTP区别 FTP相关软件包 FTP默认配置信息 FTP相关状态码 部署FTPserver lftp客户端的一些命令 FTP具体配置 匿名用户相关配置 本地用户相关
  • CSS的border边框属性 边框样式 内外边框 圆角合集

    CSS border 属性允许指定元素边框的样式 宽度和颜色 目录 1 四个边框 2 内外边框 3 边框样式 4 圆角边框 1 border边框属性 可以设置一到四个值 上边框 右边框 下边框 左边框 border top 10px sol
  • 【Scala入门】Scala下载及安装(Windows)以及Idea创建第一个scala项目

    目录 一 安装准备 二 Scala下载安装 三 Idea 创建Scala项目 一 安装准备 在安装之前 确保你的电脑上装有Jdk 8 Jdk 1 8 且环境变量配置正确 如果没有安装Jdk 请参照其他文章先安装Jdk 8 Jdk 1 8 1
  • JavaScript习题————————简单的关键字检测

    关键字检测说明 首先你输入一个字符串 然后确定 如果你输入的字符串里面有哪一个关键字 那么便输出那个关键字开头所在的位置 如果没有便返回 1 注 关键词不区分大小写 下面是代码
  • mac 下 vscode 通过wifi调试真机

    前言 继续上一篇如何在mac 环境下安装adb 这一篇我们将在有adb环境下进行无线模式的调试 在vscode下载插件 adb interface vscode 如上图输入 adb com 然后在右边进行安装 注意看下面的使用步骤 使用步骤
  • C++——打印乘法口诀表

    打印乘法口诀表 目标 利用嵌套循环 打印九九乘法口诀表 分析 1 列数 行数 计算结果 2 列数 lt 行数 include
  • 【JMeter】Jmeter分布式压测教程

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 原理 二 环境搭建 2 1 环境准备 2 2 slave机器配置 2 3 master机器配置 三 脚本及执行 3 1 参数化问题 3 2 GUI启动测试 3
  • SpringBoot整合Mybatis-Plus实现浏览数据新增、Redis进行热度排名

    在开发Web项目时 常用到的技术就是SpringBoot和Mybatis Plus 本文将介绍如何使用SpringBoot整合Mybatis Plus实现一个浏览数据新增功能 以及如何用Redis进行热度排名统计 最后用Vue进行数据渲染
  • python使用socket高效传输视频数据帧(连续发送图片)

    遇到的问题 网上找了一些代码 都是只能建立一次socket传输一张图片 然后断开重新连重新传 而建立一次socket代价不小 反复建立会非常消耗系统资源 因此尝试自己通过一次socket连续传输多张图片 代码问题记录 需要代码的可以直接文末
  • STM32系列(HAL库)——F103C8T6使用SPI方式点亮OLED

    目录 1 软件准备 2 硬件准备 3 CubeMX配置 1 芯片选择 2 配置RCC SYS 时钟树 3 配置SPI 4 配置GPIO 5 生成代码工程 4 代码移植 1 复制文件 2 在Keil5里添加文件 3 修改oled h文件 4
  • 【2023】华为OD机试真题全语言-题目0229-响应报文时间

    题目0229 响应报文时间 题目描述 IGMP 协议中 有一个字段称作最大响应时间 Max Response Time HOST收到查询报文 解析出MaxResponseTime字段后 需要在 0 MaxResponseTime s 时间内
  • 【JS】去除字符串首尾空格、所有空格

    1 去除所有空格 function trim str return str replace s g 2 去除首尾空格 去除字符串str头尾的空格 param str 字符串 return str去除头尾空格后的字符串 function tr
  • unittest和pytest的区别

    unittest是python的官方库 功能较少 pytest是第三方库 是基于unittest的扩展框架 可支持多种插件 目前有100多种 功能强大 pytest可兼容unittest写的用例 代码完全不用更改 一 用例编写方面 1 测试
  • LDR指令和LDR伪指令详解

    ARM32位指令的构成 ARM是RISC结构 数据从内存到CPU之间的移动只能通过LDR STR指令来完成 32bit 指令码 数据 所以32bit的一条指令不可能表示再带一个32bit的数据 实际只有其中的12bit来表示立即数 其中4b