天天看点

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

1.ARM简介

了解PC的人都知道,大部分PC机使用的都是interl的处理器,部分使用的是AMD的,但是在嵌入式领域,ARM是当之无愧的老大。不过ARM比较有趣的是ARM公司只做设计,由其他厂商生产对应的芯片,所以我们能够看到各个公司生产的各种各样的基于ARM的板卡。在学习嵌入式领域,使用比较多的是三星公司的S3C2440,S3C6410和210等。

在嵌入式领域,我们经常看到各种各样的名词,如armv6,6410和cortex A8等,它们分别指什么呢?这些名词大致分为三类:

  1. 芯片:2440,6410,210等
  2. arm核:arm7,arm9,cortex A8等
  3. arm指令结构:armv4,armv6,armv7等。

三者之间的关系怎么样呢?

首先来看芯片和arm核之间的关系。这个可以从芯片的手册中查到该片子使用的是那种arm核。打开2440的手册S3C2440.pdf,在第34页的图上可以看到一个框,里面内容为“ARM9TDMI Processor core (Internal Embedded ICE)”,这就说明了2440芯片用的是arm9,同理在6410的手册S3C6410.pdf的61页图中,可以看到“ARM1176JZF-S”字样,在210的手册“S5PV210_UM_REV1.1.pdf”的15页图中,可以在CPU Core的框中看到Cortex A8。

到此芯片和ARM核之间的关系就明确了。2440<->Arm9,6410<->ARM11,210<->A8

再看ARM核与指令架构之间的关系

这个可以从arm核的手册中查到该核使用的是哪种架构。开arm核的手册ARM920T_TRM1_S.pdf,可以从中查到arm9使用了哪种指令架构,在第27页的表中,可以看到ARM7TDMI和ARM9TDMI ARMv4T。打开ARM11的手册Arm1176jzfs.pdf,该文档中并没有直接说明使用的指令架构的语句,但是搜索armv6,可以找到大量与之相关的说明,这间接说明了arm11使用的事armv6指令架构,同理可以在210的手册确定其使用的指令架构为armv7。

自此,arm 的几种常见学习板的对应关系为:

  • 2440<->Arm9<->armv4
  • 6410<->ARM11<->armv6
  • 210<->A8<->armv7

arm芯片家族种类多,数量大,常见的几种,以及相互之间的关系如下图所示,该图是从一个培训结构的课件中看懂的,感觉直观的。

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

而ARM芯片可以分为3个系列:M系列,A系列和R系列,另外,还可以加上一个经典版本系列

arm的 M系列主要面向工控领域,没有OS,跑裸机程序,但是处理性能并不弱。

R系列主要面向实时应用。

A系列主要面向多媒体,很多手机都使用该芯片。

arm的经典系列,如arm7,arm9,arm11等。

从处理器的性能上看,arm7与M3基本持平,跑裸机程序,而arm9与arm11同比A5稍微弱一些,与R系列接近。

2.ARM的工作模式

划分模式的好处是让不同的程序可以运行在不同的级别,例如让OS或者uboot等运行在级别高级别,而用户程序或者不稳定的程序运行在级别低的模式下。从而保证系统的稳定性,便于管理。

如果要从整体上了解ARM的信息,ARM的官方手册《ARM Architecture Reference Manual.pdf》无疑是最完整、最权威的。在文档的“Programmers' Model”一章的A2.2节“Processos modes”说明了ARM的几种工作模式。

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

各种模式的特征从表里可以看得很清楚,这里整理几个关键点:

  1. 从这个表中可以看到 ,arm支持7种工作模式。各个模式的简写最好记住,因为有时候简称比全程用的更频繁,特别是usr、svc等。
  2. Linux系统里的运行在哪个模式?用户程序运行在usr模式,而os内核运行在svc模式。
  3. 如果要进行模式切换,有两种方式,一种是通过软件来控制,一种是通过外部中断或者异常处理来实现。
  4. 需要注意的是,对于安装了Linux操作系统的芯片,大部分的用户程序是运行在user模式的,而os运行在svc模式下的。当处理器在用户模式下的时候,执行的程序是无法访问某些受保护的系统资源的,也不能改变系统的工作模式。当然,发生异常的情况除外。
  5. 除了用户模式,其他模式都称为特权模式,它们都可以访问系统资源,并且可以自由改变运行模式。其中,它们中的五个又称为异常模式:FIQ、IRQ、svc、Abort和Undefined五种。

