### ARM指令速查手册知识点详解 #### 概述 ARM指令速查手册是为开发者提供一个方便快捷查询ARM指令集的工具。通过本手册,使用者能够迅速定位到所需的ARM指令及其功能,帮助开发者在开发基于ARM架构的软件时提高效率。 #### ARM指令集速查表解析 ##### 关键符号说明 - `{cond}`:条件码,根据不同的条件来决定是否执行该指令。 - `<a_mode2>`:指向表格中的寻址模式2部分,用于解释特定类型的寻址方式。 - `<Oprnd2>`:指向表格中的操作数2部分,用于解释指令的第二个操作数。 - `<a_mode2P>`:指向表格中的寻址模式2(后索引)部分,仅用于后索引寻址模式。 - `<fields>`:指向表格中的PSR字段部分,用于说明程序状态寄存器的字段。 - `<a_mode3>`:指向表格中的寻址模式3部分。 - `{S}`:如果存在`S`,则更新条件标志。 - `<a_mode4L>`:指向表格中的寻址模式4(块加载或栈弹出)部分。 - `C*,V*`:这些标志在架构版本v4及更早版本之后变得不可预测。 - `<a_mode4S>`:指向表格中的寻址模式4(块存储或栈压入)部分。 - `Q`:粘性标志,在溢出时总是更新(没有`S`选项)。使用MRS和MSR读取和重置。 - `<a_mode5>`:指向表格中的寻址模式5部分。 - `x,y`:B表示半寄存器[15:0],T表示[31:16]。 - `<reglist>`:用逗号分隔的一组寄存器列表,由花括号包围。 - `<immed_8r>`:一个32位常量,通过将8位值向右旋转偶数位形成。 - `{!}`:如果出现此符号,则在数据传输后更新基地址寄存器。 - `<immed_8*4>`:一个10位常量,通过将8位值左移两位形成。 - `§`:指向ARM架构版本表格。 #### 具体指令说明 ##### 数据移动指令 - **Move** (`MOV`): 将源操作数移动到目标寄存器。 - **格式**: `MOV{cond}{S}Rd,<Oprnd2>` - **效果**: `Rd:=Oprnd2` - **注释**: 如果设置了`S`标志,则会更新条件标志。 - **Not** (`MVN`): 对源操作数进行按位取反并将其移动到目标寄存器。 - **格式**: `MVN{cond}{S}Rd,<Oprnd2>` - **效果**: `Rd:=0xFFFFFFFFEOROprnd2` - **注释**: 如果设置了`S`标志,则会更新条件标志。 - **SPSR到寄存器** (`MRS`): 将特殊程序状态寄存器(SPSR)复制到指定寄存器。 - **格式**: `MRS{cond}Rd,SPSR` - **效果**: `Rd:=SPSR` - **CPSR到寄存器** (`MRS`): 将当前程序状态寄存器(CPSR)复制到指定寄存器。 - **格式**: `MRS{cond}Rd,CPSR` - **效果**: `Rd:=CPSR` - **寄存器到SPSR** (`MSR`): 将寄存器内容选择性地写入SPSR。 - **格式**: `MSR{cond}SPSR_<fields>,Rm` - **效果**: `SPSR:=Rm(selectedbytesonly)` - **寄存器到CPSR** (`MSR`): 将寄存器内容选择性地写入CPSR。 - **格式**: `MSR{cond}CPSR_<fields>,Rm` - **效果**: `CPSR:=Rm(selectedbytesonly)` - **立即数到SPSR** (`MSR`): 将立即数值选择性地写入SPSR。 - **格式**: `MSR{cond}SPSR_<fields>,#<immed_8r>` - **效果**: `SPSR:=immed_8r(selectedbytesonly)` - **立即数到CPSR** (`MSR`): 将立即数值选择性地写入CPSR。 - **格式**: `MSR{cond}CPSR_<fields>,#<immed_8r>` - **效果**: `CPSR:=immed_8r(selectedbytesonly)` ##### 算术运算指令 - **加法** (`ADD`): 将两个操作数相加并将结果存储在目标寄存器中。 - **格式**: `ADD{cond}{S}Rd,Rn,<Oprnd2>` - **效果**: `Rd:=Rn+Oprnd2` - **注释**: 如果设置了`S`标志,则会更新条件标志。 - **带进位加法** (`ADC`): 将两个操作数和进位位相加,并将结果存储在目标寄存器中。 - **格式**: `ADC{cond}{S}Rd,Rn,<Oprnd2>` - **效果**: `Rd:=Rn+Oprnd2+Carry` - **注释**: 如果设置了`S`标志,则会更新条件标志。 - **饱和加法** (`5EQADD`): 执行两个操作数的饱和加法,并将结果存储在目标寄存器中。 - **格式**: `5EQADD{cond}Rd,Rm,Rn` - **效果**: `Rd:=SAT(Rm+Rn)` - **注释**: 不支持移位或旋转。 - **双饱和加法** (`5EQDADD`): 执行两个操作数的双饱和加法,并将结果存储在目标寄存器中。 - **格式**: `5EQDADD{cond}Rd,Rm,Rn` - **效果**: `Rd:=SAT(Rm+SAT(Rn*2))` - **注释**: 不支持移位或旋转。 - **减法** (`SUB`): 从一个操作数中减去另一个操作数,并将结果存储在目标寄存器中。 - **格式**: `SUB{cond}{S}Rd,Rn,<Oprnd2>` - **效果**: `Rd:=Rn-Oprnd2` - **注释**: 如果设置了`S`标志,则会更新条件标志。 - **带借位减法** (`SBC`): 从一个操作数中减去另一个操作数和非进位位,并将结果存储在目标寄存器中。 - **格式**: `SBC{cond}{S}Rd,Rn,<Oprnd2>` - **效果**: `Rd:=Rn-Oprnd2-NOT(Carry)` - **注释**: 如果设置了`S`标志,则会更新条件标志。 - **反向减法** (`RSB`): 从源操作数中减去目标寄存器值,并将结果存储在目标寄存器中。 - **格式**: `RSB{cond}{S}Rd,Rn,<Oprnd2>` - **效果**: `Rd:=Oprnd2-Rn` - **注释**: 如果设置了`S`标志,则会更新条件标志。 通过以上对ARM指令集的详细介绍,我们可以看到ARM指令集涵盖了广泛的操作类型,包括数据移动、算术运算等基本操作。这对于开发基于ARM架构的应用程序非常重要,因为了解和熟悉这些指令有助于优化代码性能并提高编程效率。
- 粉丝: 82
- 资源: 27
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助