3.1 ARM编程简介

在嵌入式系统开发中,目前使用的主要编程语言是C和汇编。很多地方,例如开机时硬件系统的初始化,包括CPU状态的设定、中断的使能、主频的设定、以及RAM的控制参数及初始化等都使用汇编语言。汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,汇编语言编程不可或缺的重要方法。

ARM嵌入式系统程序设计和所使用的ARM微处理器资源密切相关。只有了解ARM微处理器的工作模式、状态、存储器组织、寻址方式,并且掌握ARM的指令系统,才有可能写出适用的ARM程序。

3.2 Cortex-A8处理器模式和状态

一、处理器模式

二、处理器状态

Cortex-A8处理器有3种操作状态,这些状态由CPSR寄存器的T位和J位控制。
 ARM状态:执行32位字对齐的ARM指令,T位和J位为0。
 Thumb状态:执行16位或32位半字对齐的Thumb2指令,T位为1,J位为0。
 ThumbEE状态:执行为动态产生目标而设计的16位或32位半字对齐的Thumb2指令集的变体。T位和J位为1。

处理器的操作状态可以在以下几种状态间转换:
 ARM状态和Thumb状态之间转换
   使用BL和BLX指令,并加载到PC。
 Thumb状态和ThumbEE状态之间转换
   使用ENTERX指令和LEAVEX指令。
   异常会导致处理器进入ARM状态或Thumb状态。一般情况,当退出异常处理时,处理器会恢复原来的T位和J位的值。

3.3 Cortex-A8存储器组织

一、数据类型

Cortex-A8支持以下数据类型:
1)双字,64位;2)字,32位;3)半字,16位;4)字节,8位。
    当这些数据类型为无符号数据时,为普通二进制格式,N位数据值代表一个非负整数(范围为0~2N-1);当这些数据类型为有符号数据时,为二进制补码格式,N位数据值代表一个整数(范围为-2N-1~2N-1-1)。
    为了达到最好的性能,数据必须按照以下方式对齐:
 以字为单位时,按4字节对齐;
 以半字为单位时,按2字节对齐;
 以字节为单位时,按1字节对齐。
    Cortex-A8处理器支持混合大小端格式和非对齐数据访问。

二、存储格式

Cortex-A8处理器支持小端格式和字节不变的大端格式。此外,处理器还支持混合大小端格式(既有大端格式又有小端格式)和非对齐数据访问。对指令的读取,则总是以小端格式操作。
    例如:对于0x12345678数据,大端模式和小端模式的存放如图所示。

三、寄存器组

Cortex-A8处理器总共有40个32位长的寄存器。
  33个通用寄存器。
  7个状态寄存器:
    ——1个CPSR(Current Programs Status Register,当前程序状态寄存器);
    ——6个SPSR(Saved Program Status Register,备份程序状态寄存器)。
    这些寄存器不能同时访问,处理器状态和操作模式决定了哪些寄存器对编程者是可用的。

未分组的通用寄存器R0—R7
    16个数据寄存器中R0--R7是未分组的通用寄存器,用来保存数据和地址。
    分组通用寄存器R8—R15,处理器模式决定物理寄存器
    ——R8—R12寄存器:快速中断及其他模式两组;
    ——R13,R14寄存器:分7组,用户和管理模式共用;
            R13:又称SP,堆栈指针
            R14:又称LR,链接寄存器
    ——R15:又称PC,程序计数器,所有模式共用;
   当前状态寄存器CPSR:所有模式共用;
   分组的状态保存寄存器SPSR:6个异常模式对应。

处理器有两类程序状态寄存器:1个当前程序状态寄存器CPSR和6个状态保存寄存器SPSR,主要功能如下:
保存最近执行的算术或逻辑运算的信息;
控制中断的允许或禁止;
设置处理器操作模式。

3.4 异常

异常是处理外部异步事件的一种方法,在有些处理器架构中称为中断。
    当某个异常发生时,例如一个来自外围设备的中断,处理器将暂停正常运行的程序。在处理这个异常之前,处理器需要保留当前处理器状态以便在异常处理程序结束之后恢复原来程序运行。
    若有两个或更多的异常同时发生,处理器将根据中断优先级来处理这些异常。

三、复位异常(RESET)

复位也是一种异常。当复位信号产生时,复位发生处理器放弃正在执行的指令。当复位信号失效之后,处理器会采取如下动作:
将CPSR置为10011,安全Supervisor模式。
将CPSR的A、I、F位置为1。
将CPSR的J位置0,根据CFGTE输入的状态来决定CPSR的T位;CPSR的其他位不确定。
强制PC从复位向量地址中获取下一条指令。
根据CFGTE输入的状态,在ARM或者Thumb状态下执行恢复操作。
复位之后,除了PC和CPSR以外的所有的寄存器的值都是不确定的。

四、快速中断异常(FIQ)

FIQ异常支持快速中断。FIQ模式有8个专用寄存器。可以通过设置CPSR的F标志位,在特权模式中禁止FIQ。

五、中断异常(IRQ)

IRQ比FIQ优先级低。当处理器进入FIQ处理时,IRQ会被屏蔽。可以通过设置CPSR的I位在特权模式下禁止IRQ异常。

六、中止异常(ABT)

试图访问无效的指令或数据内存单元通常都会引起中止。
——预取指中止:预读取中止发生时,处理器将标志这条预读取指令无效,但是直到执行这条指令才产生异常。
——数据中止:试图访问无效的数据内存单元引起。

七、软件中断异常

SVC指令进入管理模式,通常是为了请求一个特殊的管理员功能。SVC处理程序通过读取操作码来提取SVC功能号。

八、监控异常

当处理器执行SMC指令,内核进入监控模式请求监控功能。用户进程执行SMC会导致一个未定义的指令异常发生。

九、未定义指令异常

当遇到一条处理器或系统协处理器无法处理的指令时,则产生未定义指令异常。软件可以利用这种机制,通过模拟未定义的协处理器指令来扩展ARM指令集。

十、断点指令

执行断点指令BKPT,产生一个预取中止异常。在指令到达流水线执行阶段前,不会引起处理器产生预取中止异常。

异常向量与优先级

异常出现后处理器强制从异常类型所对应的固定存储器地址开始执行程序,这些地址称为异常向量(exception vectors)。在没有进行虚拟内存映射时,异常向量表放置于物理内存地址最低处

异常的进入

当处理一个异常时,ARM9内核完成以下动作:
(1)将下一条指令的地址保存在相应的LR寄存器中。
(2)将CPSR复制到相应的SPSR中。
(3)迫使CPSR模式位M[4:0]的值设置成对应的异常模式值
(4)迫使PC从相关的异常向量取下一条指令。
(5)用户可以设置中断禁止位来阻止或打开异常嵌套。如果在异常发生时处理器是在Thumb状态下,自动切换进入ARM状态。

异常的退出

在完成异常处理后,ARM9完成以下动作:
(1)将LR寄存器的值减去相应的偏移量(偏移量根据异常的不同而不同),送到PC中。
(2)将SPSR复制回CPSR中。
(3)清除中断禁止位标志。

3.5  寻址方式

寻址方式是根据指令中给出的地址码字段来寻找真实操作数地址的方式。ARM处理器支持的基本寻址方式有以下几种:

(1)寄存器寻址
        所需要的值在寄存器中,指令中地址码给出的是寄器编号,即寄存器的内容为操作数。例如指令:
    ADD  R0,R1,R2       ;R0=R1+R2

(2) 立即寻址
        立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的地址码部分不是操作数地址,而是操作数本身。例如指令:

SUBS  R0,R0,#1       ;R0R0 - 1

MOV  R0,#0xff00       ;R00xff00

