ARM Thumb 指令集.docVIP

  • 2
  • 0
  • 约2.96千字
  • 约 3页
  • 2018-05-05 发布于河南
  • 举报
ARM Thumb 指令集

ARM Thumb 指令集 Thumb 指令可以看作是ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16 位的代码密度。Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持ARM 指令集。因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的ARM 指令集,比如,所有异常自动进入ARM 状态。 在编写Thumb 指令时,先要使用伪指令CODE16 声明,而且在ARM 指令中要使用BX指令跳转到Thumb 指令,以切换处理器状态。编写ARM 指令时,则可使用伪指令CODE32声明。 1 Thumb 指令集与ARM 指令集的区别 Thumb 指令集没有协处理器指令,信号量指令以及访问CPSR 或SPSR 的指令,没有乘加指令及64 位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B 有条件执行功能外,其它指令均为无条件执行;大多数Thumb 数据处理指令采用2 地址格式。Thumb指令集与ARM 指令的区别一般有如下几点: 跳转指令 程序相对转移,特别是条件跳转与ARM 代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。 数据处理指令 数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3 个寄存器中。 数据处理操作比ARM 状态的更少,访问寄存器R8~R15 受到一定限制。 除MOV 和ADD 指令访问器R8~R15 外,其它数据处理指令总是更新CPSR 中的ALU 状态标志。 访问寄存器R8~R15 的Thumb 数据处理指令不能更新CPSR 中的ALU 状态标志。 单寄存器加载和存储指令 在Thumb 状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。 批量寄存器加载和存储指令 LDM 和STM 指令可以将任何范围为R0~R7 的寄存器子集加载或存储。 PUSH 和POP 指令使用堆栈指令R13 作为基址实现满递减堆栈。除R0~R7 外,PUSH 指令还可以存储链接寄存器R14,并且POP 指令可以加载程序指令PC。 2 Thumb 存储器访问指令 Thumb 指令集的LDM 和SRM 指令可以将任何范围为R0~R7 的寄存器子集加载或存储。 批量寄存器加载和存储指令只有LDMIA、STMIA 指令,即每次传送先加载/存储数据,然后地址加4。对堆栈处理只能使用PUSH 指令及POP 指令。表A-9给出Thumb存储器访问指令。 LDR 和STR 立即数偏移的LDR 和STR 指令。存储器的地址以一个寄存器的立即数偏移指明。 PUSH 和POP 寄存器入栈及出栈指令。实现低寄存器和可选的LR 寄存器入栈寄存器和可选的PC寄存器出栈操作,堆栈地址由SP 寄存设置,堆栈是满递减堆栈。 LDMIA 和STMIA 批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。Thumb 指令集批量加载/存储指令为LDMIA 和STMIA,LDMIA 为加载多个寄存器;STM为存储多个寄存器,允许一条指令传送8 个低寄存器的任何子集。 3 Thumb 数据处理指令 大多数Thumb 处理指令采用2 地址格式,数据处理操作比ARM 状态的更少,访问寄存器R8~R15 受到一定限制。 (1)数据传送指令 MOV 数据传送指令。将8 位立即数或寄存器(operand2)传送到目标寄存器(Rd)。 MVN 数据非传送指令。将寄存器Rm 按位取反后传送到目标寄存器(Rd)。 NEG 数据取负指令。将寄存器Rm 乘以-1 后传送到目标寄存器(Rd)。 算术逻辑运算指令 ADD 加法运算指令。将两个数据相加,结果保存到Rd 寄存器。 SUB 减法运算指令。将两个数相减,结果保存到Rd 中。 ADC 带进位加法指令。将Rm 的值与Rd 的值相加,再加上CPSR 中的C 条件标志位,结果存到Rd 寄存器。 SBC 带进位减法指令。用寄存器Rd 减去Rm,再减去CPSR 中的C 条件标志的非(即若C 标志清零,则结果减去1),结果保存到Rd 中。 MUL 乘法运算指令。用寄存器Rd 乘以Rm,结果保存到Rd 中。 AND 逻辑与操作指令。将寄存器Rd 的值与寄存器Rm 值按位作逻辑与操作,结果保存到Rd 中。 ORR 逻辑或操作指令。将寄存器Rd 与寄存器Rn 的值按位作逻辑或操作,结果保存到Rd中。 EOR 逻辑异或操作指令。寄存器Rd 的值与寄存器Rn 的值按位作逻辑异或操作,结果保存到Rd 中BIC 位清除指令。将寄存器Rd 的值与寄存器R

文档评论(0)

1亿VIP精品文档

相关文档