ARM汇编指令ldr和MOV的区别

2023-05-16

1.“八位图”数据

 

2、MOV指令

MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。
 
MOV对于立即数是有要求的,就是上边的“8位图”数据。
只能由一个8bit连续有效位通过偶数次移位得到的数。
 
它为什么会有这样的限制呢?
原因是,MOV本身就是一个32bit指令,除了指令码本身,他不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示

立即数,其中4bit表示移位的尾数(循环右移,且数值*2),8bit用来表示要移位的一个基数。如果立即数超过这个范围,就没有办法用一条MOV指令给寄存器赋值

        要想判断一个数是否是合法的立即数,可以把这个数左移或右移偶数位,看能否变成一个8为的数。如果能,则是合法的立即数,可以用MOV指令操作。否则,不是合法立即数,不能用MOV指令来操作。

(这里就要用到LDR伪指令了,查看反汇编指令,你会看到LDR伪指令此变成了两条指令~~)。
3、LDR指令
ldr指令既可以是大范围的地址读取伪指令,也可以内存访问指令。
当它的第二个参数前面有“=”时,表示伪指令,否则表示内存访问指令。
LDR指令:就是个单寄存器存储的ARM存储器访问指令。
(LDR补充了MOV指令不能访问内存的缺陷。)
 
 ARM是RISC结构的,数据从内存到CPU之间的移动只能通过ldr/str指令(我说的是但个寄存器~~)。
想要把数据从内存中某处读取到寄存器中,只能用ldr。
 
4、LDR伪指令
1)LDR伪指令没有立即数范围的限制,既,可以直接赋值。因为这是一条伪指令。
    如果立即数在MOV的要求内,系统会自动用一条汇编MOV指令来实现。
    如果不在MOV的范围内,就用其它的方式来实现,比如变成了两条指令,或者从PC偏移地址读取一个32位的数据给寄存器。
2)关于LDR伪指令,可以装载一个32bit立即数的说法并不正确,
     因为在实际中并不是这一条语句装载了32bit立即数(跟上面的貌似一样,呵呵~~),比如:
    ldr r1,=0x70000000
    其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x70000000这个立即数,在反汇编中,
    如果仔细看会返现,如果这个立即数可以用mov指令的表达形式来表达,编译器就直接用mov了~~
 


ARM汇编中ldr伪指令和ldr指令
     ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
    比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:
          ldr r0, 0x12345678
    就是把0x12345678这个地址中的值存放到r0中。
    而mov不能实现这个功能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。


        ldr伪指令:虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。
 ldr伪指令可以在立即数前加上=,以表示把一个值(一般是一个地址)写到某寄存器中,比如:
 ldr r0, =0x12345678 @立即数前面有等号,所以是LDR伪指令
 这样,就把0x12345678这个值写到r0中了。所以,ldr伪指令和mov是比较相似的。
 只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。
如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。
 
比如:
ldr r1,=0x10
会变成
mov r1,#0x10


        综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。
在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。
若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,
否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。       
 
总之: ldr伪指令和ldr指令不是一个同东西。

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

ARM汇编指令ldr和MOV的区别 的相关文章

  • 我们可以优化代码来降低功耗吗?

    有没有什么技术可以优化代码以确保更低的功耗 架构是ARM 语言是C 来自 ARM 技术参考网站 ARM11 MPCore 的特性 提高能源效率的处理器 效率包括 准确的分支和子程序返回预测 减少数量 错误的指令获取和 解码操作 使用物理寻址
  • MOVDQA 和 MOVAPS x86 指令之间的区别?

    我正在查找英特尔数据表 英特尔 64 和 IA 32 架构 软件开发人员手册我找不到两者之间的区别 MOVDQA 移动对齐的双四字 MOVAPS 移动对齐压缩单精度 在英特尔数据表中我可以找到这两条指令 该指令可用于从 128 位加载 XM
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • 理解这部分手臂的汇编代码

    syntax unified thumb cpu cortex m4 arch armv7e m fpu fpv4 sp d16 Changes from unprivileged to privileged mode thumb func
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015

