LDR、MOV和STR指令详解

文章目录

前言

一、LDR指令详解

1.基本语法

2.寻址方式

 3.伪指令形式

二、MOV指令详解

1.基本语法

2.常见用法

 3.特殊变体

 三、STR指令详解

1.基本语法

2.寻址方式

 四、三者区别与联系

 1.基本语法

 2.操作效率

 3.大数值处理

总结


前言

ARM汇编中的LDR、MOV和STR是三个最基础也最常用的指令,它们分别用于数据加载、数据移动和数据存储操作。理解这三个指令的区别和正确用法对掌握ARM架构编程至关重要。


一、LDR指令详解

LDR (Load Register) 指令用于从内存加载数据到寄存器。

1.基本语法

LDR Rd, [Rn, #offset]

 其中,Rd:目标寄存器,Rn:基址寄存器,offset:可选偏移量

2.寻址方式

LDR R0, [R1]          ; 直接寻址,R0 = Memory[R1]
LDR R0, [R1, #4]      ; 偏移寻址,R0 = Memory[R1+4]
LDR R0, [R1, #4]!     ; 前索引寻址,R1 = R1+4,然后R0 = Memory[R1]
LDR R0, [R1], #4      ; 后索引寻址,R0 = Memory[R1],然后R1 = R1+4

 3.伪指令形式

LDR R0, =0x12345678   ; 伪指令,将32位常量加载到R0
LDR R0, label         ; 从标签处加载数据

二、MOV指令详解

MOV (Move) 指令用于将数据从一个寄存器移动到另一个寄存器,或将立即数加载到寄存器。

1.基本语法

MOV Rd, Operand2

 其中,Rd:目标寄存器,Operand2:源操作数(寄存器或立即数)

2.常见用法

MOV R0, R1            ; 将R1的值复制到R0
MOV R0, #0xFF         ; 将立即数0xFF赋值给R0
MOV R0, #0            ; 将R0清零

 3.特殊变体

MOVT R0, #0x1234      ; 修改R0的高16位
MOVW R0, #0x5678      ; 修改R0的低16位

 三、STR指令详解

STR (Store Register) 指令用于将寄存器中的数据存储到内存。

1.基本语法

STR Rd, [Rn, #offset]

 其中,Rd:源寄存器,Rn:基址寄存器,offset:可选偏移量

2.寻址方式

STR R0, [R1]          ; 直接寻址,Memory[R1] = R0
STR R0, [R1, #4]      ; 偏移寻址,Memory[R1+4] = R0
STR R0, [R1, #4]!     ; 前索引寻址,R1 = R1+4,然后Memory[R1] = R0
STR R0, [R1], #4      ; 后索引寻址,Memory[R1] = R0,然后R1 = R1+4

 四、三者区别与联系

 1.基本语法

        LDR:内存→寄存器,用于读取数据

        MOV:寄存器→寄存器或立即数→寄存器,无内存访问

        STR:寄存器→内存,用于写入数据

 2.操作效率

        MOV最快,因为不涉及内存访问

        LDR和STR涉及内存操作,速度较慢

 3.大数值处理

        MOV只能直接加载有限范围的立即数(通常8位+循环移位)

        LDR伪指令可以加载任意32位值,但编译器可能转换为PC相对寻址或多条指令


总结

        LDR用于从内存加载数据到寄存器

        MOV用于寄存器间移动数据或将立即数加载到寄存器

        STR用于将寄存器数据存储到内存

        在效率和适用场景上,MOV最快但功能受限,LDR最灵活但速度较慢

        良好的汇编代码应平衡使用这三种指令,根据具体场景选择最优方案

你可能感兴趣的:(记录,mov,ldr,str,嵌入式,汇编,ARM,单片机)