GNU ARM汇编--(三)ARM处理器的基本原则

来源:互联网 发布:windows清理助手3 编辑:程序博客网 时间:2024/04/29 14:38

GNU ARM汇编--(三)ARM处理器的基本原则  


http://blog.csdn.net/dndxhej/article/details/7539413

 这一篇的知识来源全部来自《ARM System Developer's Guide》

        从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示:

        

        数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而h哈佛结构体系的arm核就会用两个不同的总线.

        就像所有的RISC处理器,arm采用load-store体系结构.也就是说它含有两条不同的指令类型来出入处理器.loar指令将数据从内存拷贝到寄存器,store指令是将数据从寄存器拷贝到内存.没有直接操作内存中数据的数据处理指令.数据的处理离不开寄存器.

        ARM指令一般有两个源寄存器,Rn和Rm,和一个目的寄存器,Rd.ARM的一个重要特性是Rm可以在送入ALU之前被桶型移位器做预处理,这样就会有很多形式的表达式和寻址方式.

        下面介绍ARM处理器的几个关键分量:寄存器,当前程序状态寄存器和流水线

        寄存器:

        通用目的寄存器可以保存数据或者地址.由字母r和编号数字来表示.所有的寄存器都是32bit大小.

        一共有18个活动的寄存器:16个数据寄存器和两个程序状态寄存器.数据寄存器由r0--r15表示.

        ARM处理器有3个寄存器分配为特殊的功能:r13,r14,r15

        r13通常用作栈指针(sp),存储当前处理器工作模式下的栈顶;

        r14被称作链接寄存器(lr),当发生调用时存放调用子程序的返回地址;

        r15被称作程序计数器(pc),保存被处理器预取的下一条指令的地址.

        除了这16个数据寄存器,还有来年各个程序状态寄存器:cpsr和spsr.处理器的当前工作模式决定了哪些寄存器是可见的.

        当前程序状态寄存器:

         ARM核使用cpsr来显示和控制内部的操作.通用程序状态寄存器的内部如下:



        cpsr分为四个域,每个域有8位的宽度:flags,status,extension和control.control域包含处理器模式和状态以及中断屏蔽位.flags域包含condition flags.

        处理器模式:

        处理器模式决定了当前哪些寄存器是可用的以及cpsr本身的访问权限.处理器模式分为特权模式和非特权模式:特权模式对cpsr有完全的读写控制.而非特权模式

        只能读cpsr的control域但是仍可以读写condition flags.

        一共有7中处理器模式:六种特权模式(abort,fiq,irq,svc,system和undefined)和一种非特权模式(user).

        当试图访问内存失败时处理器会进入abort模式,fiq和irq对应ARM处理器的两种中断级别.svc是系统reset后进入的模式,也是os kernel工作的模式.

        system模式是user模式的特殊版本,它有对cpsr的读写控制.undefined模式在处理器遇到未定以的指令或者不支持的操作时使用.

        user模式在应用程序下使用.

        Banked registers:



        除了user模式,其它模式都可以通过直接写cpsr的模式位来改变处理器模式.当然,在异常或者中断到来时,硬件会自动切换模式.下类异常和中断会引起模式切换:

        reset,irq,fiq,swi,data abort,prefetch abort和undefined instruction.

        处理器模式:



        需要注意的是:通过直接写cpsr来改变模式的方法不会将cpsr拷贝到spsr.只有在异常或中断发生时cpsr的值才会保存.

        当ARM核上电时,处于svc特权模式.从特权模式开始是有用的:初始化代码完全控制cpsr来建立其他模式的堆栈.

        cpsr中的bit T是表明指令簇用的是ARM指令集还是thumb指令集.T为1表示thumb指令集,T为0表示ARM指令集.

        ARM指令集和thumb指令集的特性:


   

        中断屏蔽位:

        中断屏蔽位用来屏蔽处理器的特殊中断请求.在ARM核中有两种级别的中断请求:irq和fiq.

        cpsr中的中断屏蔽位是第7位和第6位(I和F),当I或F设为1时irq或fiq就被屏蔽了.

        condtion flags:

        condition flags可以被比较操作和带S后缀的ALU操作来更新.



        条件执行:

        条件执行控制指令是否被ARM核执行.处理器会比较指令的条件属性和cpsr中的condition flags,如果匹配,该指令执行;否则该指令被忽略.



        流水线:

        RISC处理器用流水线机制来执行指令.ARM流水线中的指令只有在完全通过执行阶段才被处理.



        上面这张图标明了流水线的使用和程序计数器pc.在执行阶段,pc总是指向该指令地址加上8字节.也就是说pc总是指向当前指令的下下条指令.当用pc来计算

        相对偏移量时这点是很重要的,并且它也是所有流水线的特征.


        异常 中断和向量表

        当异常或中断发生时,处理器会将pc指向一个特殊的内存地址.该地址所在的地址范围称为向量表.向量表的入口是跳转指令,跳转到专门处理某个异常或中断的

        子程序.

        存储器映射地址0x00000000是为向量表预留的.在某些处理器中向量表可以放在更高的地址,从0xffff0000开始.linux等操作系统可以利用这个特性.

        当异常或者中断发生时,处理器挂起正常的处理然后从向量表中加载指令.每个向量表的入口都包含指向特殊处理例程的跳转指令.



        reset向量是处理器上电后执行的第一条指令,这条指令跳转到初始化代码处.

        undefined instruction向量是当处理器不能对指令译码时使用的.

        software interrupt向量执行SWI指令时使用的.SWI可以用来系统调用的实现.

        prefetch abort向量发生在当没有访问权限的条件下试图获取该地址的指令时,异常发生在译码阶段.

        data abort向量与prefetch abort类似,只不过是访问数据发生的异常.

        interrupt request向量被外部硬件用来中断处理器的正常执行.只有在cpsr的相应位为0时才能发生.

        fast interrupt request向量与irq类似,是为要求更短的中断响应时间的硬件保留的.只有在cpsr的相应位为0时才能发生.


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 辅警体能过不了怎么办 蛙跳完后大腿疼怎么办 体能太差在部队怎么办 家里的钥匙丢了怎么办 lol美服更新慢怎么办 魔域密码忘了怎么办 魔域账号忘记了怎么办 魔域91密码忘了怎么办 魔域人数满了怎么办 部队玩手机被逮怎么办 脑子很笨怎么办17岁 跑步心肺功能差怎么办 剧烈运动后恶心想吐怎么办 运动后头晕想吐怎么办 跑步后反胃想吐怎么办 长跑后恶心想吐怎么办 离职前请假不批怎么办 酷派x7无限重启怎么办 钢铁雄心3资源多怎么办 汽车智能钥匙没电了怎么办 辐射3食物有辐射怎么办 辐射3玩起来很卡怎么办 辐射3多余的瓶盖怎么办 辐射4开锁太快怎么办 极度恐慌3没子弹怎么办 辐射3道德值低怎么办 辐射3任务做完了怎么办 极限竞速6闪退怎么办 两个睾丸都碎了怎么办 快递退回去了钱怎么办 想登录老公微信怎么办 养狗家里味道大怎么办 实在不想养狗了怎么办 培训完不想干了怎么办 干了几天想离职怎么办 药流开始流血了怎么办 药流期间同房了怎么办 想学韩语可是没基础怎么办 鞋子多买了一双怎么办 胳膊抻着了怎么办妙招 胳膊抻筋了 很疼怎么办