前言
一、LDR指令详解
1.基本语法
2.寻址方式
3.伪指令形式
二、MOV指令详解
1.基本语法
2.常见用法
3.特殊变体
三、STR指令详解
1.基本语法
2.寻址方式
四、三者区别与联系
1.基本语法
2.操作效率
3.大数值处理
总结
ARM汇编中的LDR、MOV和STR是三个最基础也最常用的指令,它们分别用于数据加载、数据移动和数据存储操作。理解这三个指令的区别和正确用法对掌握ARM架构编程至关重要。
LDR (Load Register) 指令用于从内存加载数据到寄存器。
LDR Rd, [Rn, #offset]
其中,Rd:目标寄存器,Rn:基址寄存器,offset:可选偏移量
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
LDR R0, =0x12345678 ; 伪指令,将32位常量加载到R0
LDR R0, label ; 从标签处加载数据
MOV (Move) 指令用于将数据从一个寄存器移动到另一个寄存器,或将立即数加载到寄存器。
MOV Rd, Operand2
其中,Rd:目标寄存器,Operand2:源操作数(寄存器或立即数)
MOV R0, R1 ; 将R1的值复制到R0
MOV R0, #0xFF ; 将立即数0xFF赋值给R0
MOV R0, #0 ; 将R0清零
MOVT R0, #0x1234 ; 修改R0的高16位
MOVW R0, #0x5678 ; 修改R0的低16位
STR (Store Register) 指令用于将寄存器中的数据存储到内存。
STR Rd, [Rn, #offset]
其中,Rd:源寄存器,Rn:基址寄存器,offset:可选偏移量
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
LDR:内存→寄存器,用于读取数据
MOV:寄存器→寄存器或立即数→寄存器,无内存访问
STR:寄存器→内存,用于写入数据
MOV最快,因为不涉及内存访问
LDR和STR涉及内存操作,速度较慢
MOV只能直接加载有限范围的立即数(通常8位+循环移位)
LDR伪指令可以加载任意32位值,但编译器可能转换为PC相对寻址或多条指令
LDR用于从内存加载数据到寄存器
MOV用于寄存器间移动数据或将立即数加载到寄存器
STR用于将寄存器数据存储到内存
在效率和适用场景上,MOV最快但功能受限,LDR最灵活但速度较慢
良好的汇编代码应平衡使用这三种指令,根据具体场景选择最优方案