3.ARM的寄存器

根据《ARM Architecture Reference Manual.pdf》的A2.3节的介绍。这些寄存器是怎么划分,又有什么用呢?

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

参考上图和文档中的相关说明,我们可以得到下面的知识点: 

  1. ARM一共有37个寄存器。31个普通寄存器,包括一个程序计数器(PC)。6个状态寄存器。这些寄存器都是32位的。 
  2. 普通寄存器,31个:从R0~R14,再加一个PC,共16个。图中有的寄存器左下角有个三角号,例如R13_svc,这种寄存器一共15个,因此普通寄存器一共31个。在文档的注释中说明了这里加三角号的已经说明了其含义:表示在user或者system模式下使用的某个寄存器被换成了异常模式下对应的特有的寄存器替换了。例如use模式下的R14在不同的异常模式下分别被R14_svc,R14_abt,R14_und,R14_irq和R14_fiq等替换了。因此一共31个。
  3. 程序状态6个:cpsr和spsr_svc,spsr_abt,spsr_und,spsr_irq,spsr_fiq。
  4. 在文档的A2.4 节介绍通用寄存器R0到R15可以分为三组:不分组:R0~R7,分组的R8~R14,而R15,程序计数器,也就是PC指针。
  5. R13,R14和R15三个寄存器有特殊的功能,使用非常频。文档45页第一行说明R13一般是作为堆栈指针寄存器,也即SP。R14(又称为链接寄存器LR),它常记录返回地址,在正常情况下保存函数的返回地址,而发生异常时,R14作为异常返回地址.R15,PC指针,程序计数器。
  6. 程序状态计数器:只有在异常模式下才同时有CPSR和SPSR。SPSR的作用是在发生异常时将状态保存下来,例如CPSR的状态,异常处理完了之后,再将SPSR的内容写回到CPSR中。

程序状态寄存器是一个比较特殊的寄存器,每个数据位都代表特定的含义,在一般的汇编语言或者微机原理书中也会介绍这些内容。

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

这里只介绍其中比较常用的几个,对于N,Z,I,F四个位,只要记住下面几句话就可以了:

N:表示比较结果正负的,例如,假设N记录的是A-B的结果,如果A<B,则N为1,如果A>=B,则N为0.

Z:也是表示结果正负的,但是只有A=B时 才为1。

I位为1时,IRQ是禁用的。 F位为1,折FIQ是禁用的。

最低的0~4位,组合表示工作模式,具体设置为:

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

因此,综上所示,寄存器的基础知识可以总结为下面的表:

ARM是个什么鬼1.ARM简介2.ARM的工作模式3.ARM的寄存器4.ARM的寻址方式

4.ARM的寻址方式

所谓寻址方式就是处理器根据指定中给出的细腻来找到指令所需要操作数的方式。 寻址方式的种类很多,不同计算机的书中的描述的都不太一致,不同的处理器也不太一样,但是不管怎么分,以下几种是都通用的:

1.立即数寻址

立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即数寻址。例如以下指令:

ADD R0,R0,#0x3f ;表示R0←R0+0x3f

在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀。

2.寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是一种执行效率较高的寻址方式。

ADD R0,R1,R2 ;R0←R1+R2

该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

3.寄存器间接寻址

寄存器间接寻址就是寄存器中的存放的是操作数在内存中的地址。例如以下指令:

 LDR R0, [R2] ;R0← [R2]

在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。第二条指令将以R1的值为地址的存储器中的数据传送到R0中。 

4.基址变址寻址

基址变址寻址就是将寄存器里的内容(基地址)与指令中给出的地址偏移量相加,从而得到操作数在内存中的地址。其实这种方式只是寄存器简介寻址的扩展而已,如果这里的立即数是0,不就一样了吗。

LDR R0 [R1,#4]; R0<-[R1+4]

5.相对寻址

与基址变址寻址方式相类似,相对寻址PC指针的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

BL NEXT ;跳转到子程序NEXT处执行

……

NEXT

……

MOV PC,LR ;从子程序返回