Thumb指令是将ARM指令集的一个子集重新编码而形成的一个
指令集,arm指令长度为32位,
Thumb指令长度位为16位。
支持Thumb指令的arm体系版本,使用字符T来表示。
目前Thumb指令集具有一下两个版本:
Thumb 指令集版本1 用于arm体系版本4的T变种
Thumb 指令集版本2用于arm体系版本5的变种
r0~r7任何模式下同一个物理寄存器不存在备份,
不用于特殊用途
r8~r12 对应两个不同的物理寄存器在快速终端模式下r8记作r8_
fiq;用户模式下记作r8_usr仅仅使用这几个寄存器时,
fiq处理程序不保存和恢复中断现场的指令
r13~r14,分别对应6个不同的物理寄存器,
其中的一个是用户模式和系统模式共用的;
另外的5个对应于其他5种处理器模式;分别为R13_<<wbr>mode>:mode对应usr、svc、abt、und、
irq、fiq。
习惯将r13用作栈指针;
寄存器R13(也称为堆栈指针或SP)有6个分组的物理寄存器,
寄存器R13通常作为堆栈指针SP。在ARM指令集中,
3、链接寄存器 R14
寄存器R14(也称为链接寄存器或LR)
☆ 当发生异常时,它被设置为该异常返回地址;
☆ 在执行分支和链接(BL)指令时,它用于保存子程序的返回地址;
☆ 而在其他时候,可以作为一个通用寄存器来对待。
r15:程序计数器又被记作pc,一般不用做通用寄存器;
PC一般指向地址上连续的下面第二条指令,所以对ARM状态来说,就是当前指令的地址+8; 对thumb来说,就是+4。因为ARM指令以字为边界, 所以写入R15值的bit[1:0]通常为0b00。
5、CPSR和SPSR
CPSR:当前程序状态寄存器
SPSR:备份程序状态寄存器
所有模式共享一个程序状态寄存器CPSR。在异常模式中,
程序状态保存寄存器SPSR可以被访问,
每种异常具有自己私有的SPSR。在进入异常时,
它保存CPSR的当前值;在异常退出时,可通过它(SPSR)
恢复CPSR。
CPSR:
ARM体系中通常有3中方式控制程序的执行流程:
1.正常程序流程:每执行一条arm指令,pc的值加4( 执行当前执行指令的下两条指令),每执行一条thumb指令, pc的值加2;顺序执行
2、通过跳转指令:
b 指令用于执行跳转操作;
bl 跳转同时保存子程序的返回地址
bx 跳转同时根据pc的值确定是否将程序切换到thumb状态
blx 执行上面3个
3、异常中断发生时, 系统执行完当前指令后将跳转到相应的异常中断
arm中异常中断:
arm处理器对异常中断的响应过程:
1、保存处理器当前状态cpsr, 即将cpsr各位保存到相应中断对应的spsr寄存器
2、设置cpsr相应位及,使处理器进入相应的执行模式、 禁止irq中断,当是进入fiq模式是,禁止fiq中断。
3、将寄存器Ir_mode 设置成返回地址
4、将pc值设置成异常中断向量地址, 从而跳转到相应的异常中断处理程序处执行
下面用伪代码来描述:
R14_ = Return Link
SPSR_ = CPSR
CPSR[4:0] = Exception Mode Number
CPSR[5] = 0 ;当允许于arm指令状态时
If == Reset or FIQ then
CPSR[6] = 1 ;当响应FIQ或复位异常时,禁止新的FIQ中断
CPSR[7] = 1 ;禁止IRQ中断
PC = Exception Vector Address
异常处理完毕之后, ARM微处理器会执行以下几步操作从异常返回:
●由链接寄存器LR的值恢复PC,返回到发生异常中断的指令的下 一条指令处执行程序。
●将SPSR复制回CPSR中。
●若在进入异常处理时设置了中断禁止位,要在此清除。
复位系统后,开始整个异常应用程序的执行,因此, 复位异常处理程序不需要返回。
1.7.1arm体系存储空间
arm体系的地址空间为2^32个8位字节, 而arm是字对齐处理,所以可以看成2^30个32为的字; 地址为A的字数据包括A/A+1/A+2/A+3 4个字节的内容
这就是为什么写入R15值的bit[1:0]通常为0b00。
arm存储器格式:(4个字节那边是高那边是低)格式如下
1.7.3非对齐的存储访问操作: