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 体系结构数据流控制的第一步。

相关推荐
SomeOtherTime17 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
jianqiang.xue3 天前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
蜀黍@猿3 天前
ARM 汇编入门(十二):MMU、页表与虚拟内存全解析
汇编·arm开发·stm32·mcu
蜀黍@猿4 天前
ARM 汇编入门(十):标量浮点与 VFP 指令全解析
汇编·arm开发·stm32·mcu
Good白10196 天前
嵌入式:1.嵌入式入门|初识嵌入式、处理器、ARM与STM32
arm开发·stm32·嵌入式硬件
물の韜6 天前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
女神下凡7 天前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
女神下凡11 天前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
NamoAmitabha12812 天前
ARM Cortex-A9 核心架构(演化后的“缝合怪”)--deepseek
arm开发·zynq--ps