ARM 汇编指令:MOV

ARM 汇编指令:MOV

本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~
1、汇编指令在不同架构中的联系与区别
2、ARM 汇编指令:MOV
3、ARM 汇编指令:LDR
4、ARM 汇编指令:STR
5、ARM 汇编指令:MRS 和 MSR
6、ARM 汇编指令:ORRS

在 ARM 架构汇编语言中,MOV 指令是 最常用 的数据传输指令之一,其全称是 Move。

核心功能:数据传送

它的主要作用是将一个 源操作数 的值复制到 目标寄存器 中。可以将其理解为高级语言中的赋值操作(例如 x = y)。

基本语法格式:

assembly 复制代码
MOV{条件}{S}  目标寄存器, 源操作数

关键特性与详细解释

1. 数据来源广泛

源操作数可以是:

  • 另一个寄存器 : MOV R1, R2 // 将 R2 的值复制到 R1
  • 一个立即数 : MOV R0, #0x42 // 将十六进制数 0x42(十进制66)存入 R0。ARM 中的立即数通常有特定的编码限制(8位值循环移位偶数位)。
  • 一个移位后的寄存器值 :这是 ARM 指令集的一大特色,允许在一条指令中完成移位和传送。
    • MOV R1, R2, LSL #2 // 将 R2 的值逻辑左移2位 后,结果存入 R1。这相当于 R1 = R2 * 4。
2. 条件执行(可选的{条件}后缀)

ARM 指令大多可以条件执行,MOV 也不例外。它根据处理器状态寄存器(CPSR)中的条件标志位来决定是否执行。

  • MOVEQ R0, R1 // 如果相等(Z=1) ,则执行 R0 = R1。
  • MOVNE R0, #0 // 如果不相等(Z=0) ,则执行 R0 = 0。
  • 其他条件如 MOVGT(大于)、MOVLT(小于)等也同样适用。
3. 影响标志位(可选的{S}后缀)

默认情况下,MOV 指令不会 影响状态寄存器中的标志位(如 N、Z)。如果需要在移动数据的同时更新标志位,需要加上 S 后缀。

  • MOVS R0, #0 // 将 0 送入 R0,并 根据结果设置标志位。由于结果为0,这将设置 Z(零)标志 为 1。
  • 这在需要根据移动的值进行后续条件判断时非常有用。
4. 与加载指令(LDR)的区别

初学者容易混淆 MOV 和 LDR:

  • MOV : 在寄存器之间 或将立即数移入寄存器时使用。它操作的数据已经存在于 CPU 可直接访问的寄存器或指令编码中。
  • LDR : 主要功能是从内存 中加载数据到寄存器。例如 LDR R0, [R1] 表示将 R1 寄存器中值作为地址,从该内存地址读取数据到 R0。
  • 特殊情况下,LDR 也可以用于加载一个复杂的、无法用 MOV 指令编码的立即数(例如一个 32 位的地址常量),汇编器会将其转换为从"文字池"加载的代码。

实例说明

assembly 复制代码
MOV   R0, #10          @ R0 = 10
MOVS  R1, R0           @ R1 = R0 (R1 = 10),并更新标志位(这里不会改变Z标志,因为10不为0)
MOVEQ R2, #0xFFFFFFFF  @ 仅当上条指令使 Z=1(即结果为0)时,才执行 R2 = 0xFFFFFFFF

MOV   R3, R1, LSL #3   @ R3 = R1 << 3 (10 << 3 = 80),相当于乘以8
MOV   PC, LR           @ 将链接寄存器 LR 的值复制到程序计数器 PC,常用于从子程序返回

ARMv7/AArch32 与 ARMv8/AArch64 的区别

  • 在 ARMv7(32位 ARM)中 : MOV 指令可以操作 32 位的通用寄存器(R0-R15)。
  • 在 ARMv8/AArch64(64位 ARM)中 :
    • 寄存器是 64 位的(X0-X30)。
    • MOV 在 AArch64 中实际上是一些其他指令(如 ORR 或 MOVZ/MOVK)的别名 ,但汇编器仍然接受 MOV 助记符。
    • 有专门的 MOV 变种来处理 32 位和 64 位数据:
      • MOV W0, #5 // 将 5 放入 32 位的 W0 寄存器(X0 的低32位)。
      • MOV X0, #5 // 将 5 放入 64 位的 X0 寄存器。

总结

MOV 指令是 ARM 汇编的基石,负责在寄存器间或与立即数之间进行高效的数据搬移。其结合条件执行 和嵌入式移位操作 的特性,使得 ARM 汇编代码非常紧凑和强大。理解 MOV 是理解 ARM 体系结构数据流控制的第一步。

相关推荐
剑指offer.2 小时前
ARM裸机开发-SPI
arm开发·嵌入式硬件·嵌入式·arm
sunoo-2293 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
狂奔蜗牛(bradley)5 小时前
把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑
arm开发·人工智能·fpga开发·架构
水饺编程7 小时前
第1章:下载 Linux 0.12 内核
linux·c语言·汇编·ubuntu
水饺编程8 小时前
第1章:开发环境搭建,在 Windows 中安装 Git
linux·c语言·汇编·git·ubuntu
水饺编程1 天前
第1章:在 Windows 中安装 GCC 套件
c语言·汇编
女神下凡1 天前
芯参谋(37):EEPROM_电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
水饺编程2 天前
第1章,了解乌班图环境,使用浏览器和邮箱
c语言·汇编·ubuntu
女神下凡2 天前
芯参谋(30):EMMC eMCP 软件设计规范
arm开发·单片机·嵌入式硬件·设计规范
水饺编程2 天前
第1章:开发环境搭建,在 Windows 中安装 QEMU
c语言·汇编