Chinaunix首页 | 论坛 | 博客
  • 博客访问: 601889
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: LINUX

2013-12-06 18:04:03

关于PC值的计算的问题:

1、三级流水线:其实对于PC = PC +8这个问题很简单,这两个PC其实代表着不同的意义,第一个PC是对于CPU而言,而第二个PC而言是我们通过编译器看到的PCPC指向程序正在运行的那一条指令),但是对于CPUPC是永远指向取指那个步,故PC = PC +8

2、五级流水线;  ARM9流水线包括取指(fetch)、译码(decode)、执行(excute)、缓冲/数据(buffer/data)、回写(write-back)寄存器堆。ARM9流水线在译码阶段已经开始读取操作数寄存器,因此译码阶段的PC值和取指阶段的PC值关系为:PCdecode=PCfetch+4。因此执行阶段的PC值和译码阶段的PC值关系为:PCexcute=PCdecode+4

 

 

3、对于软中断函数的返回时的PC:如下

ARM        Thumb

SWI            PC-8         PC-4

xxx      》    PC -4         PC-2   (异常返回将执行这条指令)

yyy            PC           PC

因此返回指令为: MOV  PC ,  LR

原因:异常是由指令本身引起的,因此内核在计算LR时的PC值并没有被更新。对于ARM状态,因为SWI指令表示将跳到异常处理函数,此时SWI这条指令的PC = PC -8,当进入异常处理函数之前,硬件会自动把PC-4保存到LR寄存器中,所以异常处理函数结束后直接MOV  PC,  LR就行,就会跳到xxx这一条指令去执行。对于Thumb状态同理。 

4、对于IRQFIQ中断函数返回时的PC

ARM        Thumb

xxx              PC-12       PC-6 (程序在运行这条代码时就产生了中断信号)

yyy    》         PC-8        PC-4  (异常返回将执行这条指令)

zzz               PC-4       PC-2

www             PC         PC 

返回指令为:     SUBS   PC, LR,  #4

原因:异常在当前指令执行完成后才会被响应,因此内核在计算LR时的PC值已被更新。对于ARM状态,程序在执行xxx这条指令时,中断信号产生,但是由于中断必须在这一条指令执行完之后才会被响应,执行完后,则此时对于CPUPC已经指向了www这条指令的取指,在中断函数函数时应该执行yyy这条指令,虽然硬件会把PC-4的值赋值给LR寄存器,但是这是指向zzz这条指令的,所以返回时应该SUBS   PC,  LR, #4。对于Thumb状态同理。

阅读(2358) | 评论(0) | 转发(0) |
0

上一篇:ARM经典300问

下一篇:ARM笔记(一)

给主人留下些什么吧!~~