参考https://www.embedded.com/introduction-to-arm-thumb/

一、为什么一个芯片需要thumb和arm两套指令集

许多复杂的功能在复杂指令集(CISC)处理器上执行只需要单一的一条指令,即可,虽然可能有点慢,在精简指令集处理器上可能需要多条指令,所以在精简指令集(RISC)CPU上为了减少额外的指令对内存的消耗,考虑引入thumb指令集到处理器。

现在最受欢迎的32位微处理器许多都使用RISC技术,不像CISC处理器,RISC引擎每一个时钟周期(个人感觉应该是指令周期),都能执行一条指令,而CISC每条指令执行消耗的时钟周期是不一样的。

精简指令集的优势是设计简单,每条指令执行消耗时钟周期固定,劣势是碰上复杂的功能需要多条指令才能实现复杂指令及一条指令所能完成的功能,所以存储指令需要消耗额外的内存空间;

复杂指令集的优势是指令丰富,有些精简指令集需要很多条指令完成的功能,复杂指令集只需要一条指令,虽然可能有点慢,但是节约内存空间,劣势是,芯片设计复杂,有些复杂指令使用频率很低,每条指令执行消耗的时钟周期都不同。

所以精简指令集的arm架构引入thumb指令减少存储指令对内存的消耗,在嵌入式领域内存空间是更为紧急的资源。

二、arm指令集和thumb指令集的区别

Thumb指令集由16位指令组成,它们作为标准ARM的32位指令子集的简写,每条Thumb指令都可以通过等效的32位ARM指令来执行。然而,并不是所有的arm指令都在thumb子集中可用;例如,thumb指令无法访问状态或协处理器寄存器。此外,一些可以在arm指令中完成的功能只能通过thumb指令序列来模拟。

实际上arm只包含一种指令集那就是32-bit的arm指令集。当处理器运行在thumb状态时,处理器把从内存中读取的thumb指令扩展成与它等价的32-bit的arm指令,然后执行。

thumb指令和与它等价的arm指令的不同,并不是功能上的不同,而是在指令执行前的取指(fetch)和译码(interpret)的不同。由于将16-bit的指令扩展成32-bit的指令是通过芯片上专门的硬件完成的,所以这一过程并不会影响整个执行的速率,反而更狭小的16-bit的thumb指令在内存的利用上更有优势。

Thumb指令集提供了典型应用程序所需的大部分功能。算术和逻辑操作,加载/存储数据移动,以及条件和无条件的分支跳转。任何用C编写的代码都可以在Thumb状态下成功执行。但是,设备驱动程序和异常处理程序通常必须至少部分在ARM状态下编写。

寄存器组的区别

在arm状态的用户模式下,17个寄存器是可见的;thumb状态下12个寄存器可见,并且它们是在物理上和arm状态下完全相同的寄存器。所以在软件运行在arm状态和thumb状态时,可以通过R0-R7来传递数据,这在实际的应用中非常常用。

最大的寄存器不同点是SP寄存器。在Thumb状态下,有专门的助记符PUSH和POP来操作SP寄存器,但是这两个助记符在arm状态下是不存在的,它们假设以R13为堆栈指针,并将助记符转换成arm状态下的load和store指令。

CPSR寄存器保存处理器模式(用户或异常标志)、中断掩码位、条件代码和thumb状态位。thumb状态位(T)表示处理器的当前状态:0表示ARM状态(默认),1表示Thumb状态。虽然CPSR中的其他位可能在软件中被修改,但直接写入T是危险的;不适当的状态改变的结果是不可预测的。

三、arm状态和thumb状态的转换

有几种方法可以正确地进入或离开thumb状态。常用的方法是通过BX(Branch and Exchange, BX)指令。如果您使用的是版本5架构的ARM,BLX( Branch, Link, and Exchange)指令也可以切换。在分支跳转时,CPU检查目标地址的最小有效位(LSb)以确定新的状态。因为所有的ARM指令都会在32位或16位边界上对齐,所以地址的LSB在分支跳转中并没有使用,所以可以用目标地址的最低位来决定是否切换到arm状态或者thumb状态。如果在arm状态下执行bx指令或者blx指令跳转时,目标地址的最低bit为1,则先切换处理器到thumb状态,然后执行目标地址处的代码;如果在thumb状态下执行bx或者blx指令跳转时,目标地址最低bit为0,则先切换到arm状态,再执行目标地址处的代码。

