Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126244
  • 博文数量: 44
  • 博客积分: 2115
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-05 19:58
文章分类

全部博文(44)

文章存档

2012年(4)

2011年(1)

2009年(39)

我的朋友

分类: 嵌入式

2009-11-11 21:08:35

通用寄存器 

    在16个通用寄存器(R0~R15)中,ARM CORE将下面几个寄存器单独对待: 
    (1)  R13:在所有的EXCEPTION模式下,都有其自身的R13。也就是说,在EXCEPTION模式和USER模式下,MOV R13, #0这条指令操纵的是不同的物理寄存器,尽管它们在指令中的逻辑地址是一样的。所有这一切都是硬件通过CPSR中的MODE域在背后采用类似于片选的机制实现的。这一切对指令系统而言是透明的。除此之外,从指令系统的角度看,R13同其他的通用寄存器R0~R12相比没有任何差别。由于R13的这种特点,实际应用中一般将其作为SP(Stack Pointer)来处理。 
    (2)  R14:R14具备R13的特点。同时他还有特殊的用途。从指令系统的角度看,R14一般作为函数调用或EXCEPTION过程处理返回的地址。比如BL指令在执行的时候,就将下一条指令的地址保存到R14中;另外,当产生异常的时候,系统会自动切换到相应的异常模式中,该模式下的R14会保存有产生异常之前的指令后移0, 4,8,或12后的位置(具体后移多少,要看实际产生的异常类型和具体的ARM CORE的实现而定)。因为指令系统对R14的特殊用途,要求我们在使用R14的时候要注意。 
    (3) R15:在整个ARM CORE中,只有一个R15。R15就是指令寄存器PC。同X86结构不一样的地方是,ARM允许使用指令直接修改R15的值,这样产生的效果类似于一个跳转指令。不过,由于ARM所有的指令要么是4字节,要么是2字节(Thumb模式),因此在直接操纵R15时,要注意其值要么是MOD 4=0,要么是MOD 2=0(Thumb模式),否则会导致CPU产生一个异常。 

状态寄存器 
    状态寄存器主要用来提供条件判断,中断开关和模式切换之用。除SYSTEM之外的特权模式都有自己的影子寄存器SPSR。 
    由于对状态寄存器的操作只能通过MRS和MSR进行,但是MRS和MSR是只有在特权模式下才能执行的指令,因此如果要切换状态,首先必须进入特权模式才可以。通常的做法是,执行一个swi调用进入特权模式(Supervisor模式),在该模式下可以自由进行模式切换。 
    在模式切换过程中,需要注意尽可能保证CPSR相关的位(特别是一些系统保留的比特位)在使用过程中没有被改变。因此通常的做法是将影子寄存器的值保存到某个通用寄存器中,然后对该寄存器的值进行修改,修改后通过MOVS或SUBS指令来从SPSR恢复CPSR,这样就达到了修改CPSR的目的。 


指令计数器PC(Program Counter) 

    同状态寄存器不一样,PC寄存器在整个系统中只有一个,没有任何备份或影子。不像x86,在ARM 里,可以通过指令对PC进行直接操作,这同对其他通用寄存器操作是一样的。但是PC也有其自身特点: 
   (1)  如果读取PC的值,那么读取的值为当前指令地址 + 8,由于所有的ARM指令都是4字节(非Thumb),因此这意味当前指令后的第二条指令地址。至于为什么是8而不是4,可能是ARM社记者在设计之初,假想后面有一条LDR指令(LDR PC,……),该LDR指令执行一个Procedure Call,后者返回的地址就刚好是LDR后面的一条指令,也就是上次所读出的PC值。这种解释是为了自己方便记忆而糊绉的,如果您有更好的或正确的理由,请务必“顶”一下,或者mail给我,本人将不胜感激。 
   (2)  改变PC值,意味作一条跳转指令,但是如果PC值不是4对齐(如果在THUMB模式下,就是2对齐),那么就会产生一个Prefetch指令异常。
RISC的目的是将指令简单化和规范化(这并不表示RSIC CPU的指令就少),为了实现这一目标, RISC: 
   (1) 规定所有的指令都是固定长度(一般为4个字节,ARM的THUMB模式下为2个字节),这可以使CPU指令预取模块简单化,并使得流水线设计更加简单。 
   (2) 所有的运算类操作在寄存器之间进行,很明显可以减少芯片的复杂度,降低成本,并使得指令的执行时间是可以预测的,方便了开发人员。 
   (3) 提供专门的内存访问指令在寄存器和内存之间交换数据,这可以减小芯片的复杂度,同时可以优化内存存取,这对流水线影响也是很大的,可以优化流水线的设计。 

    RISC这样做的目的是为了降低芯片设计的复杂度,减少芯片体积。这样设计的一个基本依据是“在一个指令系统中,只有20%的指令是常用的”,因此如果将所有指令等同对待去做设计,本身就是一种不公平的设计。正确的做法是对那些20%的常用指令进行优化设计,并优先考虑,而对那些很少用到的80%指令,一般通过那些常用指令的组合来获得,或者将这些工作留给软件开发人员。 
    由于RISC的所有操作都在寄存器之间进行,因此所有RISC结构的计算机的显著特点是包含大量的寄存器,比如ARM就有30个以上寄存器: 
    (1) 通用寄存器R0 ~ R15 
    (2) 状态仅存器CPSR及其不同模式下的影子寄存器 
    (3) 不同模式下的影子寄存器

阅读(912) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~