ARM3级流水线和中断返回地址地址
ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1、取指(从存储器装载一条指令);2、译码(识别将要被执行的指令,得到下一指令占据数据路径,寄存器被读取,操作数在桶式移位器中被以为。ALU产生相应的运算结果并写回到目的寄存器中,ALU结果根据指令需求更改状态寄存器的条件位)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前指令第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;详细分解:
第一周期对第一指令进行取指操作。
第二周期对第一指令进行译码,同时对第二指令进行取指操作。
第三周期对第一指令进行执行,第二指令进行译码,并同时对第三条指令执行操作
地址 指令
0x3000 A
0x3004 B
0x3008 C
0x300c D
(1)SWI和未定义指令异常
此时正在执行指令A(此时PC=0x3008)的同时在译码阶段发生SWI或未定义指令异常,等指令A执行完后(此时PC还没有发生改变PC=0x3008)进行SWI或未定义指令粗合理,同时把当前PC值赋给寄存器LR(LR=0x3008)然后再进行自动调整LR=LR-0x04(此时LR=0x3004),这样当异常返回时就到地址为0x3004的指令处执行。所以再进入异常的时候LR不需要修改
(2)IRQ和FIQ异常
此时正在执行指令A(此时PC=0x3008)的同时发生IRQ和FIQ异常,等指令A执行完后(此时PC发生改变PC=0x300c)进行IRQ和FIQ异常响应,同时把当前PC值赋给寄存器LR(LR=0x300c)然后再进行自动调整LR=LR-0x04(此时LR=0x3008),这样当异常返回时就到地址为0x3008的指令C处执行(可以看出跳过了执行指令B),所以当进入异常的时候要执行“SUB LR,LR,#4”(此时LR=0x3004),当异常返回时就到地址为0x3004的指令B处执行。
(3)预取指令中止
此时正在执行指令A(此时PC=0x3008)发生预取指令中止异常,(此时PC没有发生改变PC=0x3008)进入预取指令中止异常响应,同时把当前PC值赋给寄存器LR(LR=0x3008)然后再进行自动调整LR=LR-0x04(此时LR=0x3004),这样当异常返回时就到地址为0x3004的指令B处执行,但是当发生指令预取中止异常时,程序要返回到该有问题的指令处,重新读取并执行该指令。异常指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处。所以当进入异常的时候要执行“SUB LR,LR,#4”(此时LR=0x3000),当异常返回时就到地址为0x3000的指令A处重新执行
(4)数据中止异常
此时正在执行指令A(此时PC=0x3008)的同时发生数据中止异常,等指令A执行完后进入下一条指令时(此时PC发生改变PC=0x300c)发生数据中止异常响应,同时把当前PC值赋给寄存器LR(LR=0x300c)然后再进行自动调整LR=LR-0x04(此时LR=0x3008),这样当异常返回时就到地址为0x3008的指令c处执行,但是发生数据访问中止异常中断时,程序要返回到该有问题的数据访问处,重新访问该数据。因此数据访问中止异常中断程序应该返回到产生该数据访问中止异常中断的指令处所以当进入异常的时候要执行“SUB LR,LR,#8”(此时LR=0x3000),当异常返回时就到地址为0x3000的指令A处重新执行
异常或入口
返回指令
之前的状态
ARM R14_x Thumb R14_x
备注
BL
MOV PC,R14
PC+4
PC+2
此处PC 为BL, SWI, 未定义的指令取指或者预取中止指令的地址。
SWI
MOVS PC,R14_svc
PC+4
PC+2
未定义的指令
MOVS PC,R14_und
PC+4
PC+2
预取中止
SUBS PC,R14_abt,#4
PC+4
PC+4
快中断
SUBS PC,R14_fiq,#4
PC+4
PC+4
此处PC 为由于FIQ 或IRQ 占先而没有被执行的指令的地址
中断
SUBS PC,R14_irq,#4
PC+4
PC+4
数据中止
SUBS PC,R14_abt,#8
PC+8
PC+8
此处PC 为产生数据中止的装载或保存指令的地址。
复位
无
-
-
复位时保存在R14_svc 中的值不可预知。
页:
[1]