另外一种方法是,当异常出现时,处理器会自动以arm状态开始执行中断向量表指定地址处的代码,当然如果需要的话,在异常处理的过程用也可以通过分支跳转来切换到thumb状态。

异常返回时,会根据SPSR寄存器中存储的T状态,来决定返回到thumb状态还是arm状态。

thumb指令和arm指令相关推荐

  1. ISA——x86指令、ARM指令、、

    ISA(instruction set architecture)指令集维基定义https://en.wikipedia.org/wiki/Instruction_set_architecture 无 ...

  2. ARM指令和Thumb指令的区别

    一.现在先区分下ARM指令集与Thumb指令集        Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率 ...

  3. x86指令集和arm指令集部分对比

    本文主题:本文主要对比了x86 ISA 和 arm ISA的部分区别. 目录 一.x86 ISA 1.指令组成 二.指令各部分解析 1.Instruction Prefixes(可选部分) 2.Opc ...

  4. arm 指令 学习载录

    ARM处理器汇编 ARM寻址方式: 1. 立即寻址,操作数在指令中给出. ADDR0,R0,#1;    R0ßR0+1 ANDR8,R7,#&FF; R8ßR7[7:0]; ADDR0,R0 ...

  5. ARM指令寻址方式之: 内存访问指令寻址

    4.2  内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ ...

  6. Arm指令模拟器开发参考指南【翻译自 armDeveloper】

    目录 简介 开始 安装ARMIE 安装之前 安装步骤 安装之后 开始使用ARM 指令模拟器 开始之前 步骤 示例:编译并执行一个"Hello World"程序 示例:编译,向量化和 ...

  7. Trumb/ARM 指令模式

     ARM ARM 指令集是一组提供一整套运算的 32 位指令. ARMv4T ARMv4T 及更高版本定义了一个名为 Thumb 指令集的 16 位指令集. 32 位 ARM指令的多数功能都可用,但有 ...

  8. arm 指令1(转)

    指令格式:  指令{条件}{S} {目的Register},{OP1},{OP2} "{ }"中的内容可选.即,可以不带条件只有目的寄存器,或 只有目的寄存器和操作数1,也可以同时 ...

  9. Android ARM指令学习

    在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...

最新文章

  1. on-my-zsh git 仓库下运行卡顿
  2. BiB:王秀杰/裴小兵合作开发单细胞组学细胞标记基因鉴定算法COSG
  3. python找字符串片段_python – 需要遍历字典才能找到字符串片段
  4. mybatis开启二级缓存和懒加载,类型别名,类都简称
  5. MacOS如何控制应用对麦克风和日历日程的访问
  6. win10如何打来计算机的工具,电脑系统教程:Win10自带解压缩文件工具如何使用
  7. 图片体积过大怎么缩小?如何缩小图片文件的大小?
  8. GoodUP:智协云店通+BitCOO的4WiN全球互贸链 | 翼次元空间
  9. 云平台、面向服务的体系结构和云编程
  10. addition过程 sgnb_5G-NSA接入流程分析及问题定位四步法
  11. linux中磁盘的管理(挂载,分区,配额,加密)
  12. 网口压线顺序_网线水晶头接法顺序_网线水晶头接法口诀
  13. ECMAScript相关知识介绍
  14. c语言long类型转换成string,如何在C ++中将long转换为string?
  15. 从现在开始,格外珍惜时间,让生活充实起来
  16. 菜鸟带你使用JieCaoMediaPlayer播放本地视频
  17. 关于软件工程第一个博客
  18. 双向可控硅实现单相交流电机正反转(硬开通加缓冲吸收,无过零)
  19. 机械图样解读——螺旋线与螺旋面
  20. 整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了...

热门文章

  1. 【2018.07.29】(深度优先搜索/回溯)学习DFS算法小记
  2. IT人职业规划【转】
  3. 免费解决Android studio 3.0更新后搜狗输入法卡顿问题
  4. 初学css的重要知识点
  5. 软考中级软件设计师和系统集成项目管理工程师哪个更好考?
  6. qt 编译器 调试器
  7. 链表的添加、插入、更改、删除(算法入门)
  8. 计算长方形的周长和面积(类和对象)python
  9. spark sql教程_如何使用Spark SQL:动手教程
  10. ubuntu关于桌面特效