马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
ARM开发工具完全支持Thumb指令,应用程序可灵活的将ARM和Thumb子程序混合编程,以便在例程的基础上提高性能或代码密度。在编写Thumb指令时,先要用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,则可使用伪指令CODE32声明。与ARM指令集相比,Thumb指令集有如下特点: 采用16位二进制编码,而ARM指令是32位的。 由于是压缩的指令,在ARM指令流水线中实现Thumb指令时,先动态解压缩,然后作为标准的ARM指令来执行。 如何区分指令流取决于CPSR的第5位。若T置位,则认为是16位的Thumb指令,若T置0,则认为是32位的ARM指令。 由ARM模式进入Thumb模式时,是显式的的进入。所谓的“隐式的进入”就是说不执行交换转移指令,直接进入另一种模式。例如在异常状态下,由于Thumb指令不能处理异常,所以处理器自动转到ARM模式下执行。而“显式的进入”就是指使用交换转移指令来实现处理器模式的转换。 Thumb指令集没有协处理器指令、信号量指令、乘加指令、64位乘法指令以及访问CPSR或SPSR的指令,而且指令的第2操作数受到限制。 除了分支指令B有条件执行功能外,其他指令均为无条件执行。 大多数Thumb数据处理指令采用2地址格式。 1.
Thumb指令集编码 Thumb指令集编码如图
2.
Thumb状态切换 支持Thumb指令的ARM微处理器都可执行标准的32位ARM指令集。在任何时刻,CPSR的第5位决定了ARM微处理器执行的是ARM指令流还是Thumb指令流。若T置1,则认为是16位的Thumb指令流;若T置0,则认为是32位的ARM指令流。 (1)
进入Thumb模式 当系统复位后,ARM启动并执行ARM指令。进入Thumb指令模式有2种方法。一种是执行一条交换转移指令BX,将指令中的目标地址寄存器的最低位置置1,并将其他位的值放入程序计数器PC,则可进入Thumb指令。在此过程中由于指令引起了转移,这将刷新流水线,对已在流水线上的指令予以抛弃,不去执行它。例如: BX R0 ;若R0内容最低位为1,则转入Thumb状态 另一种方法是利用异常返回,也可把微处理器从ARM模式转换为Thumb模式。在这个过程中,ARM提供了2种机制;当返回地址保存在当前异常模式的R14时,采用传送指令;当返回地址保存在堆栈时,使用多寄存器加载/存储指令。值得注意的是,这两条指令用于返回到进入异常前所执行的指令流,而不是特地用于转换到Thumb模式。显然,这两条指令也改变程序计数器,并因此而刷新指令流水线。例如: MOV PC,R14 ;用于子程序的返回 STMFD SP!{<resisters>,LR} ;进入异常后将R14入栈,假设异常前执行的是
;Thumb指令,且PC保存与R14中
LDMFD SP!{<resisters>,PC} ;与以上指令相匹配的返回指令 (2)
退出Thumb模式 退出Thumb指令模式也有2种方法:一种是执行Thumb指令中交换指令BX指令可以显式地返回ARM指令流;另一种是利用异常进入ARM指令流,因为异常总是在ARM模式下进行,所以,任何时候发生异常都能隐式的返回到ARM指令流。 3.
编程模型 Thumb指令集是ARM指令集的一个子集,并只能对限定的ARM寄存器进行操作。其编程模型如图所示
Thumb指令集对低8位通用寄存器R0~R7具有全部访问权限,对寄存器R13~R15进行扩展作为特殊应用。 —R13用作堆栈指针SP; —R14用作链接寄存器LR; —R15用作程序计数器PC。 CPSR的条件标志位由算数和逻辑操作设置并控制转移。 图中有阴影的寄存器访问受到限制。除MOV或ADD指令访问寄存器R8~R15外,数据处理指令总是更新CPSR中的ALU状态标志。除CMP指令外,访问寄存器R8~R15的Thumb数据处理指令不能更新标志。 作为堆栈指针的R13在ARM代码中是纯粹的软约定,而在Thumb代码是某种硬件连接。 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |