第二章-嵌入式处理器
考纲与考点分析
嵌入式处理器
- 嵌入式处理器的结构、特点与分类(不同类型的典型嵌入式处理器及其特点,嵌入式处理器分类);
- ARM处理器内核的体系结构(工作状态,工作模式,寄存器组织,异常,数据类型与存储格式等);
- 典型ARM处理器内核(ARM9,Cortex-A,Cortex-R,Cortex-M等的技术特点与应用领域);
- ARM处理器指令系统及汇编语言程序设计(指令格式,寻址方式,指令集,伪指令,语句格式与程序结构,ARM汇编语言与C的混合编程等)。
考点分析
- 在考试中一般情况下会出现在选择题和操作题(知识类型为记忆型和理解型相结合,记忆型偏多)
- 常考知识点有:
- 嵌入式处理器的结构类型。
- 典型ARM处理器。
- ARM处理器的体系结构
- ARM处理器指令集
- ARM汇编语言程序设计
考点1 嵌入式处理器的结构类型
1、分类方式
嵌入式处理器的结构类型的4种分类方式
- 按指令集划分
CISC(复杂指令集结构)和RISC(简单指令集结构) - 按存储机制划分
冯洛伊曼结构和哈佛结构 - 按指字长划分
8位,16位,32位,64位 - 按不同内核划分
51,AVR,PIC,MSP430,PowerPC,MC68K,ColdFire和ARM
2、CISC处理器和RISC处理器
指令集的概念
- 也称为指令系统,它与程序设计密切相关。内容包括:基本数据类型、寄存器、寻址模式、指令、中断、 异常处理以及外部I/O等,它是设计处理器的主要依据,常常被称为指令集体系结构或ISA架构
RISC处理器的特点及应用
- 指令数目较少,指令字长统一,格式规整,寻址模式较为单纯,指令操作简单,执行时间短(流水线方式),大多能在1个周期内完成。
- 指令系统小,一个时钟周期内可以执行一条或者多条指令,采用标准长度指令,指令格式规范,寻址模式较为简单,存储器访问只是用加载和存储两个指令,采用硬布线逻辑控制为主。
- 目前常见的RISC处理器包括:ARC、ARM、AVR、MIPS、PA-RISC、Power-PC和SPARC等
CISC处理器的特点
- 指令集中指令数目很多且结构比较复杂,它包含许多很少使用的专用指令,不同指令的长度并不相等,执行时间也长短不一。CISC处理器结构复杂,功耗较大。
- 目前常见的CISC处理器包括VAX、PDP-11、intel X86等。
3、冯洛伊曼存储结构和哈佛结构
冯洛伊曼存储结构和哈佛结构图示
冯洛伊曼存储结构和哈佛结构的不同之处
- CPU连接程序存储器与数据存储器的方式不同
- 与冯洛伊曼结构相比,哈佛结构的特点如下:
- 使用两个独立的存储器分别存储指令和数据,不允许指令和数据并存
- 使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联
考点2 嵌入式处理器简介
不同典型嵌入式处理器简介
考点3 ARM处理器概述
1、ARM处理器的主要特点
ARM处理器的主要特点
- 主流ARM为32位处理器。
- 与其他处理器相比,主要特点有耗电省、功能强、成本低、32位和16位指令集并存,它具有众多的合作伙伴,使用面非常广泛,是其他处理器所不及的。
ARM具有的技术特征
- 单周期操作;一个周期完成一条指令
- 只使用**加载/存储(Load/Store)**指令访问内存;
- 指令长度固定;RISC处理器指令集特点
- 三地址指令格式;
- 指令流水线技术;
- 低功耗设计。
2、ARM处理器架构的发展
ARM不同版本ISA架构的比较
3、ARM处理器指令集的比较
指令集 | 特点 |
---|---|
ARM指令集 | 全部是32位的指令,其基本指令主要用于进行8位、16位和32位整数的运算,通过扩展的协处理器(最多16个),可以扩充浮点运算指令、DSP指令、SIMD指令等,使处理器的功能大大扩展。 |
Thumb指令集 | 从ARMv4T架构开始,几乎所有ARM处理器都支持Thumb指令集。Thumb全部是16位的指令,可以看作是Thumb指令的压缩形式。 |
Thumb-2指令集 | Thumb-2指令集既有16位指令又有32位指令,是一个混合的指令集。它是16位Thumb指令集的超集,功能强大、完备,效率高。 |
考点4 典型ARM处理器
- ※理解和区分处理器核(Processor Core)和处理器(Processro)的差异
1、ARM处理器的分类
- ARM处理器分为五类:经典ARM处理器、 ARM Cortex嵌入式处理器、 ARM Cortex实时嵌入式处理器、 ARM Cortex应用处理器以及ARM专家处理器。
- ARM Cortex处理器包括:
- Cortex-A(Application)系列是面向高端应用的处理器,它的工作频率高、性能好、功耗合理。这类被称为ARM Cortex应用处理器,简称应用处理器。A5~A15为32位,A53~A57为64位
- Cortex-R(Real Time)系列是面向实时控制应用的处理器,响应速度快、性能合理、功耗低。这类被称为ARM Cortex实时嵌人式处理器,简称实时嵌入式处理器。
- Cortex-M(Microcontroller)系列是面向微控制器的处理器,性价比极高、成本很低、功耗极小。这类被称为ARM Cortex嵌入式处理器,简称嵌入式处理器。
2、经典ARM处理器介绍
- 经典ARM处理器目前主要有ARM7、ARM9和ARM11三个系列。
- 低端的ARM7系列的ARM7TDMI(ARM7TDMS-S)是市场上销量最高的32位处理器内核,它采用ARMv4T架构,支持ARM/Thumb指令集,使用冯氏存储结构,由3级指令流水线实现,曾用于诺基亚6110手机。
- ARM9系列处理器,它为微控制器、DSP和Java应用提供了单处理器解决方案, 非常适合需要有数字信号处理功能的微控制器应用领域,经典产品为ARM920T。
- ARM920T处理器使用的核是ARM9TDMI,它基于ARMv4T架构设计,支持ARM/Thumb指令集,具有快速乘法器;采用程序与数据分离的哈佛存储结构,指令Cache和数据Cache各16KB,还可通过总线外接Cache和SRAM存储器;支持协处理器;含有内嵌的在线仿真模块ICE、支持片上调试;采用5级流水线以提高处理器性能,每一条指令的执行分为5个步骤: ①取指令,②指令译码,③执行指令运算,④ 存储器访问,⑤结果写回寄存器。
考点5 ARM Cortex处理器
1、Cortex-M嵌入式处理器
- Cortex-M系列目前包括Cortex-M0、M0+、M1、M3、M4共5款处理器。Cortex-M处理器都是32位RISC处理器,采用流水线技术,只支持Thumb-2指令集的子集。
- CM0和CM0+成本低 、简单易用,适合成本控制要求高的中低端应用;
- CM3性能高,通用性好,适合工业控制及中高端应用;
- CM4具有有效的数字信号控制功能,适合数字信号处理要求高的应用。
Cortex-M0(CM0)
- ARM Cortex-M0处理器是市场上现有的体积最小、能耗最低的ARM处理器。CM0的处理器核基于ARMv6M架构(是ARMv7M架构的子集),它仅有56条Thumb-2指令,用户很容易掌握,开发比较简单。
- 说明:以该处理器为内核的MCU和SoC可广泛应用于医疗器械、电子测量、照明、智能控制、游戏装置、紧凑型电源、电源和电机控制、精密模拟系统和无线通信等领域中。
Cortex-M3(CM3)
- Cortex-M3是一款低功耗处理器内核,具有门数目少、中断延迟短、调试成本低的特点,是为要求有快速中断响应能力的深度嵌入式应用而设计的。
- CM3处理器系列的低功耗、低成本和易于使用的优点相结合,旨在满足专门面向电动机控制、汽车、电源管 理、嵌入式音频和工业自动化市场的灵活解决方案。 支持Thumb-2指令集的子集,有硬件除法指令。
2、Cortex-R实时嵌入式处理器
- Cortex-R实时嵌入式处理器属于中档处理器,它提供的性能比Cortex-M系列高得多,而Cortex-A系列则性能更高,专用于需要运行复杂操作系统(需使用虚拟内存管理)的面向用户的应用。
- Cortex-R处理器系列目前有Cortex-R4、Cortex-R5和Cortex-R7等品种,它们适用于计算复杂、实时性要求苛刻(如汽车电子、硬盘驱动器控制、手机等)的领域。
- Cortex-R处理器主要特点是:高性能、实时处理、安全和低成本。
- Cortex-R4的结构组成:
- 其核心是采用ARMv7R架构的处理器核,它支持ARM/Thumb-2指令集,代码密度高;
- 使用硬件实现SIMD(单指令多数据)的DSP指令;
- 具有可选的浮点运算器(处理器型号为Cortex-R4F);
- 使用8级流水线技术实现。
3、Cortex-A应用处理器
- Cortex-A应用处理器,该处理器系列适用于有高计算要求、需运行功能丰富的操作系统以及要求提供交互媒体和图形显示的应用领域 。例如最新的移动互联网终端(智能手机、上网本或智能本等)、汽车电子娱乐系统和下一代数字电视机等。美国Apple公司的iPhone、iPad、iPod和韩国三星电子的Samsung Galaxy手机等产品所使用的SoC芯片中,大多都采用Cortex-A处理器作为其CPU内核。
- Cortex-A处理器除了A50系列为64位字长,采用ARMv8A架构外,其他均为32位字长,包括Cortex-A17、A15、A12、A9、A8、A7、A5处理器,它们使用基于ARMv7A架构的处理器核,支持传统的ARM、Thumb指令集和高性能紧凑型Thumb-2EE指令集,具有完全的应用兼容性。
- Cortex-A处理器提供Java字节码加速执行的Jazelle技术;提供可信计算的Trust Zone安全扩展;采用最多可达13级的深度流水线技术,处理器时钟频率可达2GHz左右。
- Cortex-A处理器可以运行的操作系统和软件平台有:Android、Adobe Flash、Java SE、Java FX、Linux、Microsoft Windows Embedded、Symbian和Ubuntu等
考点6 ARM处理器的工作状态及工作模式
1、ARM处理器的工作状态及其切换
ARM处理器的三种工作状态
- ARM状态:ARM状态是ARM处理器工作于32位指令的状态,即32位状态,所有指令均为32位宽度
- Thumb状态:Thumb状态是ARM执行16位指令的状态,即16位状态。在Thumb模式下,指令代码只有16位,使代码密度变大,占用空间减小,提供比32位程序代码更佳的性能
- 调试状态:处理机停机调试时进入调试状态
- ①除Cortex-M系列处理器外,所有ARM处理器复位后开始执行代码时总是只处于ARM状态。
- ②Cortex-M处理器因为只有Thumb-2指令集,所以只有Thumb状态和调试状态两种。
ARM与Thumb间的切换
- 由ARM状态切换到Thumb状态
通过BX指令,将操作数寄存器的最低位设置为1,即可将ARM状态切换到Thumb状态。如果R0[0]=1则执行BX R0指令,将进入Thumb状态。如果Thumb状态进入异常处理(异常处理要在 ARM状态下进行),则当异常返回时,将自动切换到Thumb状态。 - 由Thumb状态切换到ARM状态
通过BX指令,将操作数寄存器的最低位设置为0,即可将Thumb状态切换到ARM状态。如果R0[0]=0则执行BX R0指令,将进入ARM状态。当处理器进行异常处理时,则从异常向量地址开始执行,将自动进入ARM状态。
2、ARM处理器的工作模式
- ARM处理器工作模式间可以相互转换,但是有条件。
- 当处理器工作于用户模式时,除非发生异常,否则将不能改变工作模式,当发生异常时,处理器自动改变CPSR[M4:M0]的值,进入相应的工作模式
- 当处理器工作于系统模式时,用指令向CPSR[M4:M0]写入特定的值,以进入相应的工作模式
考点7 ARM状态下的寄存器组织
1、ARM状态下的寄存器组织
ARM状态下的寄存器组织
- ARM处理器共有37个寄存器,包括31个通用寄存器(含PC)和6个状态寄存器
- 工作于ARM状态下,在物理分配上寄存器被安排成部分重叠的组,每种处理器模式使用不同的寄存器
ARM处理器工作在不同模式时使用的寄存器的异同点
- 无论何种模式,R15均作为PC使用
- CPSR为当前程序状态寄存器
- R7~R0为公用的通用寄存器
- 不同之处在于:高端7个通用寄存器和状态寄存器在不同模式下不同
不同模式下的寄存器
2、Thumb状态下的寄存器组织
考点8 ARM处理器的异常
- 在程序正常执行的过程中,每执行一条ARM指令PC值加4,每执行一条Thumb指令PC值加2,通常指令按顺序正常执行。
- 异常(和中断)是由于内部事件或外部事件引起的请求,使处理器去做相应处理的事件。当发生异常时,系统执行完当前指令后,跳转到相应的异常处理程序入口执行异常处理, 异常处理完毕后程序返回。
1、ARM异常种类、异常向量表及优先级
- 异常向量的地址由32位地址空间的低端正常地址范围0x00000000~0x0000001F决定。ARM处理器片内其他硬件组件的中断使用IRQ或FIQ
- 由上表可以看出,7种类型的异常分为6级,级别最高的是复位,最低的是未定义的指令UND或软件中断SWI。其中UND和SWI异常(包括协处理器不存在异常)是互斥的,不可能同时发生,因此优先级是最高的,并不矛盾
- 复位异常的优先级最高,因此在任何情况下只要进入复位状态,系统便无条件地将PC指向0x00000000处,去执行系统的第一条指令。通常此处放一条无条件的转移指令,转移到系统初始化程序处
2、ARM异常的中断响应过程
3、从异常处理程序中返回
考点9 ARM的存储器格式及数据类型
1、ARM的两种存储字的格式
- ARM体系结构可以用两种方法存储数据字,称之为大端模式和小端模式。
大端模式
小端模式
2、ARM存储器的数据类型
- ARM体系结构将存储器看作是从0x00000000地址开始的以字节为单位的线性阵列。每个数据字32位,占4个字节的地址空间。作为32位的处理器,ARM体系结构所支持的最大寻址空间为4GB(232B),但具体的ARM芯片不一定提供最大的地址空间
- 除Cortex-A5外,32位ARM处理器中支持字节(8位)、半字(16位)、字(32位)3种数据类型,其中字需要4字节对齐(地址的低两位为0),半字需要2字节对齐(地址的最低位为0)。其中每一种又支持有符号数和无符号数,因此认为共有6种数据类型
- ARM还支持其他类型的数据,如浮点数等数据类型
考点10 ARM处理器中的MMU和MPU
1、ARM处理器中的MMU(存储器管理单元)
MMU的功能
-
虚拟地址到物理地址的映射
- ARM中MMU功能可以被“禁止”或“使能”。当“使能”MMU后,ARM处理器产生的地址是虚拟地址
- MMU的功能就是进行虚拟地址到物理地址的转换,这需要通过查找页表来完成。页表是一张虚拟地址与物理地址的对应表,页表存储在内存储器中
-
存储器访问权限控制
- 存储器的访问权限可以以块\页为单位进行设置,分为不可访问、只读、可读写等不同的权限
- 当访问具有不可访问权限的页时,会产生一个存储器异常的信号通知ARM处理器
存储器访问的顺序
- 当执行加载/存储指令要访问存储器时,MMU先查找TLB中的转换表
- 如果TLB中没有,则硬件会自动査找主存储器内的页表,找到虚拟地址到物理地址的转换信息和访问权限信息就可以用来进行存储器的读写操作
- 同时把这些信息放入TLB中供此后继续使用
- 如果在页表中也找不到转换信息,则产生中断,通知OS进行处理
2、ARM处理器中的MPU(存储器保护单元)
- MPU是对存储器进行保护的可选组件。它提供了简单替代MMU的方法来管理存储器,没有MMU,就不需要进行复杂的地址转换操作
- MPU允许ARM处理器的4GB地址空间定义8对域,分别控制8个指令和8个数据内存区域
- 每个域的首地址和界(或长度)均可编程
- MPU中一个区域就是一些属值及其对应的一片内存。这些属性包括起始地址、长度、读写权限以及缓存等。
- 带MPU的ARM处理器使用不同的域来管理和控制指令内存和数据内存
- 域和域可以重叠并且可以设置不同的优先级
考点11 ARM指令分类及指令格式
1、ARM指令分类
- ARM微处理器的指令集可以分为分支指令、数据处理指令、程序状态寄存器指令、加载/存储指令、协处理器指令和异常产生指令六大类
2、ARM指令格式
指令一般格式
<opcode>{<cond>}{S} <Rd>,<Rn>{,<op2>}
- 其中<>不可省,{}可省略,opcode、cond与S之间没有分隔符,{S}与Rd之间用空格隔开
- <opcode>:指令的操作码;助记符
- <cond>:条件域,满足条件才执行;可省略
- {S}:指令执行时是否更新CPSR;可省略
- Rd:目的寄存器;任意通用寄存器
- Rn:第一个操作数;任意通用寄存器,可与Rd相同
- op2:第二个操作数;可为imm8m、寄存器Rm及任意移位寄存器
- 关于#imm8m的说明
- 对于ARM指令集,#imm8m表示一个由8位立即数经循环右移任意偶数次形成的32位操作数
- 对于Thumb指令集,#imm8m表示一个由8位立即数经左移任意次形成的32位操作数
指令的条件域
- 每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]
- 条件码一共有24种,每种条件码可用两个字符表示,这两个字符可以添加在助记符后面与指令同时使用。如"REQ"可代表"相等则跳转"
3、ARM指令中操作数符号
- “#”:立即数符号;其后是十进制数或者十六进制数
- “0x”:十六进制符号;其后数据每位可以是0~9、A~F
- “!”:更新基址寄存器符号;表示指令在完成操作后最后的地址应该写入基址寄存器中
- “^”:复制SPSR到CPSR符号;用于表示批量数据存储指令中放在寄存器之后作为后缀
- 当其前面的寄存器不包含PC时,该符号表示所用的寄存器是用户模式的寄存器
- 当其前面的寄存器包含PC时,该符号表示将SPSR寄存器的值复制到CPSR寄存器中
- “-”:表示寄存器列表范围符号;表示多个连续寄存器
4、ARM指令中的移位操作
移位操作格式
Rm,<opsh>#<shift>
- Rm:要移位的通用寄存器
- <opsh>:移位操作符;LSL(逻辑左移)、LSR(逻辑右移)、ASL(算数左移)、ASR(算术右移)、ROR(循环右移)、RRX(带扩展的循环右移)
- <shift>:移位次数(0~32)
移位操作及示例
考点12 ARM指令的寻址方式
1、立即寻址
MOV R0,#0x11 ;R0 = 0x11
ADC R0,R0,#99 ;R0 ← R0+99+C
- 第二个源操作数即为立即数,要求以"#“为前缀,对于十六进制表示的立即数,还要求在”#“后加上"0x”,不加"0x"表示十进制数
2、寄存器寻址
ADD R0,R1,R2 ;R0 ← R1+R2
- 利用寄存器中的数值作为操作数
3、寄存器间接寻址
TDR R5,[R4] ;R5 ← [R4],间接寻址的寄存器是R4
STR R1,[R2] ;[R2] ← R1,间接寻址的寄存器是R2
- 以寄存器中的值作为操作数地址,而操作数本身放在存储器中。用于间接寻址的寄存器必须用"[]"括起来
4、基址加变址寻址
LDR R0,[R1,#3] ;R0 ← [R1+3]
STR R1,[R2,#6] ;[R2+6] ← R1
LDR R0,[R1,#3]! ;R0 ← [R1+3]、R1 ← R1+3
LDR R0,[R1],#3 ;R0 ← [R1]、R1 ← R1+3
LDR R0,[R1,R2] ;R0 ← [R1+R2]
STR R0,[R1,R2] ;[R1+R2] ← R0
- 将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。
5、相对寻址(跳转指令)
BL Subrouhtine_A; ;跳转到子程序Subrouhtine_A处执行
Subrouhtine_A
MOV PC,LR; ;从子程序返回
- 与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
6、堆栈寻址(程序调用)
- 满递增堆栈:堆找指针指向最后压入的数据,且由低地址向高地址生成
- 满递减堆栈:堆栈指针指向最后压人的数据,且由高地址向低地址生成
- 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成
- 空递减堆找:堆找指针指向下一个将要放人数据的空位置,且由高地址向低地址生成
7、块拷贝寻址
LDMIA R0,[R1,R2,R5,R9] ;R1 ← [R0]、R2 ← [R0+4]、R5 ← [R0+8]、R9 ← [R0+12]
- 块拷贝寻址又称多寄存器寻址,采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。
- 这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。
考点13 ARM指令集
1、数据处理类指令
数据处理类指令
- 可分为数据传送指令、算术逻辑运算指令、比较指令
ARM指令集示例
-
;数据传送指令 MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV R1,R0,LSL#2 ;将寄存器R0的值左移2位后传送到寄存器R1
-
;比较指令 CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位 CMP R1,#85 ;将寄存器R1的值与立即数85相减,并根据结果设置CPSR的标志位
-
;位测试指令 TST R1,#0x01 ;用于测试在寄存器R1中是否设置了最低位 TST R1,#0xFE ;将寄存器R1的值与立即数0xFE按位与,并根据结果设置CPSR的标志位
-
;相等测试指令 TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
-
;加法指令 ADD R0,R1,R2 ;R0 = R1+R2 ADD R0,R1,#256 ;R0 = R1+256 ADD R0,R2,R3,LSL#2 ;R0 = R2+(R3<<1) ADCS R5,R6,R7 ;R5 = R6+R7+C,且更新CPSR状态
2、程序状态寄存器访问指令
MRS - 程序状态寄存器到通用寄存器的数据传输指令
- 格式:
MRS{cond} Rd,<PSR>
- PSR可以是CPSR或SPSR
- 用途:MSR指令主要用于将程序状态寄存器的内容传送到通用寄存器中
- 使用情况:
- 当需要改变程序状态寄存器的内容时,可用MSR将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器
- 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存
MSR - 通用寄存器到程序状态寄存器的数据传输指令
- 格式:
MSR{cond} <PSR>_<fields>,Rm
- PSR可以是CPSR或SPSR,fields为域
- 用途:MRS指令主要用于将操作数的内容传送到程序状态寄存器的特定域中。其中操作数可以为通用寄存器或立即数
- 域用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可以分为4个域:
- PSR[31:24]:条件标志位域,用f表示
- PSR[23:16]:状态位域,用s表示
- PSR[15:8]:扩展位域,用x表示
- PSR[7:0]:制位域,用c表示
3、分支指令
B - 转移指令
- 格式:
B{cond} Label
- Label为目标地址
- 用途:B指令是最简单的跳转指令。一旦遇上一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行
BX - 带状态切换的转移指令
- 格式:
BX{cond}
- 用途:BX指令跳转到指令中所指令的由寄存器Rn与0xFFFFFFFE相与后的结果指示的目标地址(即Rn[0]并不作为目标地址,而是作为状态切换位),目标地址处的指令既可以是ARM指令,也可以是Thumb指令
BL - 带返回的转移指令
- 格式:
BL{cond} Label
- 用途:BL是带返回的跳转指令,在跳转之前,会在寄存器R14中保存PC的当前值
BLX - 带返回且带状态切换的转移指令
- 格式:
BLX目标地址
- 用途:BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态钱换到Thumb状态,该指令PC将的当前内容保存到寄存器R14中
4、加载/存储指令
单一数据加载/存储指令
- LDR - 字数据加载指令
- 指令用于从存储器中将一个32位的字数据传送到目的寄存器中
- LDRB - 字节数据加载指令
- 指令用于从存储器中将一个8位的字数据传送到目的寄存器中,同时将寄存器的高24位清零
- LDRH - 半字数据加载指令
- 指令用于从存储器中将一个16位的字数据传送到目的寄存器中,同时将寄存器的高16位清零
- STR - 字数据存储指令
- 指令用于从源寄存器中将一个32位的字数据传送到存储器中。
- STRB - 字数据存储指令
- 指令用于从源寄存器中将一个8位的字数据传送到存储器中。
- STRH - 字数据存储指令
- 指令用于从源寄存器中将一个16位的字数据传送到存储器中。
批量数据加载/存储指令
- LDM - 批量数据加载指令
- 格式:
LDM{cond} mode Rn{!}, reglist{^}
- 用途:指令用于将由基址寄存器所指示的一片连续存储器读到寄存器列表所指示的多个寄存器中,该指令的常见用途是将多个寄存器的内容出栈。
- 格式:
- STM - 批量数据存储指令
- 格式:
STM{cond} mode Rn{!}, reglist{^}
- 用途:指令用于将寄存器列表所指示的多个寄存器的数据存储到由基址寄存器所指示的一片连续存储器中,该指令的常见用途是将多个寄存器的内容入栈。
- 格式:
考点14 ARM处理器支持的伪指令
1、ADR伪指令
- 格式:
ADR{cond} Rd,expr
- 用途:用于相对偏移地址加载到通用寄存器中
2、LDR伪指令
- 格式:
LDR{cond} Rd,= [expr]
- 用途:用于一个32位常数的加载或地址的加载
- 目的:
- 当用MOV或MNV指令无法加载符合要求的32位立即数时,可用LDR伪指令加载任意32位操作数到寄存器
- 当需要程序的相对偏移地址或外部地址加载到寄存器时可使用LDR伪指令
3、NOP - 空操作
- 格式:
NOP
- 用途:产生所需的ARM无操作代码,用于简单延时,与
MOV Rd,Rd
等效
考点15 ARM汇编器所支持的伪指令
1、 符号定义伪指令
2、数据定义伪指令
-
Str DCB "This is a test!" ;分配一片连续的字节存储单元并初始化str=This is a test!" DataTes DCW 1,2,3 ;分配3个连续的半字存储单元并初始化位1,2,3
3、汇编控制伪指令
-
;例1 GBLL Test IF Test = TRUE 指令序列1 ELSE 指令序列2 ENDIF ;例2 GBLA Counter Counter SETA 3 …… WHILE Counter < 10 指令序列 WEND
4、其他伪指令
考点16 ARM汇编语言的s语句格式
1、汇编语言的语句格式
{标号}{指令或伪指令}{;注释}
- 说明:在汇编语言程序设计中,每一条指令的助记符可以全部用大写或者全部用小写,但不允许一条指令中大小写混用
符号必须遵循的约定:
- 符号区分大小写,同名的大小写符号会被编译器认为是两个不同的符号
- 符号在其作用范围内必须唯一
- 自定义的符号名不能与系统的保留字相同
- 符号名不应与指令或伪指令同名
2、在汇编语言程序中的表达式和运算符
运算次序遵循的优先级
- 优先级相同的双目运算符的运算顺序从左往右
- 相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符
- 括号运算符的优先级最高
数值表达式及运算符
- 算术运算符:+、-、*、/、MOD
- 移位运算符:ROL、ROR、SHL、SHR
- 数值逻辑运算符:AND、OR、NOT、EOR
逻辑表达式及运算符
- 关系操作符:=、>、<、>=、<=、/=、<>(注意相等是一个等于号)
- 逻辑运算符:LAND、LOR、LNOT、LEOR(加上前缀L与数值逻辑运算符区分)
字符串表达式及运算符
- 返回字符串长度运算符:LEN
- 字节整数转换为字符运算符:CHR
- 字符串转换运算符:STR
- 返回左端字符串运算符:LEFT
- 返回右端字符串运算符:RIGHT
- 合并字符串运算符:CC
考点17 汇编语言的程序设计举例
1、S3C2410系统引导程序代码
系统引导程序的功能
- 关看门狗定时器,关中断
- 设置CPU速率及时钟频率
- 设置堆栈
- 切换用户模式并初始化用户堆找
- 如果使用DRAM或其他设备,还要设置相关寄存器,初始化这些设备
- 初始化存储空间
- 跳转到C程序入口
启动文件Startup.s及其代码分析
引导程序主要是一个启动代码文件Startup.s
2、顺序程序设计
- 例如,在小端模式下,执行下面START程序后,R0、R1、R2和R3的值以及内存0x30100000~0x30100003中的值是多少?
AREA EXAMPLE1,CODE,READONLY ENTRY CODE32 START LDR R0, =0x12345678 ;R0 = 0x12345678 LDR R1, =0x30100000 ;R1 = 0x30100000 LDR R2, =0x87654321 ;R2 = 0x87654321 STR R2,[R1] ;[R1] = 0x87654321 LDR R3,[R1] ;R3 = 0x87654321 AND R3,R3,#0x000000FF ;R3 = 0x00000021 ADD R0,R0,R3,LSL#2 ;R3 = 0x00000084、R0 = 0x123456FC STR R0,[R1] ;[R1] = 0x123456FC END
3、分支程序设计
- ARM分支程序结构通常使用分支指令B加上条件执行来实现。
4、循环程序设计
- 循环初始部分:为开始循环准备必要的条件,如循环次数、循环体需要的初始值等
- 循环体部分:重复执行的程序代码,其中包括对循环条件修改的程序段
- 循环控制部分:判断循环条件是否成立,决定是否继续循环(循环控制部分是编程的关键和难点)
由计数控制循环
- 用一个通用寄存器Rn(n=0,1,2,3,4,5,6,7)作为计数器,先给初始值,然后每循环一次减1,直到循环次数为0结束循环,程序结构如下:
MOV Rn,#Counter …… LPM SUBS Rn,Rn,#1 BCC LPM
由条件控制循环
- 从0x30500000开始的内存区域存放着若干字节的BCD码数据,并以0x0D结束。编程对这些数据进行累加和计算,取累加和的前面两个字节放到这个数据结束字符之后的两字节中,并把数据个数写入后一个单元中
AREA EXAMPLE4,CODE,READONLY ENTRY CODE32 MYADD MOV R0,#0 MOV R1,#0 LDR R2, =0x30500000 LOPPA LDRB R3,[R2] CMP R3,#0x0D BNE LOPPOUT ADD R1,R1,R3 ADD R2,R2,#1 ADD R0,R0,#1 B LOPPA LOPPOUT STRH R1,[R2] STR R0,[R2+2] END
5、子程序设计
- 在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。在程序中,使用指令:
BL 子程序名
即可完成程序的调用
6、多段程序设计
- 前面的例子均只釆用一个代码段,实际应用中还可以定义多个数据段。