(3) 寄存器移位寻址
    寄存器移位寻址方式是ARM指令集中所特有的,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。可以采取的移位操作如下:
  L S L 。逻辑左移,寄存器中字的低端空出的位补0。
  L S R 。逻辑右移,寄存器中字的高端空出的位补0。
  A S R 。算术右移。 算术移位的对象是带符号数。
  R O R 。循环右移,从低端移出的位填入高端空出的位。
  R R X 。带扩展的循环右移,操作数右移一位,空位用原C 标志值填充。

ADD R3,R2,R1,LSL #3        ;R3=R2+8×R1

(4) 寄存器间接寻址
        指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在该地址对应的存储单元中,即寄存器为地址指针。例如指令:

LDR R0,[R1]             ;R0=[R1]

SWP R1,R1, [R2]        ;R0与[R1]数值进行交换

(5) 变址寻址
        变址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数有效地址。变址寻址用于访问基址附近的单元,包括基址加偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻址。
        基址加偏移寻址中的基址寄存器包含的不是确切的地址。基址需加(或减)最大4KB的偏移来计算访问的地址。例如指令:

LDR R0,[R1,#4]        ;R0=[R1+4]

STR R1,[R0,#-2]        ;[R0-2]R1

LDR R0,[R3,R2]        ;R0[R3, R2]

(6) 多寄存器寻址

一次可以传送几个寄存器的值,允许一条指令传送16个寄存器的任何子集。例如指令:

LDMIA R1,{R0,R2,R5} ;R0=[R1],R2=[R1+4],R5=[R1+8];由于传送的数据项总是32位的字,基址R1应该字对准。

STMIA R0!,{R3-R6,R10}   ;[R0]=R3,[R0+4]=R4, ;[R0+8]=R5,[R0+12]=R6,[R0+16]=R10

(7)堆栈寻址
        堆栈是一种按特定顺序进行存取的存储区,这种特定顺序既是“先进后出”或“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域。栈指针所指定的存储单元就是堆栈的栈顶。堆栈可分为两种:
向上生长,又称递增堆栈,即地址向高地址方向生长。
向下生长,又称递减堆栈,即地址向低地址方向生长。
满堆栈,堆栈指针指向最后压入堆栈的有效数据项。 空堆栈,堆栈指针指向下一个数据项放入的空位置。

STMFD  SP!,{R1-R7,LR}   ;将R1-R7,LR入栈,满递减堆栈

LDMFD SP!,{R1-R7,LR}  ;数据出栈,放入R1-R7,LR寄存器

(8)块拷贝寻址
        块拷贝寻址指令是一种多寄存器传送指令,多寄存器传送指令用于把一块数据从存储器的某一位置拷贝到另一位置。块拷贝指令的寻址操作取决于数据是存储在基址寄存器所指的地址之上还是之下、地址是递增还是递减,并与数据的存取操作有关。

9)相对寻址
       相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址,指令中的地址码字段作为偏移量,两者相加后得到操作数的有效地址。偏移量指出的是操作数与当前指令之间的相对位置。子程序调用指令即是相对寻址指令。 
目标地址 = pc 当前值 + 指令给出的标号偏移地址

BL SUB1
           BEQ LOOP
            
            LOOP   MOV R6,#1
SUB1

Cortex-A8处理器编程(上)相关推荐

  1. 新年开工第一篇文章——推荐几个值得中小企业使用的ARM9/ARM11/Cortex A8处理器

    //toppic:推荐几个值得中小企业使用的ARM9/ARM11/Cortex A8处理器 // 作者:gooogleman //原文地址:http://blog.csdn.net/goooglema ...

  2. cortex A8处理器启动分析一引导代码BL0

    cortex A8是基于ARMv7架构的处理器,主频可以达到1GHz.基于cortexA8的处理器有三星的S5PC100.S5PV210,TI的OMAP3530,全志的A10等.我有个想法就是把u-b ...

  3. 【原创】gooogleman亲自参与设计的三星Cortex A8 S5pv210 之Sate210核心板硬件用户手册(作者:gooogleman)...

    作者:gooogleman                                 时间:2011.09 从2011年四月份开始筹划设计一款S5pv210方案至今,已经有五个多月,期间还做了一 ...

  4. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  5. RVDS4.0上开发cortex A8 NEON程序

    用RVDS4.0集成开发环境新建一个target为cortex A8 NEON的工程,即便是hellowolrd,也无法正常运行, 然而自己写makefile调用amrcc的方式就可以.在水木等地咨询 ...

  6. [嵌入式]Cortex-A8处理器编程(上)

    Cortex-A8处理器编程 3.1 ARM编程简介 ·在嵌入式系统开发中,目前使用的主要编程语言是C和汇编.很多地方,例如开机时硬件系统的初始化,包括CPU状态的设定.中断的使能.主频的设定.以及R ...

  7. cortex A8/A9/A5/A15 智能手机名称整理

    转自http://mobile.yesky.com/282/30401782.shtml 在过去的一年半.两年里,很多人开始丢掉他们以前只能装JAVA程序的多功能机,丢掉操作画面不够方便.界面不够炫丽 ...

  8. 【转】购买智能手机必须要知道的一些知识(cortex A8/A9/A5/A15 智能手机名称整理)...

    在过去的一年半.两年里,很多人开始丢掉他们以前智能装JAVA程序的多功能机,丢掉操作画面不够方便方面.不够炫丽的老智能机,开始换上能玩画面炫丽.性能强大的Android.IPhone.当然对于大部分非 ...

  9. a8处理器相当于骁龙几_曾受人追捧的A8处理器,放在现在是什么水平了?

    苹果在2014年发布的A8处理器在当时是一款热门产品,尽管有大量其他的soc产品,但在六年后仍然是一款热门产品.五年出生的处理器,使用20 nm台积电的工艺过程,近二十亿个晶体管,芯片集成了双核1.4 ...

最新文章

  1. 图像变换——等距变换,相似变换,仿射变换,投影变换
  2. 人群计数--Cross-scene Crowd Counting via Deep Convolutional Neural Networks
  3. 南外计算机课,南外小升初,怎么考?
  4. HTML行间距的设置方法
  5. rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)
  6. HTML与CSS基础之否定伪类(四)
  7. 嵌入式linux设计师,make在linux——《嵌入式linux设计与应用》
  8. Mysql导出数据 (windows Linux)
  9. mongoDB的配置以及运行
  10. 我的第一篇博客-缓存显示图片
  11. 人有多大懒,才有多大闲 (评论『卓有成效的程序员』)
  12. Linux上tomcat运行内存溢出,linux中tomcat内存溢出解决办法
  13. 发几个flashxp注册码
  14. 基于Java开发证券交易撮合系统的尝试
  15. 更安全的ftp服务器Pure-FTP搭建(4)
  16. 【AD22】设置原理图纸张大小
  17. 大数据,why python
  18. 高通8155/8295 boot分析
  19. GitHub开源项目学习 电商系统Mall (三) SpringBoot+MyBatis搭建基本骨架
  20. 摸着石头过河----fcitx3输入法的安装!

热门文章

  1. mysql子查询返回多于1行_mysql – 子查询返回超过1行
  2. 浙教版数学作业本,参考答案如此下载
  3. QT中文字体显示以及字体大小不能改变的问题
  4. YARN - Task, Node manager, AppMaster, Resource manager 失败时所做的处理
  5. 会声会影批量处理素材设置教程
  6. 股指的趋势持续研究(Hurst指数)
  7. Tomcat启动项目出现 javax.el.ELException
  8. 在PC上通过手机发送短消息
  9. JavaScript的深浅拷贝
  10. 向量组是否相关与行列式,方程组,秩的联系。