为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。
Thumb指令集是ARM指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,Thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令集而不支持ARM指令集。
当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态,当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作状态(CPSR的T=0:arm,T=1:thumb)。Thumb指令集并没有改变ARM体系底层的编程模型,只是在该模型上增加了一些限制条件,只要遵循一定的调用规则,Thumb子程序和ARM子程序就可以互相调用。
与ARM指令集相比较,Thumb指令集中的数据处理指令的 *** 作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,相比之下从指令集上看thumb和arm主要有以下不同:
l 跳转指令。条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。
l 数据处理指令。对通用寄存器进行 *** 作, *** 作结果需放入其中一个 *** 作数寄存器,而不是第三个寄存器。
l 单寄存器加载和存储指令。Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。
l 批量寄存器加载和存储指令。LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储,PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0~R7外,PUSH指令还可以存储链接寄存器R14,并且POP指令可以加载程序指令PC。
Thumb指令集没有包含进行异常处理时需要的一些指令,因此,在异常中断时还是需要使用ARM指令。这种限制决定了Thumb指令不能单独使用需要与ARM指令配合使用。
2 thumb寄存器和arm寄存器的关系
1)、Thumb 状态寄存器集是ARM 状态寄存器集的子集
程序员可直接访问8 个通用寄存器R0~R7、PC、堆栈指针SP、链接寄存器LR和CPSR。每个特权模式都有分组的SP、LR和SPSR。
2)、Thumb状态寄存器与ARM 状态寄存器的关系
Thumb状态寄存器与ARM状态寄存器有如下关系:
l Thumb状态R0~R7与ARM状态R0~R7相同。
l Thumb状态CPSR和SPSR与ARM状态CPSR和SPSR 相同。
l Thumb状态SP映射到ARM状态R13。
l Thumb状态LR映射到ARM状态R14。
l Thumb状态PC映射到ARM状态PC(R15)。
3)、在Thumb状态中访问高寄存器
在Thumb状态中高寄存器(寄存器R0~R7为低寄存器,寄存器R8~R15为高寄存器)不是标准寄存器集的一部分,汇编语言程序员对它们的访问受到限制,但可以将它们用于快速暂存。
可以使用MOV指令的特殊变量将一个值从低寄存器R0~R7转移到高寄存器R8~R15,或者从高寄存器到低寄存器。CMP指令可用于比较高寄存器和低寄存器的值。ADD 指令可用于将高寄存器的值与低寄存器搏闷锋的值相加。
---------------------------------------------------------------------------------------------------------------------------------
在编写Thumb指令时,先要基晌使用伪指令CODE16声明,编写ARM指令时,则可使用CODE32伪指令声明。
1、Thumb指令集没有协处理器指令、信号量指令、以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二 *** 作数受到限制;
2、大多数的Thumb数据处理指令采用2地址格式;
3、除了跳转指令B有条件执行功能之外,其他指令均为无条件执行,而且分支指令的跳转范围有更多限制;
4、数据处理指令是对通用寄存器进行 *** 作,在大多数情况下, *** 作的结果放入其中一个 *** 作数寄存器中,而不是放入第3个寄存器中;访问寄存器R8~R15受到一定的限制,除MOV、ADD指罩桥令访问R8~R15外,其他数据处理指令总是更新CPSR中ALU状态标志,访问寄存器R8~R15的Thumb数据处理指令不能更新CPSR中的ALU状态指示。
5、Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7;
6、LDM、STM指令可以将任何范围为R0~R7的寄存器子集加载或存储;
7、PUSH、POP指令使用栈寄存器R13作为基址堆栈 *** 作。
大多数ARM数据处理指令采用的是3地址格式(除了64位乘法指令外)。
所有异常都会使微处理器返回到ARM模式状态,并在ARM的编程模式中处理。由于ARM微处理器字传送地址必须可被4整除(即字对准),半字传送地址必须可被2整除(即半字对准)。而Thumb指令是2个字节长,而不是4个字节,所以,由Thumb执行状态进入异常时其自然偏移与ARM不同。
16位Thumb指令集是从32位ARM指令集提取指令格式的,每条Thumb指令有相同处理器模型所对应的32位ARM指令。
只要遵循ATPCS调用规则,Thumb子程序和ARM子程序就可以互相调用。
在要指定代码的存储空间不是一件特别简单的事情,尤其是你想为某个或某几个函数指定具体的地址。1,编译器只有在最终的Link阶段才会为代码和数据分配内存地址,因此指定代码段的地址一般是通过写一个link脚本来进行的。Link阶段时,编译器的Linker会读取你写的Link脚本,并且按照脚本的规定隐凯伍给代码分配地址。
2,根据ARM开发工具的不同,link脚本的语法和形式也有所不孙悉同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等开发工具都支持Link脚本。
如果你英文还可以,建议你直接找到开发工具的Help手册去研究。如果你英语实在不行,灶或也可以把开发工具名称和你代码的具体情况告诉我,我帮你看看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)