ARM体系结构与编程 - 第一章 ARM概述及其基本编程模型

 

ARM芯片具有RISC体系的一般特点,如:

  • 具有大量的寄存器.
  • 绝大多数操作都在寄存器中进行,通过Load/Store的体系结构在内存和寄存器之间传递数据.
  • 寻址方式简单
  • 采用固定长度的指令格式.

除此之外, ARM体系采用了一些技术:

在同一条数据处理指令中包含算术逻辑处理单元处理和移位处理.

使用地址自动增加(减少)来优化程序中循环处理.

Load/Store指令可以批量传输数据,从而提高数据传输的效率.

所有指令都可以根据前面指令执行结果,决定是否执行,以提高指令执行的效率.

 

1.2 ARM体系结构的版本及命令方法

  • ARM指令集:  分为6个版本
  • Thumb指令集: 是将ARM指令集的一个子集重新编程而形成的一个指令集. ARM指令长度为32位, Thumb指令长度位为16位.
  • M变种: 长乘法指令, 增加了两条用于进行长乘法操作的ARM指令
  • E变种: 增强型DSP指令.
  • T变种: Thumb指令集
  • J变种: Java加速器 Jazelle
  • SIMO变种: ARM媒体功能扩展

1.3 ARM处理器系列

  • ARM7
  • ARM9
  • ARM9E
  • ARM10E
  • SecurCore
  • Xscale
  • StrongARM

1.4 ARM处理器模式

  • 用户模式(User,usr) : 正常程序执行的模式
  • 快速中断模式(FIQ,fiq) : 用于高速数据传输和通道处理
  • 外部中断模式(IRQ,irq) : 用于通常的中断处理
  • 特权模式(Supervisor, sve) : 供操作系统使用的一种保护模式
  • 数据访问中止模式(Abort,abt) : 用于虚拟存储及存储保护
  • 未定义指令中止模式(Undefined,und) : 用于支持通过软件方针硬件的协处理器
  • 系统模式(System,sys) : 用于运行特权级的操作系统任务

处理器模式可以通过软件来切换,在ARM Linux操作系统中,只有运行在内核态的程序才有可能更改处理器模式,用户态的程序是不能访问受操作系统保护的系统资源的,更不能直接进行处理器模式的切换。当需要处理器模式切换的时候,用户态的程序可以中断,内核态的中断处理程序开始响应并做出处理。

以上7种模式对应了系统中的中断向量表,这在移植操作系统的时候很重要。系统中所有的调度都是围绕着中断向量表展开的,在不用操作系统的系统中也就是通常所谓的裸机系统程序中,对于中断向量表的处理也很关键。这个向量表一般加载在CPU复位执行的开始地址的一段空间。在ARM Linux操作系统中,Boot Loader程序的移植中需要考虑这些问题,而一旦Boot Loader移植成功,运行起来以后,开发人员就不需要再考虑这个问题了。

1.5 ARM寄存器介绍

ARM处理器共有37个寄存器 :

  • 31个通用寄存器, 包括程序计数器(PC)在内. 这些寄存器都是32位寄存器.
  • 6个状态寄存器, 这些寄存器都是32位寄存器, 但目前只使用了其中12位.
  • 任意处理器模式下, 可见的寄存器包括15个通用寄存器(R0~R14), 一个或两个状态寄存器及程序计数器(PC).

各模式下寄存器表格:

1.5.1 通用寄存器

  • 未备份寄存器(The unbanked registers) , R0~R7
    当处理器模式切换时, 未备份寄存器指的是同一个物理寄存器, 所有可能造成寄存器中数据被破坏.
     
  • 备份寄存器(The banked registers) , R8~R14

    对于R8~R12, 每个寄存器对应2个不同的物理寄存器. 如: 快速模式下, R8对应R8_fiq; 用户模式下, R8对应R8_usr. 这两种情况下, 使用的是不同的物理寄存器.

    对于R13,R14, 每个寄存器对应6个不同的物理寄存器. 其中用户模式和系统模式下是共用一个物理寄存器. 其它5种处理器模式分别使用: R13_<mode>, R14_<mode>来表式.

    R13在ARM中常用作栈指针. 每一种异常模式拥有自己的物理R13. 应用程序去初始化该R13, 使其指向该异常模式专用的栈地址.

    R14又称连接寄存器(Link Register, LR), 在ARM中有以下2个作用
    1) 每种模式有自己的物理R14,  存放当前子程序的返回地址.  当通过BL或BLX指令调用子程序时, R14被设置成该子程序的返回地址.  子程序中, 当把R14的值复制到程序计数器PC中时, 子程序返回.

    例: 

    MOV PC , LR    #把R14的值复制到程序计数器PC中

    BX LR             #

    STMFD SP! , { <registers>,LR }   #在子程序入口将PC保存到栈中
    LDMFD SP!, { <registers>,PC }    #子程序返回

    2) 异常中断发生时, 该异常模式特定的物理R14被设置成该异常模式将要返回的地址.
  • 程序计数器PC, R15

    ARM采用流水线机制, 当正确读取了PC的值时, 该值为当前指令地址加8个字节(也就是当前指令的下两条指令的地址), 由于ARM指令是字对齐的, PC值的第0位和第1位总为0 .

    当使用STR/STM保存R15时, 保存的可能是当前指令地址值加8字节, 也可能保存的是当前指令地址加12字节. 取决于芯片具体设计. 尽量避免使用STR/STM指令来保存R15的值.

to be continue..  P14

posted on 2009-06-19 18:25  kevin.lin 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/yashin/archive/2009/06/19/1506989.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值