随机推荐

  • Virtual Serial Port Driver Pro 10.0.992 下载安装使用说明

    对应的下载资源链接如下 xff1a https download csdn net download lizhu csdn 86411873 压缩包文件夹内容如下 双击Setup exe 默认参数直接下一步 安装完成之后 xff0c 不要打
  • mach-mini2440.c:155: error: array type has incomplete element type

    我按照最新mini2440 linux移植开发指南时 xff0c 在操作 移植Nand 驱动并更改分区信息 时 xff0c 按照文档修改后 xff0c 再编译zImage时 xff0c 总是编译通不过 xff0c 下面是出错信息 arch
  • Visual Assist 在VS2022中安装失败问题

    直接找到C Users xxxxx AppData Local Microsoft VisualStudio 17 0 xxxxx 文件夹 直接右击删除这个文件夹 注意要在VS2022关闭时再删除 可以先做一次备份 正常运行安装VA X S
  • linux c 获取文件的时间信息

    gt File Name hello c gt Author lizhu gt Mail gt Created Time 2015年11月20日 星期五 10时30分20秒 include lt time h gt include lt s
  • Linux下C语言来检测USB设备以及自动区分U盘和硬盘并自动挂载

    别的不说直接上代码 作用就是在linux系统上可以直接判断哪个是USB设备节点 xff0c 哪个是硬盘设备节点 xff0c 如果想挂载某一个节点 想屏蔽某一个USB孔的USB设备 xff0c 具体代码 xff0c 正在整理中 xff0c 下
  • glib 交叉编译步骤

    借鉴文章网址为 wiki beyondlogic org index php title 61 Cross Compiling BlueZ Bluetooth tools for ARM 编译glib需要zlib libffi两个库文件我使
  • STM32中SysTick、FCLK、SYSCLK、HCLK

    http rmingwang com the stm32 systick fclk sysclk hclk html 转载原文 在STM32中 xff0c 有五个时钟源 xff0c 为HSI HSE LSI LSE PLL HSI是高速内部
  • qglobal.h:45: error: C1083: 无法打开包括文件:

    看了很多人的错误调试记录就是不行 xff0c 后来在百度知道里面看到这个 xff0c 添加进入后就可以了 在系统环境变量path 添加下面内容即可 SystemRoot system32
  • 卡尔曼滤波器学习笔记(二)

    扩展卡尔曼滤波器的原理及应用 经典的卡尔曼滤波只适用于线性且满足高斯分布的系统 xff0c 但实际工程中并不是这么简单 xff0c 比如飞行器在水平运动时有可能伴随着自身的自旋 xff0c 此时的系统并不是线性的 xff0c 这时就需要应用
  • 串口回环测试

    串口lookback测试 基础知识 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff09 xff0c 通常称作UART UART 是一种通用的数据通信协议 xff
  • STM32学习--USART

    串口工作方式 1 查询 xff1a 串口程序不断循环查询 xff0c 看看有没有数据需要它发送 2 中断 xff1a 平时串口只要打开中断即可 如果有中断来即需要传输数据 xff0c 它就马上进行数据的传输 STM32编程 xff1a 1
  • Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结Atitit HT

    Atitit HTTP 认证机制 基本验证 Basic Authentication 和摘要验证 Digest Authentication attilax总结 1 1 最广泛使用的是基本验证 Basic Authentication 和摘
  • 实验二 读取和理解激光雷达数据

    1 体验内容 xff08 1 xff09 为rplidar添加USB权限 注 xff1a 实验室的rplidar A2买得比较早 xff0c 硬件版本可能与github程序不匹配 xff0c 出现运行错误 xff0c 解决方法为到 Wind
  • Linux下使用Netfilter框架编写内核模块(统计协议层ping特定地址丢包数)

    一 linux内核中neitfilter的处理过程 1 5个HOOK点的执行点说明 xff1a 数据包从进入系统 xff0c 进行IP校验以后 xff0c 首先经过第一个HOOK函数NF IP PRE ROUTING进行处理 xff1b 然
  • 基于TCP 实现客户端之间通信【1】

    前段时间学习了基于TCP协议下实现服务器与一个客户端的通信 xff0c 服务器与多个客户端之间的通信 xff0c 以及客户端之间的互相通信 下面就是我写的利用TCP和多线程技术实现客户端之间互相通信的代码 xff1a 服务器端 xff1a
  • 回环接口(loop-back/loopback)

    回环接口 xff08 loop back loopback xff09 Moakap 整理 Loopback 接口是一个虚拟网络接口 xff0c 在不同的领域 xff0c 其含义也大不一样 1 xff0e TCP IP 协议栈中的 loop
  • socket封装HTTP请求

    之前写过两个socket封装的HTTP GET请求 xff0c 可是知其然 xff0c 不知所以然 这次写POST请求就有点懵逼了 还是从大佬的文章出发 xff1a https blog csdn net a19881029 article
  • access中,如何删除不可见空格

    1 可以使用 Trim 函数 xff0c 删除字符串 首 尾 的正常空格 span class token keyword update span 表名 span class token keyword set span 字段 span c
  • Raspberry Pi树莓派分类和其相似产品介绍

    文章目录 前言一 1代树莓派二 2代树莓派三 3代树莓派四 4代树莓派五 树莓派Pico六 目前可替代板子介绍引用 前言 树莓派官网 作为小型计算机的代表 xff0c 树莓派可是作为开山鼻祖 xff0c 本文聊一下目前树莓派几代板子发展历程
  • ARM汇编指令ldr和MOV的区别

    1 八位图 数据 2 MOV指令 MOV指令可以把立即数或者寄存器内容 xff08 注意 xff1a 这里绝对不可以是内存 xff01 xff01 xff09 传递给一个寄存器 MOV对于立即数是有要求的 xff0c 就是上边的 8位图 数