ARM指令和Thumb指令的区别
发布日期:2021-06-28 15:58:37
浏览次数:2
分类:技术文章
本文共 4652 字,大约阅读时间需要 15 分钟。
一、现在先区分下ARM指令集与Thumb指令集
Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率高 .Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持 ARM 指令集.因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的 ARM 指令集,比如,所有异常自动进入 ARM 状态.在编写 Thumb 指令时,先要使用伪指令 CODE16 声明,而且在 ARM 指令中要使用 BX指令跳转到 Thumb 指令,以切换处理器状态.编写 ARM 指令时,则可使用伪指令 CODE32声明.流水线处理:不同于微编码的处理器,ARM (保持它的 RISC 性)是完全硬布线的。
为了加速 ARM 2 和 3 的执行使用 3 阶段流水线。第一阶段持有从内存中取回的指令。第二阶段开始解码,而第三阶段实际执行它。故此,程序计数器总是超出当前执行的指令两个指令。(在为分支指令计算偏移量时必须计算在内)。
因为有这个流水线,在分支时丢失 2 个指令周期(因为要重新添满流水线)。所以最好利用条件执行指令来避免浪费周期。例如:
...
CMP R0,#0BEQ overMOV R1,#1MOV R2,#2over... 可以写为更有效的: ...CMP R0,#0MOVNE R1,#1MOVNE R2,#2 二、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 指令可以加载程序指令PCARM指令分为以下几种:一、ARM 存储器访问指令助记符 说明 操作 条件码位置LDR Rd,addressing 加载字数据 Rd←[addressing],addressing 索引 LDR{cond}LDRB Rd,addressing 加载无符字节数据 Rd←[addressing],addressing 索引 LDR{cond}BLDRT Rd,addressing 以用户模式加载字数据 Rd←[addressing],addressing 索引 LDR{cond}TLDRBT Rd,addressing 以用户模式加载无符号字数据 Rd←[addressing],addressing 索引 LDR{cond}BTLDRH Rd,addressing 加载无符半字数据 Rd←[addressing],addressing 索引 LDR{cond}HLDRSB Rd,addressing 加载有符字节数据 Rd←[addressing],addressing 索引 LDR{cond}SBLDRSH Rd,addressing 加载有符半字数据 Rd←[addressing],addressing 索引 LDR{cond}SHSTR Rd,addressing 存储字数据 [addressing]←Rd,addressing 索引 STR{cond}STRB Rd,addressing 存储字节数据 [addressing]←Rd,addressing 索引 STR{cond}BSTRT Rd,addressing 以用户模式存储字数据 [addressing]←Rd,addressing 索引 STR{cond}TSRTBT Rd,addressing 以用户模式存储字节数据 [addressing]←Rd,addressing 索引 STR{cond}BTSTRH Rd,addressing 存储半字数据 [addressing]←Rd,addressing 索引 STR{cond}HLDM{mode} Rn{!},reglist 批量(寄存器)加载 reglist←[Rn…],Rn 回存等 LDM{cond}{more}STM{mode} Rn{!},rtglist 批量(寄存器)存储 [Rn…]← reglist,Rn 回存等 STM{cond}{more}SWP Rd,Rm,Rn 寄存器和存储器字数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}SWPB Rd,Rm,Rn 寄存器和存储器字节数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}B二、ARM 数据处理指令助记符号 说明 操作 条件码位置MOV Rd ,operand2 数据转送 Rd←operand2 MOV {cond}{S}MVN Rd ,operand2 数据非转送 Rd←(operand2) MVN {cond}{S}ADD Rd,Rn operand2 加法运算指令 Rd←Rn+operand2 ADD {cond}{S}SUB Rd,Rn operand2 减法运算指令 Rd←Rn-operand2 SUB {cond}{S}RSB Rd,Rn operand2 逆向减法指令 Rd←operand2-Rn RSB {cond}{S}ADC Rd,Rn operand2 带进位加法 Rd←Rn+operand2+carry ADC {cond}{S}SBC Rd,Rn operand2 带进位减法指令 Rd←Rn-operand2-(NOT)Carry SBC {cond}{S}RSC Rd,Rn operand2 带进位逆向减法指令 Rd←operand2-Rn-(NOT)Carry RSC {cond}{S}AND Rd,Rn operand2 逻辑与操作指令 Rd←Rn&operand2 AND {cond}{S}ORR Rd,Rn operand2 逻辑或操作指令 Rd←Rn|operand2 ORR {cond}{S}EOR Rd,Rn operand2 逻辑异或操作指令 Rd←Rn^operand2 EOR {cond}{S}BIC Rd,Rn operand2 位清除指令 Rd←Rn&(~operand2) BIC {cond}{S}CMP Rn,operand2 比较指令 标志 N、Z、C、V←Rn-operand2 CMP {cond}CMN Rn,operand2 负数比较指令 标志 N、Z、C、V←Rn+operand2 CMN {cond}TST Rn,operand2 位测试指令 标志 N、Z、C、V←Rn&operand2 TST {cond}TEQ Rn,operand2 相等测试指令 标志 N、Z、C、V←Rn^operand2 TEQ {cond}三、乘法指令 具有 32×32 乘法指令,32×32 乘加指令,32×32 结果为 64 位的乘/乘法指令.助记符 说明 操作 条件码位置MUL Rd,Rm,Rs 32 位乘法指令 Rd←Rm*Rs (Rd≠Rm) MUL{cond}{S}MLA Rd,Rm,Rs,Rn 32 位乘加指令 Rd←Rm*Rs+Rn (Rd≠Rm) MLA{cond}{S}UMULL RdLo,RdHi,Rm,Rs 64 位无符号乘法指令 (RdLo,RdHi)←Rm*Rs UMULL{cond}{S}UMLAL RdLo,RdHi,Rm,Rs 64 位无符号乘加指令 (RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) UMLAL{cond}{S}SMULL RdLo,RdHi,Rm,Rs 64 位有符号乘法指令 (RdLo,RdHi)←Rm*Rs SMULL{cond}{S}SMLAL RdLo,RdHi,Rm,Rs 64 位有符号乘加指令 (RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) SMLAL{cond}{S}四、跳转指令在 ARM 中有两种方式可以实现程序的跳转,一种是使用跳转指令直接跳转,另一种则是直接向 PC 寄存器赋值实现跳转. 助记符 说明 操作 条件码位置B label 跳转指令 Pc←label B{cond}BL label 带链接的跳转指令 LR←PC-4, PC←label BL{cond}BX Rm 带状态切换的跳转指令 PC←label,切换处理状态 BX{cond}五、ARM协处理器指令ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现.助记符 说明 操作 条件码位置CDPcoproc,opcodel,CRd,CRn,CRm{,opcode2} 协处理器数据操作指令 取决于协处理器 CDP{cond}LDC{L} coproc,CRd〈地址〉 协处理器数据读取指令 取决于协处理器 LDC{cond}{L}STC{L} coproc,CRd,〈地址〉 协处理器数据写入指令 取决于协处理器 STC{cond}{L} ARM 寄存器到协处理器MCR coproc, opcodel,Rd,CRn,{,opcode2} 寄存器的数据传送指令 取决于协处理器 MCR{cond} 协处理器寄存器到 ARMMRC coproc, opcodel,Rd,CRn,{,opcode2} 寄存器到数据传送指令 取决于协处理器MCR{cond}五、ARM 杂项指令助记符 说明 操作 条件码位置SWI immed_24 软中断指令 产生软中断,处理器进入管理模式 SWI{cond}MRS Rd,psr 读状态寄存器指令 Rd←psr,psr 为 CPSR 或 SPSR MRS{cond}MSR psr_fields,Rd/#immed_8r 写状态寄存器指令 psr_fields←Rd/#immed_8r,psr 为 CPSR 或 SPSR MSR{cond}
转载于:
转载地址:https://blog.csdn.net/xiaodingqq/article/details/79295812 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月09日 10时17分14秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kettle学习笔记
2019-04-29
airflow问题合集
2019-04-29
sql
2019-04-29
BI分析
2019-04-29
JAVA线程之间如何通信
2019-04-29
java时间工具类
2019-04-29
rabbitmq简单队列使用例子
2019-04-29
rabbitmq工作队列使用例子
2019-04-29
rabbitmq订阅模型-广播使用例子
2019-04-29
rabbitmq订阅模型-路由使用例子
2019-04-29
rabbitmq订阅模型-主题使用例子
2019-04-29
RabbiMq Management无法访问解决方法
2019-04-29
java自定义注解(Annotation)开发
2019-04-29
分库分表分析
2019-04-29
springboot+mybatis+sharding-jdbc整合分库分表实战
2019-04-29
ireport结构体介绍
2019-04-29
jstat -gc pid数据详解
2019-04-29
测试堆空间常用jvm参数
2019-04-29
由eclipse转战idea后的学习笔记
2019-04-29
mybatis源码学习笔记
2019-04-29