134
项项项 项项项项项项项项 项项项项项 项项项 项项项项项项项项 项项项项项 本本本本本 本本本本本 ARM ARM 本本本本本本本本 本本本本本本本本本本本 本本本本 ,, 本本本本本本本本 本本本本本本本本本本本 本本本本 ,, ARM ARM 本本本本本本本本本本本本 本本本本 本本本本本本本本本本本本 本本本本 ARM ARM 本本本本本本本本本本本 本本 本本本本本本本本本本本 本本 本本 本本 ARM ARM 本本本本本本本本 本本本本本本本本 SoC SoC 本本本本本本本本本本本本本本本本本本

项目二、 掌握开发嵌入式系统的必备知识

  • Upload
    errin

  • View
    145

  • Download
    2

Embed Size (px)

DESCRIPTION

项目二、 掌握开发嵌入式系统的必备知识. 本项目将对 ARM 技术进行全面论述,通过本部分内容的学习,使大家对 ARM 技术有个全面的了解和掌握,建立起以 ARM 技术为基础的嵌入式系统应用和以 ARM 核为基础的嵌入式 SoC 芯片设计的技术基础。. 任务一、 ARM 技术的相关知识. 一、 ARM 体系结构的技术特征 ARM 的体系结构采用了若干 Berkeley RISC 处理器设计中的特征 Load/store 体系结构 固定的 32 位指令 3 地址指令格式 也放弃了其它若干 Berkeley RISC 特征 寄存器窗口 延迟转移 - PowerPoint PPT Presentation

Citation preview

Page 1: 项目二、    掌握开发嵌入式系统的必备知识

项目二、 掌握开发嵌入式系统的必备知识项目二、 掌握开发嵌入式系统的必备知识

本项目将对本项目将对 ARMARM 技术进行全面论述,通过本部分内技术进行全面论述,通过本部分内

容的学习,使大家对容的学习,使大家对 ARMARM 技术有个全面的了解和掌技术有个全面的了解和掌

握,建立起以握,建立起以 ARMARM 技术为基础的嵌入式系统应用和技术为基础的嵌入式系统应用和

以以 ARMARM 核为基础的嵌入式核为基础的嵌入式 SoCSoC 芯片设计的技术基础。芯片设计的技术基础。

Page 2: 项目二、    掌握开发嵌入式系统的必备知识

任务一、 任务一、 ARMARM 技术的相关知识技术的相关知识

Page 3: 项目二、    掌握开发嵌入式系统的必备知识

一、一、 ARMARM 体系结构的技术特征体系结构的技术特征

ARMARM 的体系结构采用了若干的体系结构采用了若干 Berkeley RISCBerkeley RISC 处理器设计中处理器设计中的特征的特征

Load/storeLoad/store 体系结构体系结构 固定的固定的 3232 位指令位指令 33 地址指令格式地址指令格式

也放弃了其它若干也放弃了其它若干 Berkeley RISCBerkeley RISC 特征特征 寄存器窗口 寄存器窗口 延迟转移 延迟转移 所有的指令单周期执行所有的指令单周期执行

Page 4: 项目二、    掌握开发嵌入式系统的必备知识

二、 二、 ARMARM 处理器的两种工作状态处理器的两种工作状态

ARMARM 状态状态 3232 位,位, ARMARM 状态下执行字对准的状态下执行字对准的 3232 位位 ARMARM 指指

令;令;ThumbThumb 状态状态

1616 位,位, ThumbThumb 状态下执行半字对准的状态下执行半字对准的 1616 位位 TThumbhumb 指令。在指令。在 ThumbThumb 状态下,程序计数器状态下,程序计数器 PCPC使用位使用位 11 选择另一个半字。选择另一个半字。

ARMARM 处理器的两种工作状态可以进行相互转化,处理器的两种工作状态可以进行相互转化,其转化方法为:其转化方法为:

Page 5: 项目二、    掌握开发嵌入式系统的必备知识

进入进入 ThumbThumb 状态状态 当操作数寄存器当操作数寄存器 RmRm 的状态位的状态位 bitbit [[ 00 ]为]为 11 时,执时,执行行 BX RmBX Rm 指令进入指令进入 ThumbThumb 状态(指令详细介绍见第状态(指令详细介绍见第三章)。如果处理器在三章)。如果处理器在 ThumbThumb 状态进入异常,则当状态进入异常,则当异常处理(异常处理( IRQIRQ ,, FIQFIQ ,, UndefUndef ,, AbortAbort 和和 SWISWI ))返回时,自动切换到返回时,自动切换到 ThumbThumb 状态。状态。进入进入 ARMARM 状态状态

当操作数寄存器当操作数寄存器 RmRm 的状态位的状态位 bitbit [[ 00 ]为]为 00 时,执时,执行行 BX RmBX Rm 指令进入指令进入 ARMARM 状态。如果处理器进行异常状态。如果处理器进行异常处理(处理( IRQIRQ ,, FIQFIQ ,, UndefUndef ,, AbortAbort 和和 SWISWI ),在),在此情况下,把此情况下,把 PCPC 放入异常模式链接寄存器放入异常模式链接寄存器 LRLR 中,中,从异常向量地址开始执行也可以进入从异常向量地址开始执行也可以进入 ARMARM 状态。状态。

Page 6: 项目二、    掌握开发嵌入式系统的必备知识

三、三、 ARMARM 处理器的七种工作模式处理器的七种工作模式CPSRCPSR (当前程序状态寄存器)的低(当前程序状态寄存器)的低 55 位用于定义当前位用于定义当前操操

作模式 作模式 , , 如下表示:如下表示:

Page 7: 项目二、    掌握开发嵌入式系统的必备知识

除用户模式外的其他除用户模式外的其他 66 种模式称为特权模式 种模式称为特权模式 特权模式中除系统模式以外的特权模式中除系统模式以外的 55 种模式又称为异种模式又称为异常模式,即常模式,即 FIQFIQ (( Fast Interrupt RequestFast Interrupt Request ))IRQIRQ (( Interrupt ReQuestInterrupt ReQuest ))SVCSVC (( SupervisorSupervisor ))中止(中止( AbortAbort ))未定义(未定义( UndefinedUndefined ))

Page 8: 项目二、    掌握开发嵌入式系统的必备知识

四、四、 ARMARM 状态下的寄存器组织状态下的寄存器组织

Page 9: 项目二、    掌握开发嵌入式系统的必备知识

五、五、 ARMARM 的异常中断的异常中断11 、、 ARMARM 异常中断的相应过程异常中断的相应过程

将将 CPSRCPSR 的内容保存到将要执行的异常中断对应的的内容保存到将要执行的异常中断对应的 SPSRSPSR 中 中 设置当前状态寄存器设置当前状态寄存器 CPSRCPSR 中的相应位 中的相应位 将引起异常指令的下一条指令的地址保存到新的异常工作将引起异常指令的下一条指令的地址保存到新的异常工作模式的模式的 R14 R14 给程序计数器(给程序计数器( PCPC )强制赋值)强制赋值每个异常模式对应有两个寄存器每个异常模式对应有两个寄存器 R13_<mode>R13_<mode> 、、 R14_<modeR14_<mode>> 分别保存相应模式下的堆栈指针、返回地址;堆栈指针分别保存相应模式下的堆栈指针、返回地址;堆栈指针可用来定义一个存储区域保存其它用户寄存器,这样异常可用来定义一个存储区域保存其它用户寄存器,这样异常处理程序就可以使用这些寄存器。处理程序就可以使用这些寄存器。FIQFIQ 模式还有额外的专用寄存器模式还有额外的专用寄存器 R8_fiqR8_fiq ~~ R12_fiqR12_fiq ,使用,使用这些寄存器可以加快快速中断的处理速度。这些寄存器可以加快快速中断的处理速度。

Page 10: 项目二、    掌握开发嵌入式系统的必备知识

22 、、 ARMARM 异常中断的返回异常中断的返回

从异常中断处理程序中返回时,需要执行以下四个基本操作 所有修改过的用户寄存器必须从处理程序的保护堆栈中恢所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(即出栈)。复(即出栈)。将将 SPSR_modeSPSR_mode 寄存器内容复制到寄存器内容复制到 CPSRCPSR 中,使得中,使得 CPSRCPSR 从相从相应的应的 SPSRSPSR 中恢复,即恢复被中断的程序工作状态;中恢复,即恢复被中断的程序工作状态;根据异常类型将根据异常类型将 PCPC 变回到用户指令流中相应指令处变回到用户指令流中相应指令处

最后清除最后清除 CPSRCPSR 中的中断禁止标志位中的中断禁止标志位 I/FI/F 。。

Page 11: 项目二、    掌握开发嵌入式系统的必备知识

3)3) 、、 ARMARM 异常中断的向量表异常中断的向量表

异常类型 向量地址 优先级 异常中断含义

复位(Reset) 0x00000000 1 当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况下:

· 系统加电时· 系统复位时· 跳转到复位中断向量处执行,称为软复位

未定义的指令( undefined instruction)

0x00000004 6 当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产(undefined instruction)生未定义的指令异常中断。可以通过该异常中断机制仿真浮点向量运算

软件中断(SWI)

0x00000008 6 这是一个由用户定义的中断指令。可用于用户模式下的程序调用特权操作

指令预取中止(Prefech Abort)

0x0000000C 5 如果处理器预取的指令的地址不存在,或者该地址不允许当前指(Prefech Abort)令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断

数据访问中止(Data Abort)

0x00000010 2 如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断

外部中断请求(IRQ)

0x00000018 4 当处理器的外部中断请求引脚有效,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断请求(IRQ)异常中断。系统中各外设通常通过该异常中断请求处理器服务

快速中断请求(FIQ)

0x0000001C 3 当处理器的外部快速中断请求引脚有效,而且CPSR寄存器的F控制位被清除时,处理器产生外部中断请求(FIQ)

Page 12: 项目二、    掌握开发嵌入式系统的必备知识

六、 ARM 数据类型和存储格式

ARMARM 处理器支持以下处理器支持以下 66 种数据类型:种数据类型: 88 位有符号和无符号字节。位有符号和无符号字节。1616 位有符号和无符号半字,它们以两字节的边界定位有符号和无符号半字,它们以两字节的边界定位。位。3232 位有符号和无符号字,它们以位有符号和无符号字,它们以 44 字节的边界定位。字节的边界定位。

ARMARM 数据的存储格式:数据的存储格式:

大端格式:大端格式: 数据的高位存放在低地址单元,数据低位存放数据的高位存放在低地址单元,数据低位存放高地址单元。高地址单元。

小端格式:数据的高位存放在高地址单元,数据低位存放低小端格式:数据的高位存放在高地址单元,数据低位存放低地址单元。地址单元。

Page 13: 项目二、    掌握开发嵌入式系统的必备知识

任务二、 任务二、 ARMARM 指令系统的构成指令系统的构成

Page 14: 项目二、    掌握开发嵌入式系统的必备知识

一、一、 ARMARM 寻址方式寻址方式

所谓寻址方式是指根据指令编码找出所谓寻址方式是指根据指令编码找出

操作数的方式方法。操作数的方式方法。 ARMARM 处理器所支持的处理器所支持的

常见寻址方式有七种,分别介绍如下:常见寻址方式有七种,分别介绍如下:

Page 15: 项目二、    掌握开发嵌入式系统的必备知识

11 、 立即数寻址、 立即数寻址

立即数寻址简称立即寻址,该寻址方式的特立即数寻址简称立即寻址,该寻址方式的特

点是在指令中直接给出操作数,该操作数称为立点是在指令中直接给出操作数,该操作数称为立

即数。立即数以“即数。立即数以“ #”#” 号开头。号开头。

如:如: MOV R0MOV R0 ,, #0x1000#0x1000

ADD R0ADD R0 ,, R1R1 ,, #10#10

Page 16: 项目二、    掌握开发嵌入式系统的必备知识

22 、 寄存器寻址、 寄存器寻址

寄存器寻址也称寄存器直接寻址,该寻址方式的寄存器寻址也称寄存器直接寻址,该寻址方式的

特点是指令编码中所需要的操作数都是存放在寄特点是指令编码中所需要的操作数都是存放在寄

存器中的,在指令中直接给出寄存器的编号。存器中的,在指令中直接给出寄存器的编号。

如:如: ADD R0ADD R0 ,, R1R1 ,, R2R2

ADD R0ADD R0 ,, R1R1 ,, R2R2 , , LSL #2LSL #2

Page 17: 项目二、    掌握开发嵌入式系统的必备知识

33 、 寄存器间接寻址、 寄存器间接寻址

寄存器间接寻址是将操作数的地址存放在寄寄存器间接寻址是将操作数的地址存放在寄

存中,操作数是存放在内存单元中的,在指令中存中,操作数是存放在内存单元中的,在指令中

给出存放操作数地址的寄存器名称,并用“给出存放操作数地址的寄存器名称,并用“ []”[]”

括起来。括起来。

如:如: LDR R0LDR R0 ,, [R1][R1]

STR R0STR R0 ,, [R1][R1]

Page 18: 项目二、    掌握开发嵌入式系统的必备知识

4 4 、基址加变址寻址、基址加变址寻址

基址加变址寻址又称为基址加偏址寻址,该基址加变址寻址又称为基址加偏址寻址,该

寻址方式的特点是操作数的有效地址是一个基地址寻址方式的特点是操作数的有效地址是一个基地址

和一个偏移地址的和,用于访问基址附近的内存单和一个偏移地址的和,用于访问基址附近的内存单

元。偏移地址的范围不能超过基址前后元。偏移地址的范围不能超过基址前后 4KB4KB 的范的范

围。有三种表现模式,分别介绍如下:围。有三种表现模式,分别介绍如下:

Page 19: 项目二、    掌握开发嵌入式系统的必备知识

11 )、前变址模式)、前变址模式

如:如: LDR R0LDR R0 ,, [R1[R1 ,, #4]#4]

该指令的功能是将(该指令的功能是将( R1R1 )) +4+4 内存单内存单

元的元的 3232 数据加载到数据加载到 R0R0 寄存器中,加载完寄存器中,加载完

成后成后 R1R1 的值不变 。的值不变 。

Page 20: 项目二、    掌握开发嵌入式系统的必备知识

22 )、自动变址模式)、自动变址模式

如:如:如:如: LDR R0LDR R0 ,, [R1[R1 ,, #4]#4] !!

该指令的功能是将(该指令的功能是将( R1R1 )) +4+4 内存单内存单

元的元的 3232 数据加载到数据加载到 R0R0 寄存器中,加载完寄存器中,加载完

成后成后 R1R1 的值修改为(的值修改为( R1R1 )) +4+4 。。

Page 21: 项目二、    掌握开发嵌入式系统的必备知识

33 )、后变址模式)、后变址模式

如如 LDR R0LDR R0 ,, [R1][R1] ,, #4#4

该指令的功能是将(该指令的功能是将( R1R1 )内存单元)内存单元

的的 3232 数据加载到数据加载到 R0R0 寄存器中,加载完成寄存器中,加载完成

后后 R1R1 的值修改为(的值修改为( R1R1 )) +4+4 。。

Page 22: 项目二、    掌握开发嵌入式系统的必备知识

55 、堆栈寻址、堆栈寻址

堆栈是指按照“先进后出”的原则组堆栈是指按照“先进后出”的原则组

织的一片连续的内存区域。指向堆栈的地织的一片连续的内存区域。指向堆栈的地

址寄存器叫堆栈指针寄存器址寄存器叫堆栈指针寄存器 SPSP ,用来访问,用来访问

堆栈区域。堆栈指针总是指向栈顶的。堆栈区域。堆栈指针总是指向栈顶的。

Page 23: 项目二、    掌握开发嵌入式系统的必备知识

1)1) 、堆栈的生成方法、堆栈的生成方法

向上生成法:即访问内存单元是地址向低向上生成法:即访问内存单元是地址向低

地址方向发展。地址方向发展。

向下生成法:即访问内存单元是地址向高向下生成法:即访问内存单元是地址向高

地址方向发展。地址方向发展。

Page 24: 项目二、    掌握开发嵌入式系统的必备知识

2)2) 、堆栈的分类方法、堆栈的分类方法

满递增堆栈满递增堆栈 FAFA :堆栈随存储器地址的增大而递增,堆栈:堆栈随存储器地址的增大而递增,堆栈

指针指向有效数据的最高地址或指向第一个要读出的数据指针指向有效数据的最高地址或指向第一个要读出的数据

位置。位置。

满递减堆栈满递减堆栈 FDFD :堆栈随存储器地址的增大而递减,堆栈:堆栈随存储器地址的增大而递减,堆栈

指针指向有效数据的最高地址或指向第一个要读出的数据指针指向有效数据的最高地址或指向第一个要读出的数据

位置。位置。

Page 25: 项目二、    掌握开发嵌入式系统的必备知识

空递增堆栈空递增堆栈 EAEA :堆栈随存储器地址的增大而递增,堆栈:堆栈随存储器地址的增大而递增,堆栈

指针指向有效数据的最高地址的上一个空位置或指向第一指针指向有效数据的最高地址的上一个空位置或指向第一

个要读出的数据位置的上一个空位置。个要读出的数据位置的上一个空位置。

空递减堆栈空递减堆栈 EDED :堆栈随存储器地址的增大而递增,堆栈:堆栈随存储器地址的增大而递增,堆栈

指针指向最后压入堆栈数据的下一个空位置或指向第一个指针指向最后压入堆栈数据的下一个空位置或指向第一个

要读出的数据位置的下一个空位置。要读出的数据位置的下一个空位置。

Page 26: 项目二、    掌握开发嵌入式系统的必备知识

3)3) 、堆栈寻址的实现、堆栈寻址的实现

在在 ARMARM 指令中通过指令中通过 Load/StoreLoad/Store 类指令实现。类指令实现。

如:如: STMFD SPSTMFD SP !,!, {R0-R7{R0-R7 ,, LR}LR}

LTMFD SPLTMFD SP !,!, {R0-R7{R0-R7 ,, LR}LR}

在在 ThumbThumb 指令中用指令中用 PUSHPUSH 和和 POPPOP 指令实现。指令实现。

如:如: PUSH {R0-R7PUSH {R0-R7 ,, LR}LR}

POP {R0-R7POP {R0-R7 ,, LR}LR}

Page 27: 项目二、    掌握开发嵌入式系统的必备知识

66 、块拷贝寻址、块拷贝寻址

块拷贝寻址是将内存中的一个数据块拷贝到块拷贝寻址是将内存中的一个数据块拷贝到

多个寄存器中,或是将多个寄存器的值拷贝到一多个寄存器中,或是将多个寄存器的值拷贝到一

块内存区域中。用块内存区域中。用 LDM/STMLDM/STM 指令实现。指令实现。

如:如: LDM R1!LDM R1! ,, [R3-R8][R3-R8]

STM R1!STM R1! ,, [R3-R8][R3-R8]

Page 28: 项目二、    掌握开发嵌入式系统的必备知识

77 、相对寻址、相对寻址

相对寻址常用于程序设计中控制程序的执行流程,相对寻址常用于程序设计中控制程序的执行流程,

可以认为是基址是可以认为是基址是 PCPC 的基址加变址寻址,偏移地址常是的基址加变址寻址,偏移地址常是

程序中的符号地址。程序中的符号地址。

如:如: BL s1BL s1

ADDEQ R0,R1,R2ADDEQ R0,R1,R2

S1: MOV PC,LRS1: MOV PC,LR

Page 29: 项目二、    掌握开发嵌入式系统的必备知识

二、二、 ARMARM 指令概述指令概述

ARMARM 处理器支持处理器支持 ARMARM 指令集和指令集和 ThumbThumb

指令集,所有的指令集,所有的 ARMARM 指令都是指令都是 3232 位的,位的, ThumbThumb 指令指令

都是都是 1616 位的,位的, ARMARM 处理器复位异常启动后总是执行处理器复位异常启动后总是执行 AA

RMRM 指令集,包括所有异常中断都自动进入指令集,包括所有异常中断都自动进入 ARMARM 工作工作

状态。所有状态。所有 ARMARM 指令集都是有条件执行的,而指令集都是有条件执行的,而 ThumThum

bb 指令集只有指令集只有 BB 指令才是有条件执行的。指令才是有条件执行的。

Page 30: 项目二、    掌握开发嵌入式系统的必备知识

11 、、 ARMARM 指令集的条件执行指令集的条件执行

在在 ARMARM 指令集编码表中,统一使用高四位编指令集编码表中,统一使用高四位编

码来表示条件编码,每种条件码用两个英文助记符码来表示条件编码,每种条件码用两个英文助记符

来表示其含义,添加在指令码的后面表示指令执行来表示其含义,添加在指令码的后面表示指令执行

时必须要满足的条件。时必须要满足的条件。 ARMARM 指令根据指令根据 CPSRCPSR 中的中的

条件标志位的值来自动判断是否执行该条指令。当条件标志位的值来自动判断是否执行该条指令。当

条件满足是,执行该条指令,否则跳过该条指令。 条件满足是,执行该条指令,否则跳过该条指令。

Page 31: 项目二、    掌握开发嵌入式系统的必备知识
Page 32: 项目二、    掌握开发嵌入式系统的必备知识

22 、、 ARMARM 指令的分类指令的分类

ARMARM 指令集是指令集是 Load/StoreLoad/Store 类型的指令,类型的指令,

只能通过它访问存储器,而其他类型的指令只能只能通过它访问存储器,而其他类型的指令只能

访问内部寄存器。访问内部寄存器。 ARMARM 指令集有数据处理指令、指令集有数据处理指令、

转移指令、转移指令、 Load/StoreLoad/Store 指令、指令、 CPSRCPSR 处理指令、处理指令、

异常产生指令和协处理器指令六大类。异常产生指令和协处理器指令六大类。

Page 33: 项目二、    掌握开发嵌入式系统的必备知识

33 、、 ARMARM 指令集的指令格式指令集的指令格式

ARMARM汇编指令的基本书写格式如下:汇编指令的基本书写格式如下:

<opcode>{cond}{S} Rd, Rn {<opcode>{cond}{S} Rd, Rn { ,, op2}op2}

格式中的符号说明:格式中的符号说明: ““<>”<>” 中的内容表示必选项,“中的内容表示必选项,“ {}”{}” 中内容表示可中内容表示可

选项选项 condcond :表示条件后缀:表示条件后缀

Page 34: 项目二、    掌握开发嵌入式系统的必备知识

SS 选项:有该选项表示将根据指令执行的结果更选项:有该选项表示将根据指令执行的结果更

新新 CPSRCPSR 中状态标志位的值,否则不更新中状态标志位的值,否则不更新

RdRd :表示目的寄存器:表示目的寄存器

RnRn :表示存放第一个源操作数的寄存器:表示存放第一个源操作数的寄存器

OP2OP2 :表示存放第二个源操作数的寄存器或存储:表示存放第二个源操作数的寄存器或存储

单元单元

Page 35: 项目二、    掌握开发嵌入式系统的必备知识

三、 三、 ARMARM 指令集的详细介绍指令集的详细介绍

11 、数据处理指令、数据处理指令

ARMARM 的数据处理指令主要完成数据的的数据处理指令主要完成数据的

算术运算和逻辑运算。按照数据处理的功能主要分为算术运算和逻辑运算。按照数据处理的功能主要分为

数据传送指令、算术运算指令、逻辑运算指令、位清数据传送指令、算术运算指令、逻辑运算指令、位清

除指令、比较指令、测试指令六种。 除指令、比较指令、测试指令六种。

Page 36: 项目二、    掌握开发嵌入式系统的必备知识

11 )、数据传送指令)、数据传送指令 MOVMOV 、、 MVNMVN

书写格式:书写格式: MOV/MVN{cond}{S} MOV/MVN{cond}{S} 目的操目的操

作数作数 Rd ,Rd ,源操作数源操作数 RnRn

功能描述:功能描述: MOVMOV 指令的功能是把源操作数指令的功能是把源操作数

传送到目的操作数中进行保存;而传送到目的操作数中进行保存;而 MVNMVN 的功能的功能

是先把源操作数取反后再传送到目的操作数中。是先把源操作数取反后再传送到目的操作数中。

Page 37: 项目二、    掌握开发嵌入式系统的必备知识

说明:若设置说明:若设置 SS 选项,则这两条指令根据结果更新选项,则这两条指令根据结果更新

NN 和和 ZZ标志;当第标志;当第 22 操作数使用移位寻址时更新操作数使用移位寻址时更新

CC标志,否则不更新;对标志,否则不更新;对 VV标志没有影响。标志没有影响。

实例:设:(实例:设:( R2R2 )) =0x1000=0x1000

MOV R1, R2; (R1)= 0x1000 MOV R1, R2; (R1)= 0x1000

MVN R1, R2; (R1)=0xFFFFEFFF MVN R1, R2; (R1)=0xFFFFEFFF

Page 38: 项目二、    掌握开发嵌入式系统的必备知识

22 )、算术运算指令)、算术运算指令

(( 11 )加法指令)加法指令 ADDADD 、、 ADCADC

书写格式: 书写格式: ADD/ADC{cond}{S} RdADD/ADC{cond}{S} Rd ,, Rn1Rn1 , , RR

n2n2

功能描述: 功能描述: ADDADD : : Rn1+Rn2 ->RdRn1+Rn2 ->Rd

ADCADC : : Rn1+Rn2+C ->RdRn1+Rn2+C ->Rd

Page 39: 项目二、    掌握开发嵌入式系统的必备知识

说明:若设置说明:若设置 SS 选项,则这两条指令根据结果更新选项,则这两条指令根据结果更新 NN 、、 ZZ 、、 CC 、、

VV标志。标志。

实例:实例:

设(设( R1R1 )) =0x1000=0x1000 ,(,( R2R2 )) =0x2000 C=1=0x2000 C=1

ADD R0ADD R0 ,, R1R1 ,, R2R2 ;(;( R0R0 )) =0x3000=0x3000

ADD R0ADD R0 ,, R1R1 ,, R2R2 ,, LSR #2LSR #2 ;(;( R0R0 )) =0x1800=0x1800

ADC R0ADC R0 ,, R1R1 ,, R2R2 ;(;( R0R0 )) =0x3001=0x3001

Page 40: 项目二、    掌握开发嵌入式系统的必备知识

(( 22 ) 减法指令) 减法指令 SUBSUB 、、 SBCSBC 、、 RSBRSB 、、 RSCRSC

书写格式: 书写格式: SUB/RSB/SBC/RSB{cond}{S} RdSUB/RSB/SBC/RSB{cond}{S} Rd ,, Rn1Rn1 , ,

Rn2 Rn2

功能描述:功能描述: SUBSUB : : Rn1-Rn2 ->RdRn1-Rn2 ->Rd

SBCSBC : : Rn1-Rn2–(-C) ->RdRn1-Rn2–(-C) ->Rd

RSBRSB :: Rn2-Rn1 ->RdRn2-Rn1 ->Rd

RSCRSC : : Rn2-Rn1-(-C) ->RdRn2-Rn1-(-C) ->Rd

Page 41: 项目二、    掌握开发嵌入式系统的必备知识

说明:若设置说明:若设置 SS 选项,则这些指令根据结果更新选项,则这些指令根据结果更新 NN 、、 ZZ 、、 CC 、、

VV标志。标志。

实例:设(实例:设( R1R1 )) =0x1000=0x1000 ,(,( R2R2 )) =0x2000=0x2000 , , C=1C=1

SUB R0SUB R0 ,, R1R1 ,, R2R2 ; (; ( R0R0 )) =0xFFFFF000=0xFFFFF000

SUB R0SUB R0 ,, R1R1 ,, R2R2 ,, LSR #2LSR #2 ;(;( R0R0 )) =0x800=0x800

RSB R0RSB R0 ,, R1R1 ,, R2R2 ; (; ( R0R0 )) =0x1000=0x1000

SBC R0SBC R0 ,, R1R1 ,, R2R2 ; (; ( R0R0 )) =0xFFFFF000=0xFFFFF000

Page 42: 项目二、    掌握开发嵌入式系统的必备知识

(( 33 ) 乘法指令) 乘法指令 MULMUL 、、 MLAMLA 、、 UMULLUMULL 、、

UMLALUMLAL 、、 SMULLSMULL 、、 SMLALSMLAL

①①MULMUL 简单乘法指令简单乘法指令

书写格式:书写格式: MUL{cond}{S} RdMUL{cond}{S} Rd ,, Rn1Rn1 , , RnRn

2 2

功能描述:(功能描述:( Rn1*Rn2 Rn1*Rn2 )) 0-31 ->Rd0-31 ->Rd

Page 43: 项目二、    掌握开发嵌入式系统的必备知识

②②MLAMLA乘加指令乘加指令

书写格式:书写格式: MLA{cond}{S} RdMLA{cond}{S} Rd ,, Rn1Rn1 , , Rn2Rn2 ,, Rn3Rn3

功能描述: (功能描述: ( Rn1*Rn2 + Rn3 Rn1*Rn2 + Rn3 )) 0-31 ->Rd0-31 ->Rd

③③无符号长乘指令无符号长乘指令 UMULLUMULL

书写格式: 书写格式: UMULL{cond}{S} RdLOUMULL{cond}{S} RdLO ,, RdHI, Rn1RdHI, Rn1 , , Rn2Rn2

功能描述:(功能描述:( Rn1*Rn2 Rn1*Rn2 )) 0-31 -> RdLO 0-31 -> RdLO ; ; (Rn1*Rn2 (Rn1*Rn2 )) 33

2-63 -> RdHI2-63 -> RdHI

Page 44: 项目二、    掌握开发嵌入式系统的必备知识

④④无符号长乘加指令无符号长乘加指令 UMLALUMLAL

书写格式: 书写格式: UMLAL{cond}{S} RdLOUMLAL{cond}{S} RdLO ,, RdHI, Rn1RdHI, Rn1 , , Rn2Rn2

功能描述:(功能描述:( Rn1*Rn2 Rn1*Rn2 )) 0-31 + RdLO -> RdLO0-31 + RdLO -> RdLO ;; (Rn1*R(Rn1*R

n2 n2 )) 32-63 + RdHI -> RdHI32-63 + RdHI -> RdHI

⑤⑤有符号数长乘指令有符号数长乘指令 SMULLSMULL

书写格式: 书写格式: SMULL{cond}{S} RdLOSMULL{cond}{S} RdLO ,, RdHI, Rn1RdHI, Rn1 , , Rn2Rn2

功能描述:(功能描述:( Rn1*Rn2Rn1*Rn2 )) 0-31 -> RdLO0-31 -> RdLO ; ; (Rn1*Rn2(Rn1*Rn2 )) 33

2-63 -> RdHI2-63 -> RdHI

Page 45: 项目二、    掌握开发嵌入式系统的必备知识

⑥⑥有符号数长乘加指令有符号数长乘加指令 SMLALSMLAL

书写格式: 书写格式: SMLAL{cond}{S} RdLOSMLAL{cond}{S} RdLO ,, RdHI, Rn1RdHI, Rn1 , , RnRn

22

功能描述: (功能描述: ( Rn1*Rn2 Rn1*Rn2 )) 0-31 + RdLO -> RdLO0-31 + RdLO -> RdLO ; ; (Rn(Rn

1*Rn2 1*Rn2 )) 32-63 + RdHI -> RdHI32-63 + RdHI -> RdHI

说明:若设置说明:若设置 SS 选项,则这些指令根据结果更新选项,则这些指令根据结果更新 NN 、、 ZZ 、、 CC 、、

VV标志。标志。

Page 46: 项目二、    掌握开发嵌入式系统的必备知识

33 )、逻辑运算指令)、逻辑运算指令 ANDAND 、、 ORRORR 、、 EOREOR

书写格式: 书写格式: AND/ORR/EOR{cond}{S} RdAND/ORR/EOR{cond}{S} Rd ,, Rn1Rn1 , , Rn2Rn2

功能描述: 功能描述:

ANDAND :将:将 Rn1Rn1 和和 Rn2Rn2 中的数据进行按位逻辑与运算,运算中的数据进行按位逻辑与运算,运算

的结果保存在的结果保存在 RdRd 中。中。

ORRORR :将:将 Rn1Rn1 和和 Rn2Rn2 中的数据进行按位逻辑或运算,运算的结中的数据进行按位逻辑或运算,运算的结

果保存在果保存在 RdRd 中。中。

EOREOR :将:将 Rn1Rn1 和和 Rn2Rn2 中的数据进行按位逻辑异或运算,运算的中的数据进行按位逻辑异或运算,运算的

结果保存在结果保存在 RdRd 中。中。

Page 47: 项目二、    掌握开发嵌入式系统的必备知识

说明:若设置说明:若设置 SS 选项,则这些指令根据结果选项,则这些指令根据结果

更新更新 NN 和和 ZZ 标志;若第标志;若第 22 操作数使用移位操作数使用移位

运算,则更新运算,则更新 CC标志,否则不更新;不影标志,否则不更新;不影

响响 VV 标志。标志。

Page 48: 项目二、    掌握开发嵌入式系统的必备知识

44 )、位清除指令)、位清除指令 BICBIC

书写格式:书写格式: BIC{cond}{S} RdBIC{cond}{S} Rd ,, Rn1Rn1 , , Rn2Rn2

功能描述:将功能描述:将 Rn1Rn1 和和 Rn2Rn2 的反码进行按位与运算,结的反码进行按位与运算,结

果保存在果保存在 RdRd 中。中。

实例: 实例: BIC R8BIC R8 ,, R10R10 ,, R0R0 , , RRX5RRX5

说明:若设置说明:若设置 SS 选项,则这些该指令根据结果更新选项,则这些该指令根据结果更新 NN

和和 ZZ标志;若第标志;若第 22 操作数使用移位运算,则更新操作数使用移位运算,则更新 CC

标志,否则不更新;不影响标志,否则不更新;不影响 VV标志。标志。

Page 49: 项目二、    掌握开发嵌入式系统的必备知识

55 )、比较指令)、比较指令 CMPCMP 、、 CMNCMN

书写格式:书写格式: CMP/CMN{cond} RdCMP/CMN{cond} Rd ,, RnRn

功能描述:功能描述:

CMPCMP 是正数比较指令,用(是正数比较指令,用( RdRd )) -- (( RnRn )的结果更新状态)的结果更新状态

标志位,结果不保存。标志位,结果不保存。

CMNCMN 是负数比较指令,用(是负数比较指令,用( RdRd )) ++ (( RnRn )的结果更新状)的结果更新状

态标志位,结果不保存。态标志位,结果不保存。

说明:这两条指令根据结果更新说明:这两条指令根据结果更新 NN 、、 ZZ 、、 CC 、、 VV标志,运算结果不保存。标志,运算结果不保存。

实例:实例: CMPGT R13CMPGT R13 ,, R7R7 ,, LSL #3 LSL #3

CMN R0CMN R0 ,, #6400 #6400

Page 50: 项目二、    掌握开发嵌入式系统的必备知识

66 )、测试指令)、测试指令 TSTTST 、、 TEQTEQ

书写格式: 书写格式: TST/TEQ{cond} RdTST/TEQ{cond} Rd ,, Rn Rn

功能描述:功能描述:

TSTTST 位测试,将两个操作数进行按位与运算,根据结果更新状态标志位,位测试,将两个操作数进行按位与运算,根据结果更新状态标志位,

结果不保存。结果不保存。

TEQTEQ 相等测试,将两个操作数进行按位异或运算,根据结果更新状态标相等测试,将两个操作数进行按位异或运算,根据结果更新状态标

志位,结果不保存。志位,结果不保存。

说明:这两条指令根据结果更新说明:这两条指令根据结果更新 NN 、、 ZZ 、、 CC 、、 VV标志,运算结果不保存。标志,运算结果不保存。

实例:实例: TST R0TST R0 ,, #0X3F8 #0X3F8

TEQ R10TEQ R10 ,, R9R9

Page 51: 项目二、    掌握开发嵌入式系统的必备知识

22 、 、 Load/StoreLoad/Store 指令指令

ARMARM 的数据存取指令的数据存取指令 Load/StoreLoad/Store 对数据的操作是通过将数对数据的操作是通过将数

据从存储器加载到片内寄存器中进行处理,处理完成后的结果回存到据从存储器加载到片内寄存器中进行处理,处理完成后的结果回存到

存储器中,用以加快对片外存储器进行数据处理的执行速度,它是唯存储器中,用以加快对片外存储器进行数据处理的执行速度,它是唯

一用于在寄存器和存储器之间进行数据传送的指令。一用于在寄存器和存储器之间进行数据传送的指令。 ARMARM 指令集中指令集中

有三种基本的数据存取指令: 有三种基本的数据存取指令:

单寄存器的存取指令(单寄存器的存取指令( LDRLDR ,, STRSTR ))

多寄存器存取指令(多寄存器存取指令( LDMLDM ,, STMSTM ))

单寄存器交换指令(单寄存器交换指令( SWPSWP ) )

Page 52: 项目二、    掌握开发嵌入式系统的必备知识

1)1) 、单寄存器存取指令、单寄存器存取指令 LDRLDR 、、 STRSTR

单寄存器存取指令是单寄存器存取指令是 ARMARM 在寄存器和存储在寄存器和存储

器之间进行单个字节和字传送的最灵活的方式。器之间进行单个字节和字传送的最灵活的方式。

只要寄存器被初始化为所需要的内存单元的某处,只要寄存器被初始化为所需要的内存单元的某处,

这些指令就可以提供有效的存储器的存取机制。这些指令就可以提供有效的存储器的存取机制。

它支持几种寻址模式,介绍如下:它支持几种寻址模式,介绍如下:

Page 53: 项目二、    掌握开发嵌入式系统的必备知识

前变址指令格式:前变址指令格式:

LDR/STR{cond}{B|H|SH|SB} Rd, [Rn, <offset>]LDR/STR{cond}{B|H|SH|SB} Rd, [Rn, <offset>]

{!}{!}

功能描述:功能描述:

LDRLDR 是将有效地址为(是将有效地址为( RnRn )) +offset+offset 内存单元的内存单元的 33

22 位数据加载到位数据加载到 RdRd 寄存器中;而寄存器中;而 STRSTR 是将是将 RdRd 寄存器的寄存器的 3232

位数据存储到有效地址为(位数据存储到有效地址为( RnRn )) +offset+offset 的内存单元中。的内存单元中。

若最后的“!”省略则表示数据传送完成后不更新基址寄存若最后的“!”省略则表示数据传送完成后不更新基址寄存

器器 RnRn 的值,若有则表示完成数据的传送后要更新基址寄存的值,若有则表示完成数据的传送后要更新基址寄存

器器 RnRn 的值。的值。

Page 54: 项目二、    掌握开发嵌入式系统的必备知识

后变址的指令格式:后变址的指令格式:

LDR/STR{cond}{B|H|SH|SB} Rd, [Rn], <offset>LDR/STR{cond}{B|H|SH|SB} Rd, [Rn], <offset>

功能描述:功能描述:

LDRLDR 是将有效地址为(是将有效地址为( RnRn )内存单元的)内存单元的 3232 位数据加载到位数据加载到

RdRd 寄存器中,然后更新基址寄存器寄存器中,然后更新基址寄存器 RnRn 的值位(的值位( RnRn )) +offset+offset ;;

而而 STRSTR 是将是将 RdRd 寄存器的寄存器的 3232 位数据存储到有效地址为(位数据存储到有效地址为( RnRn )的)的

内存单元中内存单元中 , , 然后更新基址寄存器然后更新基址寄存器 RnRn 的值位(的值位( RnRn )) +offset+offset

说明:说明: BB 后缀表示传送的是后缀表示传送的是 88 位字节数据;位字节数据; HH 后缀表示传送的是后缀表示传送的是 1616

位的半字数据;位的半字数据; SHSH 后缀表示传送的是后缀表示传送的是 1616 位的有符号半字数据;位的有符号半字数据;

SBSB 表示传送的是表示传送的是 88 位有符号字节数据。位有符号字节数据。

Page 55: 项目二、    掌握开发嵌入式系统的必备知识

2)2) 、多寄存器存取指令、多寄存器存取指令 LDMLDM 、、 STMSTM

多寄存器传送指令可以用一条指令将多寄存器传送指令可以用一条指令将 1616 个可见寄个可见寄

存器(存器( R0~R15R0~R15 )的任意子集合(或全部)存储到存储器)的任意子集合(或全部)存储到存储器

或从存储器中读取数据到该寄存器集合中。与单寄存器存或从存储器中读取数据到该寄存器集合中。与单寄存器存

取指令相比,多寄存器数据存取可用的寻址模式更加有限。取指令相比,多寄存器数据存取可用的寻址模式更加有限。

多寄存器存取指令的汇编格式如下:多寄存器存取指令的汇编格式如下:

LDM/STM{<cond>}<LDM/STM{<cond>}< 类型类型 > Rn{!}> Rn{!} , , <registers> <registers>

Page 56: 项目二、    掌握开发嵌入式系统的必备知识

类型:类型:

IAIA :每次传送后地址加:每次传送后地址加 44

IBIB :每次传送前地址加:每次传送前地址加 44

DADA :每次传送后地址减:每次传送后地址减 44

DBDB :每次传送前地址减:每次传送前地址减 44

FAFA :满递增堆栈:满递增堆栈

FDFD :满递减堆栈:满递减堆栈

EAEA :空递增堆栈:空递增堆栈

EDED :空递减堆栈:空递减堆栈

Page 57: 项目二、    掌握开发嵌入式系统的必备知识

3)3) 、单寄存器字交换指令、单寄存器字交换指令 SWPSWP 和字节交换指令和字节交换指令 SWPBSWPB

书写格式:书写格式:

SWP/SWPB{<cond>} RdSWP/SWPB{<cond>} Rd ,, RmRm ,, [Rn] [Rn]

功能描述:功能描述:

SWPSWP 将将 [Rn][Rn] 中的数据传送到中的数据传送到 RdRd ,将,将 RmRm 中数据中数据

传送到传送到 [Rn][Rn] 中。 中。

SWPBSWPB 将将 [Rn][Rn] 中的数据传送到中的数据传送到 RdRd ,同时将,同时将 RdRd 的的

高高 2424 位清零,将位清零,将 RmRm 中数据传送到中数据传送到 [Rn] [Rn] 。。

Page 58: 项目二、    掌握开发嵌入式系统的必备知识

33 、 程序状态寄存器与通用寄存器之间的传送指令、 程序状态寄存器与通用寄存器之间的传送指令

程序状态寄存器与通用寄存器之间的传送指令有两程序状态寄存器与通用寄存器之间的传送指令有两

条条 MSRMSR 和和 MRSMRS 。修改程序状态寄存器的值一般是通过。修改程序状态寄存器的值一般是通过

“读取“读取 -- 修改修改 -- 回写”三个步骤实现的,但要注意的是不回写”三个步骤实现的,但要注意的是不

能通过该指令直接修改能通过该指令直接修改 TT标志位的值而使程序在标志位的值而使程序在 ARMARM 状状

态和态和 ThumbThumb 状态之间切换,必须通过使用状态之间切换,必须通过使用 BXBX 指令来实指令来实

现两种工作状态的切换 现两种工作状态的切换

Page 59: 项目二、    掌握开发嵌入式系统的必备知识

(( 11 )) . . 状态寄存器到通用寄存器的数据传送指令状态寄存器到通用寄存器的数据传送指令 MRSMRS

MRSMRS 用于将状态寄存器的值传送到通用寄存器中,主要用于将状态寄存器的值传送到通用寄存器中,主要

应用于以下三种场合:应用于以下三种场合: 通过“读取通过“读取 -- 修改修改 -- 回写”来修改状态寄存器的值。回写”来修改状态寄存器的值。

当异常中断允许嵌套时,需要保存当前处理器工作模式的当异常中断允许嵌套时,需要保存当前处理器工作模式的 SPSRSPSR 。。

当进程切换时,也要保存当前寄存器的值。当进程切换时,也要保存当前寄存器的值。

其书写格式为:其书写格式为: MRS{cond} Rd, CPSR|SPSRMRS{cond} Rd, CPSR|SPSR

功能描述:将功能描述:将 CPSRCPSR 或或 SPSRSPSR 的值传送到的值传送到 RdRd 寄存器中进行保寄存器中进行保

存。存。

Page 60: 项目二、    掌握开发嵌入式系统的必备知识

(( 22 )) . . 通用寄存器到状态寄存器的数据传送指令通用寄存器到状态寄存器的数据传送指令 MSRMSR

当需要保存或修改状态寄存器的值时,需要向将状态寄存当需要保存或修改状态寄存器的值时,需要向将状态寄存

器的内容传送到通用寄存器中,然后进行相应修改,修改完成后回器的内容传送到通用寄存器中,然后进行相应修改,修改完成后回

写到状态寄存器中,写到状态寄存器中, MSRMSR 指令将完成该功能。指令将完成该功能。

书写格式:书写格式:

MSR{cond} CPSR_mode|SPSR_modeMSR{cond} CPSR_mode|SPSR_mode ,, #32imda|Rn#32imda|Rn

功能描述:功能描述:

将一个将一个 3232 位的立即数或通用寄存器位的立即数或通用寄存器 RnRn 的值传送到状态寄存器中。的值传送到状态寄存器中。

Page 61: 项目二、    掌握开发嵌入式系统的必备知识

44 、转移指令、转移指令

在在 ARMARM 中实现程序转移的方法有两种:一中实现程序转移的方法有两种:一

是使用数据传送指令直接位是使用数据传送指令直接位 PCPC赋值;二是使用赋值;二是使用

转移指令转移指令 BB 、、 BLBL 、、 BXBX 、、 BLXBLX 来实现。来实现。 ARMARM

处理器提供的转移指令有四条,分别详细介绍如处理器提供的转移指令有四条,分别详细介绍如

下:下:

Page 62: 项目二、    掌握开发嵌入式系统的必备知识

1). 1). 无条件转移指令无条件转移指令 BB

书写格式:书写格式: B{cond} B{cond} 目标地址目标地址

功能描述:无条件转移指令功能描述:无条件转移指令 BB主要用于将程序的执主要用于将程序的执

行流程无条件转移到制定的目标地址处执行。行流程无条件转移到制定的目标地址处执行。

目标地址通常是程序中的符号地址,其有效地目标地址通常是程序中的符号地址,其有效地

址是址是 PCPC 值与符号地址的和。值与符号地址的和。

Page 63: 项目二、    掌握开发嵌入式系统的必备知识

2). 2). 带链接的转移指令带链接的转移指令 BLBL

BLBL 指令常用于子程序调用中,该指令指令常用于子程序调用中,该指令

完成两个功能:一是将完成两个功能:一是将 BLBL 指令的下一条指令的指令的下一条指令的

PCPC 值保存到链接寄存器值保存到链接寄存器 LRLR 中;二是将程序的中;二是将程序的

执行流程转移到指定的标号处。执行流程转移到指定的标号处。

书写格式:书写格式: BL{cond} BL{cond} 目标地址目标地址

Page 64: 项目二、    掌握开发嵌入式系统的必备知识

3). 3). 带状态切换的转移指令带状态切换的转移指令 BXBX

书写格式:书写格式: BX [Rn]BX [Rn]

功能描述:功能描述: BXBX 指令用于将程序转移到目标地址指令用于将程序转移到目标地址

处执行,同时在处执行,同时在 ARMARM 状态和状态和 ThumbThumb 状态之间状态之间

进行切换,若进行切换,若 RnRn 的最低位为的最低位为 11时进入时进入 ThumbThumb

工作状态,若最低位为工作状态,若最低位为 00时进入时进入 ARMARM 工作状态。工作状态。

Page 65: 项目二、    掌握开发嵌入式系统的必备知识

4). 4). 带链接和状态切换的转移指令带链接和状态切换的转移指令 BLXBLX

书写格式:书写格式: BLX [Rn]|LabelBLX [Rn]|Label

功能描述:功能描述: BLXBLX 的功能是的功能是 BXBX 指令和指令和 BLBL

指令的集合体。指令的集合体。

Page 66: 项目二、    掌握开发嵌入式系统的必备知识

55 、异常中断的产生指令、异常中断的产生指令

ARMARM微处理器提供的异常中断产生指微处理器提供的异常中断产生指

令主要有令主要有 SWISWI 和和 BKPTBKPT 两条指令,两条指令, SWISWI 指令指令

用于产生用于产生 SWISWI 异常中断,用来实现在用户模式异常中断,用来实现在用户模式

下对操作系统中特权模式的程序调用;断点中下对操作系统中特权模式的程序调用;断点中

断指令断指令 BKPTBKPT 用于产生软件断点,供程序调试用于产生软件断点,供程序调试

使用。使用。

Page 67: 项目二、    掌握开发嵌入式系统的必备知识

1). 1). 软件异常中断指令软件异常中断指令 SWISWI

SWISWI 指令用于用户调用操作系统例程,将处理器置于系统监指令用于用户调用操作系统例程,将处理器置于系统监

控模式控模式 SVCSVC ,从地址,从地址 0x080x08 开始执行指令。开始执行指令。

其汇编格式为:其汇编格式为: SWI{cond} <24SWI{cond} <24 位立即数位立即数 >>

2). 2). 断点中断指令断点中断指令 BKPTBKPT

BKPTBKPT 指令用于软件调试,它使处理器停止执行正常指令而指令用于软件调试,它使处理器停止执行正常指令而

进入相应的调试程序。其汇编格式为:进入相应的调试程序。其汇编格式为: BKPT <16BKPT <16 位立即数位立即数 >> 。。

Page 68: 项目二、    掌握开发嵌入式系统的必备知识

任务三、 任务三、 ARMARM 程序设计方法程序设计方法

Page 69: 项目二、    掌握开发嵌入式系统的必备知识

一、 一、 ARMARM汇编语言的伪操作汇编语言的伪操作

ARMARM汇编语言源程序由指令、伪指令和宏汇编语言源程序由指令、伪指令和宏

指令构成。伪指令是非执行语句,是为完成汇编指令构成。伪指令是非执行语句,是为完成汇编

程序作各种准备工作的,他们仅在汇编过程中起程序作各种准备工作的,他们仅在汇编过程中起

作用,一旦汇编结束,伪指令的使命也就完成。作用,一旦汇编结束,伪指令的使命也就完成。

伪指令语句所完成的操作叫伪操作。伪指令语句所完成的操作叫伪操作。

Page 70: 项目二、    掌握开发嵌入式系统的必备知识

汇编程序中提供的伪指令主要有以下几种:汇编程序中提供的伪指令主要有以下几种:

符号定义伪指令符号定义伪指令

数据定义伪指令数据定义伪指令

汇编控制伪指令汇编控制伪指令

宏指令宏指令

信息报告伪指令信息报告伪指令

Page 71: 项目二、    掌握开发嵌入式系统的必备知识

11 、 、 ARMASMARMASM汇编器所支持的伪操作汇编器所支持的伪操作

ARMARM汇编语言源程序由指令、伪指令和宏指令构成。伪指令汇编语言源程序由指令、伪指令和宏指令构成。伪指令

是非执行语句,是为完成汇编程序作各种准备工作的,他们仅在汇编是非执行语句,是为完成汇编程序作各种准备工作的,他们仅在汇编

过程中起作用,一旦汇编结束,伪指令的使命也就完成。伪指令语句过程中起作用,一旦汇编结束,伪指令的使命也就完成。伪指令语句

所完成的操作叫伪操作。在所完成的操作叫伪操作。在 ARMARM汇编程序中,主要有符号定义伪指汇编程序中,主要有符号定义伪指

令、数据定义伪指令、汇编控制伪指令、信息报告伪指令、宏指令等令、数据定义伪指令、汇编控制伪指令、信息报告伪指令、宏指令等

伪指令。伪指令。

Page 72: 项目二、    掌握开发嵌入式系统的必备知识

11 )、符号定义伪操作)、符号定义伪操作

符号定义伪操作主要用于定义符号定义伪操作主要用于定义 ARMARM汇编程序中的变量,对变量进汇编程序中的变量,对变量进

行赋值、定义寄存器的名称等操作。包括以下伪指令:行赋值、定义寄存器的名称等操作。包括以下伪指令: 全局变量定义伪指令:全局变量定义伪指令: GBLAGBLA 、、 GBLLGBLL 、、 GBLSGBLS

局部变量定义伪指令:局部变量定义伪指令: LCLALCLA 、、 LCLLLCLL 、、 LCLSLCLS

变量赋值伪指令:变量赋值伪指令: SETASETA 、、 SETLSETL 、、 SETSSETS

为通用寄存器列表定义名称伪指令:为通用寄存器列表定义名称伪指令: RLISTRLIST

为协处理器寄存器定义名称伪指令:为协处理器寄存器定义名称伪指令: CNCN

为协处理器定义名称伪指令:为协处理器定义名称伪指令: CPCP

为为 VFPVFP 寄存器定义名称伪指令:寄存器定义名称伪指令: DNDN 、、 SNSN

为为 FPAFPA 的浮点寄存器定义名称伪指令:的浮点寄存器定义名称伪指令: FNFN

Page 73: 项目二、    掌握开发嵌入式系统的必备知识

(( 11 )、全局变量定义伪指令)、全局变量定义伪指令 GBLAGBLA 、、 GBLLGBLL 、、 GG

BLSBLS

格式:格式: GBLAGBLA (( GBLLGBLL 、、 GBLSGBLS ) 全局变量名) 全局变量名

功能:为功能:为 ARMARM汇编程序定义全局变量,其中汇编程序定义全局变量,其中 GBLGBL

AA 定义的是全局数字变量,并初始化为定义的是全局数字变量,并初始化为 00 ;; GBLLGBLL

定义的是全局逻辑变量,并初始化为定义的是全局逻辑变量,并初始化为 FF (逻辑变(逻辑变

量的值只有量的值只有 TT (真)和(真)和 FF (假));(假)); GBLSGBLS 定义定义

的是全局字符串变量,并初始化为空字符串。的是全局字符串变量,并初始化为空字符串。

Page 74: 项目二、    掌握开发嵌入式系统的必备知识

(( 22 )、局部变量定义伪指令)、局部变量定义伪指令 LCLALCLA 、、 LCLLLCLL 、、 LCLSLCLS

格式:格式: LCLALCLA (( LCLLLCLL 、、 LCLSLCLS ) 全局变量名) 全局变量名

功能:为功能:为 ARMARM汇编程序定义全局变量,其中汇编程序定义全局变量,其中 LCLALCLA 定义的定义的

是局部数字变量,并初始化为是局部数字变量,并初始化为 00 ;; LCLLLCLL 定义的是局部逻定义的是局部逻

辑变量,并初始化为辑变量,并初始化为 FF (逻辑变量的值只有(逻辑变量的值只有 TT (真)和(真)和 FF

(假));(假)); LCLSLCLS 定义的是局部字符串变量,并初始化为定义的是局部字符串变量,并初始化为

空字符串。空字符串。

Page 75: 项目二、    掌握开发嵌入式系统的必备知识

(( 33 )、变量赋值伪指令)、变量赋值伪指令 SETASETA 、、 SETLSETL 、、 SETSET

SS

格式:格式:

变量名 变量名 SETASETA (( SETLSETL 、、 SETSSETS ) 表达式) 表达式

功能:功能:

为为 ARMARM汇编程序中已定义的变量赋值,汇编程序中已定义的变量赋值,

其中其中 SETASETA 为数字变量赋值;为数字变量赋值; SETLSETL 为逻辑变为逻辑变

量赋值;量赋值; SETSSETS 为字符串变量赋值。为字符串变量赋值。

Page 76: 项目二、    掌握开发嵌入式系统的必备知识

(( 44 )、为通用寄存器列表定义名称伪指令)、为通用寄存器列表定义名称伪指令 RLISTRLIST

格式:名称 格式:名称 RLIST {RLIST { 寄存器列表寄存器列表 }}

功能:为寄存器列表中的所有寄存器定义一个统一的名称。功能:为寄存器列表中的所有寄存器定义一个统一的名称。

使用该伪指令定义的名称主要用于使用该伪指令定义的名称主要用于 LDM/STMLDM/STM 指令中,指令中,

但要注意列表中的寄存器的访问顺序为根据寄存器的编号但要注意列表中的寄存器的访问顺序为根据寄存器的编号

由低到高访问,而不是根据他们在列表中的先后顺序进行由低到高访问,而不是根据他们在列表中的先后顺序进行

访问。访问。

Page 77: 项目二、    掌握开发嵌入式系统的必备知识

(( 55 )、为协处理器寄存器定义名称伪指令:)、为协处理器寄存器定义名称伪指令: CNCN

格式:格式:

寄存器名称 寄存器名称 CN CN 协处理器的寄存器编号协处理器的寄存器编号

功能:功能:

为协处理器的寄存器定义一个指定的名称。为协处理器的寄存器定义一个指定的名称。

Page 78: 项目二、    掌握开发嵌入式系统的必备知识

(( 66 )、为协处理器定义名称伪指令:)、为协处理器定义名称伪指令: CPCP

格式:格式:

名称 名称 CP CP 协处理器编号(取值为协处理器编号(取值为 0-10-1

55 ))

功能:为协处理器定义一个名称功能:为协处理器定义一个名称

Page 79: 项目二、    掌握开发嵌入式系统的必备知识

(( 77 )、为)、为 VFPVFP 寄存器定义名称伪指令:寄存器定义名称伪指令: DNDN 、、 SNSN

格式:名称 格式:名称 DNDN 或或 SN VFPSN VFP 寄存器编号寄存器编号

功能:为功能:为 VFPVFP 寄存器定义一个名称。其中寄存器定义一个名称。其中 DNDN 为一个为一个

双精度的双精度的 VFPVFP 寄存器定义一个名称;寄存器定义一个名称; SNSN 为一个单为一个单

精度的精度的 VFPVFP 寄存器定义名称。双精度寄存器定义名称。双精度 VFPVFP 寄存器寄存器

的编号取值为的编号取值为 0-150-15 ;单精度;单精度 VFPVFP 寄存器编号的取寄存器编号的取

值范围为值范围为 0-310-31 。。

Page 80: 项目二、    掌握开发嵌入式系统的必备知识

22 )、 数据定义伪指令)、 数据定义伪指令

数据定义伪指令用于为特定的数据分配存储数据定义伪指令用于为特定的数据分配存储

单元,同时对已分配的存储单元进行初始化。常单元,同时对已分配的存储单元进行初始化。常

用的数据伪指令有用的数据伪指令有 DCBDCB 、、 DCWDCW 、、 DCWUDCWU 、、 DD

CDCD 、、 DCDUDCDU 、、 DCFDDCFD 、、 DCFDUDCFDU 、、 DCFSDCFS 、、

DCFSUDCFSU 、、 DCQDCQ 、、 DCQUDCQU 、、 SPACESPACE 、、 MAPMAP 、、

FIELDFIELD 。。

Page 81: 项目二、    掌握开发嵌入式系统的必备知识

(( 11 )、)、 DCBDCB伪指令伪指令

格式:标号 格式:标号 DCB DCB 表达式表达式

功能:用于分配一片连续的字节存储单元并用伪指功能:用于分配一片连续的字节存储单元并用伪指

令中的表达式初始化。表达式的取值为令中的表达式初始化。表达式的取值为 0~2550~255 的的

数字或字符。数字或字符。 DCBDCB伪指令也可以用“伪指令也可以用“ =”=” 来代替。来代替。

Page 82: 项目二、    掌握开发嵌入式系统的必备知识

(( 22 )、)、 DCWDCW 或或 DCWUDCWU伪指令伪指令

格式:标号 格式:标号 DCWDCW 或或 DCWU DCWU 表达式表达式

功能:用于分配一片连续的半字存储单元并用伪指令中表功能:用于分配一片连续的半字存储单元并用伪指令中表

达式的值进行初始化。表达式为程序标号或数字表达式。达式的值进行初始化。表达式为程序标号或数字表达式。

DCWDCW与与 DCWUDCWU伪指令的区别在于伪指令的区别在于 DCWDCW 分配的存储单分配的存储单

元严格按半字对齐,而元严格按半字对齐,而 DCWUDCWU 并不严格按半字对齐。并不严格按半字对齐。

Page 83: 项目二、    掌握开发嵌入式系统的必备知识

(( 33 )、)、 DCDDCD 或或 DCDUDCDU伪指令伪指令

格式:标号 格式:标号 DCDDCD 或或 DCDU DCDU 表达式表达式

功能:用于分配一片连续的字存储单元并用表达功能:用于分配一片连续的字存储单元并用表达

式的值进行初始化。式的值进行初始化。 DCDDCD伪指令严格按字对齐,伪指令严格按字对齐,

而而 DCDUDCDU 并不严格按字对齐。并不严格按字对齐。 DCDDCD伪指令可以伪指令可以

用“用“ &”&”代替。代替。

Page 84: 项目二、    掌握开发嵌入式系统的必备知识

(( 44 )、)、 DCFDDCFD 或或 DCFDUDCFDU伪指令伪指令

格式:标号 格式:标号 DCFDDCFD 或或 DCFDU DCFDU 表达式表达式

功能:用于为双精度浮点数分配一片连续的字存功能:用于为双精度浮点数分配一片连续的字存

储单元并用表达式的值进行初始化。每个双精度储单元并用表达式的值进行初始化。每个双精度

浮点数占用浮点数占用 22 个字存储单元。个字存储单元。 DCFDDCFD严格按字对严格按字对

齐,而齐,而 DCFDUDCFDU 并不严格按字对齐。并不严格按字对齐。

Page 85: 项目二、    掌握开发嵌入式系统的必备知识

(( 55 )、)、 DCFSDCFS 或或 DCFSUDCFSU伪指令伪指令

格式:标号 格式:标号 DCFSDCFS 或或 DCFSU DCFSU 表达式表达式

功能:用于为单精度浮点数分配一片连续的字存功能:用于为单精度浮点数分配一片连续的字存

储单元并用表达式的值进行初始化。一个单精度储单元并用表达式的值进行初始化。一个单精度

数占用一个字存储单元。数占用一个字存储单元。 DCFSDCFS严格按字对齐,严格按字对齐,

而而 DCFSUDCFSU 并不严格按字对齐。并不严格按字对齐。

Page 86: 项目二、    掌握开发嵌入式系统的必备知识

(( 66 )、)、 DCQDCQ 或或 DCQUDCQU伪指令伪指令

格式:标号 格式:标号 DCQDCQ 或或 DCQU DCQU 表达式表达式

功能:用于分配一片以功能:用于分配一片以 88 个字节为单位的连续存个字节为单位的连续存

储区域并用表达式的值进行初始化。储区域并用表达式的值进行初始化。 DCQDCQ严格严格

按字对齐,而按字对齐,而 DCQUDCQU 并不严格按字对齐。并不严格按字对齐。

Page 87: 项目二、    掌握开发嵌入式系统的必备知识

(( 77 )、)、 MAPMAP伪指令或“伪指令或“ ^”^”

格式:格式: MAP MAP 表达式表达式 {,{, 基址寄存器基址寄存器 }}

功能:用于定义一个结构化的内存表的起始地址。功能:用于定义一个结构化的内存表的起始地址。

省略基址寄存器时表达式的值即为内存表的首地省略基址寄存器时表达式的值即为内存表的首地

址,有时内存表的首地址为表达式的值与基址寄址,有时内存表的首地址为表达式的值与基址寄

存器的和。存器的和。

Page 88: 项目二、    掌握开发嵌入式系统的必备知识

(( 88 )、)、 FIELDFIELD 伪指令或“伪指令或“ #”#”

格式:标号 格式:标号 FIELD FIELD 表达式表达式

功能:用于定义一个结构化的内存表的数功能:用于定义一个结构化的内存表的数

据域,表达式的值为当前数据域在内存表据域,表达式的值为当前数据域在内存表

中所占的字节数。常和中所占的字节数。常和 MAPMAP 一起使用一起使用

Page 89: 项目二、    掌握开发嵌入式系统的必备知识

(( 99 )、)、 SPACESPACE伪指令或“伪指令或“ %”%”

格式:标号 格式:标号 SPACE SPACE 表达式表达式

功能:用于一片连续功能:用于一片连续 nn (( nn 为表达式的值)个字为表达式的值)个字

节的存储区域并初始化为节的存储区域并初始化为 00 。。

(( 1010 )、)、 LTORGLTORG伪指令伪指令

格式:格式: LTORGLTORG

功能:用于声明一个数据缓冲池的开始。功能:用于声明一个数据缓冲池的开始。

Page 90: 项目二、    掌握开发嵌入式系统的必备知识

33 )、汇编控制伪指令)、汇编控制伪指令

汇编控制伪指令用于控制汇编程序的执行流程。常用汇编控制伪指令有汇编控制伪指令用于控制汇编程序的执行流程。常用汇编控制伪指令有 IF……EIF……E

LSE……ENDIFLSE……ENDIF 、、 WHILE……WENDWHILE……WEND 两个。两个。

11 、、 IF……ELSE……ENDIFIF……ELSE……ENDIF伪指令伪指令

格式:格式: IF IF 表达式表达式

语句组语句组 11

ELSEELSE

语句组语句组 22

ENDIFENDIF

功能:如果表达式的值为真,则执行语句组功能:如果表达式的值为真,则执行语句组 11 ,否则执行语句组,否则执行语句组 22 ,然后从,然后从 ENEN

DIFDIF 出口。在该伪指令的一次执行过程中语句组出口。在该伪指令的一次执行过程中语句组 11 和语句组和语句组 22 只能执行其中只能执行其中

的一个,该伪指令还可嵌套使用。的一个,该伪指令还可嵌套使用。

Page 91: 项目二、    掌握开发嵌入式系统的必备知识

22 、、 WHILE……WENDWHILE……WEND 伪指令伪指令 格式:格式: WHILE WHILE 表达式表达式 语句组语句组 WENDWEND 功能:功能:

当表达式的值为真时,则循环执行语当表达式的值为真时,则循环执行语句组,直到表达式为假时结束。句组,直到表达式为假时结束。

Page 92: 项目二、    掌握开发嵌入式系统的必备知识

55 )、其他常用伪指令)、其他常用伪指令

(( 11 )、)、 EQUEQU伪指令伪指令

格式:名称 格式:名称 EQU EQU 表达式表达式 {{ ,类型,类型 }}

功能:为程序中的标号、数字常量等定义一个等效功能:为程序中的标号、数字常量等定义一个等效

的名称。该伪指令也可以用“的名称。该伪指令也可以用“ *”*”代替。代替。

Page 93: 项目二、    掌握开发嵌入式系统的必备知识

(( 22 )、)、 CODE32CODE32 或或 CODE16CODE16 伪指令伪指令

格式:格式: CODE32CODE32 或或 CODE16CODE16

功能:功能: CODE32CODE32 伪指令告诉编译器其后的指伪指令告诉编译器其后的指

令为令为 3232 为的为的 ARMARM 指令,而指令,而 CODE16CODE16 则告则告

诉编译器其后的指令为诉编译器其后的指令为 1616 为的为的 ThumbThumb 指指

令令

Page 94: 项目二、    掌握开发嵌入式系统的必备知识

(( 33 )、)、 AREAAREA伪指令伪指令

格式:格式: ARER ARER 段名,属性段名,属性 11 ,属性,属性 22

功能:用于定义一个代码段或数据段,并指定段的属性。其功能:用于定义一个代码段或数据段,并指定段的属性。其

中段名若以数字开头,则该段名要用一对“中段名若以数字开头,则该段名要用一对“ |”|” 括起来。括起来。

段名、属性之间用逗号分隔。属性段名、属性之间用逗号分隔。属性 11 可取值为可取值为 CODECODE 、、

DATADATA 、、 CODEEFCODEEF 、、 COMMONCOMMON ;属性;属性 22 可取值为可取值为 ReRe

adonlyadonly 、、 ReadWriteReadWrite 、、 AlignAlign 等,每个属性的含义叙述等,每个属性的含义叙述

如下:如下:

Page 95: 项目二、    掌握开发嵌入式系统的必备知识

CODECODE :定义一个代码段,代码段的默认属性为:定义一个代码段,代码段的默认属性为 READONLYREADONLY 。。

DATADATA :定义一个数据段,数据段的默认属性为:定义一个数据段,数据段的默认属性为 READWRITEREADWRITE 。。

CODEEFCODEEF :定义一个通用段,该段可以包含代码或数据,在一个源文件中同名:定义一个通用段,该段可以包含代码或数据,在一个源文件中同名

的的 CODEEFCODEEF段必须相同段必须相同

COMMONCOMMON :定义一个通用段,该段不包含任何用户数据和代码,链接器将其:定义一个通用段,该段不包含任何用户数据和代码,链接器将其

初始化为初始化为 00 。在多个源文件中同名的。在多个源文件中同名的 COMOMONCOMOMON段共享同一段内存空间。段共享同一段内存空间。

READONLYREADONLY :只读。:只读。

READWRITEREADWRITE :可读写。:可读写。

ALIGNALIGN :段的对齐方式。:段的对齐方式。

Page 96: 项目二、    掌握开发嵌入式系统的必备知识

(( 44 )、)、 ENTRYENTRY伪指令伪指令

格式:格式: ENTRYENTRY

功能:用于指定一个程序的入口点。在一个完整的功能:用于指定一个程序的入口点。在一个完整的

程序中有且仅有一个入口点。程序中有且仅有一个入口点。

(( 55 )、)、 ENDEND伪指令伪指令

格式:格式: ENDEND

功能:指定一个程序的结束。功能:指定一个程序的结束。

Page 97: 项目二、    掌握开发嵌入式系统的必备知识

(( 66 )、)、 EXPORTEXPORT 或或 GLOBAL=GLOBLGLOBAL=GLOBL伪指令伪指令

格式:格式: EXPORTEXPORT 或或 GLOBAL GLOBAL 标号标号 {[weak]}{[weak]}

功能:用于在程序中声明一个全局标号,并且该标功能:用于在程序中声明一个全局标号,并且该标

号可以被其他的文件引用。注意标号在程序中要号可以被其他的文件引用。注意标号在程序中要

区分大小写;区分大小写; [weak][weak] 选项声明其他的同名标号优选项声明其他的同名标号优

先于该标号被引用。先于该标号被引用。

Page 98: 项目二、    掌握开发嵌入式系统的必备知识

(( 77 )、)、 EXTERNEXTERN 伪指令伪指令

格式:格式: EXTERN EXTERN 标号标号 {[weak]}{[weak]}

功能:用于告诉编译器要使用的标号在其他源文件中已定功能:用于告诉编译器要使用的标号在其他源文件中已定

义,且要在当前文件中引用,但是如果当前源文件并没有义,且要在当前文件中引用,但是如果当前源文件并没有

实际引用该标号,则该标号不会被加入到当前源文件的符实际引用该标号,则该标号不会被加入到当前源文件的符

号表中。号表中。 [weak][weak] 选项用于表示当所有源文件都没有定义选项用于表示当所有源文件都没有定义

这样一个标号时,编译器并不给出出错信息。这样一个标号时,编译器并不给出出错信息。

Page 99: 项目二、    掌握开发嵌入式系统的必备知识

(( 88 )、)、 IMPORTIMPORT伪指令伪指令

格式:格式: IMPORT IMPORT 标号标号 {[weak]}{[weak]}

功能:用于告诉编译器要使用的标号在其他源文件中已定义,功能:用于告诉编译器要使用的标号在其他源文件中已定义,

且要在当前文件中引用,无论当前源文件是否引用该标且要在当前文件中引用,无论当前源文件是否引用该标

号,该标号均会被加入到当前源文件的符号表中。号,该标号均会被加入到当前源文件的符号表中。 [we[we

ak]ak] 选项用于表示当所有源文件都没有定义这样一个标选项用于表示当所有源文件都没有定义这样一个标

号时,编译器并不给出出错信息。号时,编译器并不给出出错信息。

Page 100: 项目二、    掌握开发嵌入式系统的必备知识

(( 99 )、)、 GETGET 或或 INCLUDEINCLUDE 伪指令伪指令

格式:格式: GETGET 或或 INCLUDE INCLUDE 文件名文件名

功能:用于将一个源文件包含到当前源文件功能:用于将一个源文件包含到当前源文件

中,且将被包含的源文件在当前位置进行中,且将被包含的源文件在当前位置进行

汇编处理。汇编处理。

Page 101: 项目二、    掌握开发嵌入式系统的必备知识

(( 1010 )、)、 INCBININCBIN 伪指令伪指令

格式:格式: INCBIN INCBIN 文件名文件名

功能:用于将一个目标文件或者数据文件包含到当前源文件功能:用于将一个目标文件或者数据文件包含到当前源文件

中,且被包含的文件将不被做任何变动地存放在当前源文中,且被包含的文件将不被做任何变动地存放在当前源文

件中,编译器从其后开始进行处理。件中,编译器从其后开始进行处理。

(( 1111 )、)、 RNRN伪指令伪指令

格式:名称 格式:名称 RN RN 寄存器寄存器

功能:用于为一个寄存器起一个别名功能:用于为一个寄存器起一个别名

Page 102: 项目二、    掌握开发嵌入式系统的必备知识

22 ) ) GNU ASGNU AS汇编器所支持的伪指令汇编器所支持的伪指令

ARMARM汇编语言采用不同的汇编器所支持的伪指令有所汇编语言采用不同的汇编器所支持的伪指令有所

区别,在前面介绍了区别,在前面介绍了 ARMASMARMASM汇编器所支持的伪指令,下面汇编器所支持的伪指令,下面

简单介绍简单介绍 GNU ASGNU AS汇编器所支持的伪指令。总体来说,这两汇编器所支持的伪指令。总体来说,这两

种汇编器所支持的伪指令大体相同,只是在书写的格式上有所种汇编器所支持的伪指令大体相同,只是在书写的格式上有所

不同,区别在于不同,区别在于 GNU ASGNU AS汇编器的伪指令都是以“汇编器的伪指令都是以“ .”.” 开头开头

的,其功能基本相同。笔者在教学过程中使用的是的,其功能基本相同。笔者在教学过程中使用的是 Embest IEmbest I

DEDE 集成开发环境,所以在此简单介绍集成开发环境,所以在此简单介绍 GNU ASGNU AS汇编器的常用汇编器的常用

伪指令,其详细信息可参考伪指令,其详细信息可参考 Embest IDEEmbest IDE 所带的电子文档所带的电子文档 propro

gref.chmgref.chm 。 。

Page 103: 项目二、    掌握开发嵌入式系统的必备知识

11 、、 .EQU.EQU伪指令伪指令

格式:格式: .EQU .EQU 名称,表达式名称,表达式

功能:用指定的名称来代表表达式的值。如功能:用指定的名称来代表表达式的值。如 .EQU y.EQU y ,, 2424

表示名称表示名称 yy 的值为的值为 2424 。。

22 、、 .GLOBAL.GLOBAL伪指令伪指令

格式:格式: .GLOBAL .GLOBAL 标号标号

功能:用于定义一个全局标号,且可以被其他源文件引用。功能:用于定义一个全局标号,且可以被其他源文件引用。

Page 104: 项目二、    掌握开发嵌入式系统的必备知识

33 、、 .EXTERN.EXTERN伪指令伪指令

格式:格式: .EXTERN .EXTERN 标号标号

功能:用于告诉编译器要使用的标号在其他源文件功能:用于告诉编译器要使用的标号在其他源文件

中已定义,且要在当前文件中引用。中已定义,且要在当前文件中引用。

44 、、 .TEXT.TEXT伪指令伪指令

格式:格式: .TEXT.TEXT

功能:将该伪指令开始的代码编译到代码段中。功能:将该伪指令开始的代码编译到代码段中。

Page 105: 项目二、    掌握开发嵌入式系统的必备知识

55 、、 .END.END

格式:格式: .END.END

功能:告诉编译器汇编程序的结束,其后的代码将不再被处功能:告诉编译器汇编程序的结束,其后的代码将不再被处

理。理。

66 、、 .ITORG.ITORG伪指令伪指令

格式:格式: .ITORG.ITORG

功能:用于在当前文件的当前地址产生一个文字池。功能:用于在当前文件的当前地址产生一个文字池。

Page 106: 项目二、    掌握开发嵌入式系统的必备知识

77 、、 LDRLDR 伪指令伪指令

格式:格式: LDR LDR 寄存器,寄存器, == 表达式表达式

功能:将给定的表达式的值装入到目标寄存器中。功能:将给定的表达式的值装入到目标寄存器中。

实例:实例:

LDR R0LDR R0 ,, =0x8000=0x8000

88 、、 ADRADR 伪指令伪指令

格式:格式: ADR ADR 寄存器,程序标号寄存器,程序标号

功能:将基于功能:将基于 PCPC 的地址值或基于寄存器的地址值读取到寄存器中。的地址值或基于寄存器的地址值读取到寄存器中。

Page 107: 项目二、    掌握开发嵌入式系统的必备知识

99 、、 .CODE32.CODE32 、、 .CODE16.CODE16 、、 .ARM.ARM 、、 .THUMB.THUMB

伪指令伪指令

格式:格式: .CODE32.CODE32同同 .ARM.ARM 或或 .CODE16.CODE16同同 .THUM.THUM

BB

功能:告诉编译器下面的是功能:告诉编译器下面的是 3232 位的位的 AMRAMR 指令或指令或 11

66 位的位的 THUMBTHUMB 指令。指令。

Page 108: 项目二、    掌握开发嵌入式系统的必备知识

33 ) 汇编语言的语句格式) 汇编语言的语句格式

ARMARM汇编语言的语句格式如下:汇编语言的语句格式如下:

{{标号标号 }{}{ 指令或伪指令指令或伪指令 }{}{ ;注释;注释 }}

注意:在汇编程序中,每条指令的助记符可以全部用大写或注意:在汇编程序中,每条指令的助记符可以全部用大写或

小写,不允许在同一条指令中大小写混用;标号必须满足小写,不允许在同一条指令中大小写混用;标号必须满足

符号的命名规则且必须顶格书写;如果一条语句太长,可符号的命名规则且必须顶格书写;如果一条语句太长,可

将其分为若干行来书写,但要在行的末尾用“将其分为若干行来书写,但要在行的末尾用“ \”\” 符号来符号来

进行续行。进行续行。

Page 109: 项目二、    掌握开发嵌入式系统的必备知识

一、汇编语言中常用的符号一、汇编语言中常用的符号

在汇编程序设计中经常使用各种符号来代替地址、变量、常在汇编程序设计中经常使用各种符号来代替地址、变量、常

量等,以增强程序的可读性。符号可由编程者来决定,但不是任意的,量等,以增强程序的可读性。符号可由编程者来决定,但不是任意的,

符号的命名必须满足以下规则:符号的命名必须满足以下规则:

符号要区分大小写,同名的大小写符号会被认为是两个不同的符号。符号要区分大小写,同名的大小写符号会被认为是两个不同的符号。

自定义的符号不能是系统的关键字或保留字。自定义的符号不能是系统的关键字或保留字。

符号在其作用范围内必须唯一。符号在其作用范围内必须唯一。

符号在一般情况下只能数字、字母、下划线三种符号,除局部标号外符号在一般情况下只能数字、字母、下划线三种符号,除局部标号外

符号不能以数字开头。符号不能以数字开头。

Page 110: 项目二、    掌握开发嵌入式系统的必备知识

11 、变量、变量

变量是指在程序的执行过程中其值是可以改变的量。变量是指在程序的执行过程中其值是可以改变的量。

ARMARM 或或 ThumbThumb汇编程序中的变量只有三种类型:数字汇编程序中的变量只有三种类型:数字

变量、逻辑变量和字符串变量。按作用范围分为全局变量变量、逻辑变量和字符串变量。按作用范围分为全局变量

和局部变量,可用和局部变量,可用 GBLAGBLA 、、 GBLLGBLL 、、 GBLSGBLS 来定义全局来定义全局

变量,用变量,用 LCLALCLA 、、 LCLLLCLL 、、 LCLSLCLS 来定义局部变量。来定义局部变量。

Page 111: 项目二、    掌握开发嵌入式系统的必备知识

22 、常量、常量

常量是指在程序的执行过程中不能被改变的量。常量是指在程序的执行过程中不能被改变的量。 AA

RMRM 或或 ThumbThumb汇编程序支持的常量有数字常量、逻辑常汇编程序支持的常量有数字常量、逻辑常

量和字符串常量。数字常量一般为量和字符串常量。数字常量一般为 3232 位的整数,作无符位的整数,作无符

号数时的取值范围为号数时的取值范围为 0~232-10~232-1 ,作有符号数时的取值范围,作有符号数时的取值范围

为为 -231~231-1-231~231-1 。逻辑常量的取值只有真假两种情况。字。逻辑常量的取值只有真假两种情况。字

符串常量是一个固定的字符串,一般用于程序运行时的提符串常量是一个固定的字符串,一般用于程序运行时的提

示信息。示信息。

Page 112: 项目二、    掌握开发嵌入式系统的必备知识

33 、程序中的变量代换、程序中的变量代换

““$”$” 符号为变量代换操作符,可以用它来符号为变量代换操作符,可以用它来

得到变量的值。如果是逻辑变量或字符串变量则得到变量的值。如果是逻辑变量或字符串变量则

代换为他的取值;如果是数字变量则代换为十六代换为他的取值;如果是数字变量则代换为十六

进制的字符串。如果想得到“进制的字符串。如果想得到“ $”$” 符号,则用符号,则用

““ $$”$$” 实现。实现。

Page 113: 项目二、    掌握开发嵌入式系统的必备知识

44 、程序标号、程序标号

在在 ARMARM汇编程序中,程序标号是一个地址,段内汇编程序中,程序标号是一个地址,段内

标号的地址在汇编时确定,段外标号的地址在链标号的地址在汇编时确定,段外标号的地址在链

接是确定。根据标号的生成方式,程序标号可分接是确定。根据标号的生成方式,程序标号可分

为程序相关标号、寄存器相关标号、绝对地址三为程序相关标号、寄存器相关标号、绝对地址三

种类型。种类型。

Page 114: 项目二、    掌握开发嵌入式系统的必备知识

4 4 ) 汇编程序中的表达式和运算符) 汇编程序中的表达式和运算符在汇编语言的程序设计中经常使用各在汇编语言的程序设计中经常使用各

种表达式,表达式一般由常量、变量及运种表达式,表达式一般由常量、变量及运算符和括号构成。算符和括号构成。 ARMARM 汇编程序中常用的汇编程序中常用的表达式有数字表达式、逻辑表达式和字符表达式有数字表达式、逻辑表达式和字符串表达式。串表达式。

Page 115: 项目二、    掌握开发嵌入式系统的必备知识

11 、数字表达式及运算符、数字表达式及运算符

数字表达式一般由数字常量、数字变量、数数字表达式一般由数字常量、数字变量、数

学运算符和括号组成。数字表达式的值是一个数学运算符和括号组成。数字表达式的值是一个数

字,数学运算符有“字,数学运算符有“ +”+” 、“—”、“、“—”、“ X”X” 、、

““ /”/” 、“、“ MOD”5MOD”5 种,分别表示加、减、乘、种,分别表示加、减、乘、

除、求余。数学运算符的运算规则比较简单,这除、求余。数学运算符的运算规则比较简单,这

里就不再赘述。里就不再赘述。

Page 116: 项目二、    掌握开发嵌入式系统的必备知识

22 、逻辑表达式及运算符、逻辑表达式及运算符

逻辑表达式一般由逻辑量、逻辑运算符和括号构成。逻辑表达式一般由逻辑量、逻辑运算符和括号构成。

逻辑表达式的值是一个逻辑值真或假,其运算符有“逻辑表达式的值是一个逻辑值真或假,其运算符有“ =”=” 、、

““ >”>” 、“、“ <”<” 、“、“ >=”>=” 、“、“ <=”<=” 、“、“ /=”/=” (不等(不等

于)、“于)、“ <>”<>” (不等于)、“(不等于)、“ LAND”LAND” 、“、“ LOR”LOR” 、、

““ LNOT”LNOT” 、“、“ LEOR”LEOR”几种,其运算规则比较简单,几种,其运算规则比较简单,

这里不再赘述。这里不再赘述。

Page 117: 项目二、    掌握开发嵌入式系统的必备知识

33 、字符串表达式及运算符、字符串表达式及运算符

字符串表达式一般由字符串常量、字符串变量、运字符串表达式一般由字符串常量、字符串变量、运

算符和括号构成。编译器所支持的字符串的最大长度为算符和括号构成。编译器所支持的字符串的最大长度为 55

1212 字节,其常用的运算符如下:字节,其常用的运算符如下:

LENLEN 运算符返回给定字符串表达式的长度。如::运算符返回给定字符串表达式的长度。如::

LENLEN :“:“ ABCDEF”ABCDEF” 返回的函数值为返回的函数值为 6.6.

STRSTR运算符将一个数字表达式或逻辑表达式转换为运算符将一个数字表达式或逻辑表达式转换为

一个字符串。对于数字表达式,一个字符串。对于数字表达式, STRSTR运算符将其转换运算符将其转换

Page 118: 项目二、    掌握开发嵌入式系统的必备知识

为一个以十六进制组成的字符串;对于逻辑表达式,为一个以十六进制组成的字符串;对于逻辑表达式, STRSTR 运算符将其转运算符将其转

换为字符串“换为字符串“ T”T” 或“或“ F”F” 。如::。如:: STRSTR :: 125125 的返回值为字符串的返回值为字符串

““ 125”125” ,:,: STRSTR :“:“ 2>3”2>3” 返回值为返回值为 FF 。。

LEFTLEFT运算符返回某个字符串左端的一个子串。如:“运算符返回某个字符串左端的一个子串。如:“ ABCABC

DEFG”DEFG” :: LEFT 4LEFT 4 返回的值为“返回的值为“ ABCD”ABCD” 。。

RIGHTRIGHT 运算符返回某个字符串右端的一个子串。如:“运算符返回某个字符串右端的一个子串。如:“ ABAB

CDEFG”CDEFG” :: RIGHT 4RIGHT 4 返回的值为“返回的值为“ DEFG”DEFG” 。。

CCCC运算符用于将两个字符串连接成一个字符串。如:“运算符用于将两个字符串连接成一个字符串。如:“ ABAB

C”C” :: CC“ EF”CC“ EF” 返回的值为“返回的值为“ ABC EF”ABC EF” 。。

Page 119: 项目二、    掌握开发嵌入式系统的必备知识

44 、其他常用运算符、其他常用运算符

BASEBASE 运算符用于返回基于寄存器的表达式中寄存器的编号,运算符用于返回基于寄存器的表达式中寄存器的编号,

其语法为::其语法为:: INDEXINDEX :与寄存器相关的表达式。:与寄存器相关的表达式。

INDEXINDEX运算符用于返回基于寄存器的表达式中相对其基址寄运算符用于返回基于寄存器的表达式中相对其基址寄

存器的偏移量,其语法为::存器的偏移量,其语法为:: INDEXINDEX :与寄存器相关的表达式。:与寄存器相关的表达式。

?运算符用于返回某代码行所生成的可执行代码的长度。其?运算符用于返回某代码行所生成的可执行代码的长度。其

语法为:?程序标号。语法为:?程序标号。

DEFDEF运算符用于判断是否定义某个符号。其语法为::运算符用于判断是否定义某个符号。其语法为:: DEFDEF ::

符号。符号。

Page 120: 项目二、    掌握开发嵌入式系统的必备知识

2 2 ) 源程序结构) 源程序结构

在在 ARMARM汇编语言程序中以程序段为单位组织代码。段是相汇编语言程序中以程序段为单位组织代码。段是相

对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数

据段,代码段的内容为可执行代码,数据段存放代码运行时所需的数据段,代码段的内容为可执行代码,数据段存放代码运行时所需的数

据。一个汇编程序至少要包含一个代码段,当程序较长时,可以分割据。一个汇编程序至少要包含一个代码段,当程序较长时,可以分割

为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执

行的映像文件。行的映像文件。

Page 121: 项目二、    掌握开发嵌入式系统的必备知识

可执行映像文件通常由以下几部分构成:可执行映像文件通常由以下几部分构成:

一个或多个代码段,代码段的属性为只读一个或多个代码段,代码段的属性为只读

零个或多个数据段,数据段的属性为可读写。数据零个或多个数据段,数据段的属性为可读写。数据

段可以是被初始化的数据段或没有被初始化的数据段。段可以是被初始化的数据段或没有被初始化的数据段。

链接器根据系统默认或用户设定的规则,将各个段链接器根据系统默认或用户设定的规则,将各个段

安排在存储器中的相应位置。因此源程序中段之间的相对安排在存储器中的相应位置。因此源程序中段之间的相对

位置与可执行的映像文件中段的相对位置一般不会相同。位置与可执行的映像文件中段的相对位置一般不会相同。

Page 122: 项目二、    掌握开发嵌入式系统的必备知识

33 ) 嵌入式) 嵌入式 CC语言与汇编语言的混合编程语言与汇编语言的混合编程

(1 ) ATPCS(1 ) ATPCS规则介绍规则介绍

为了使单独编译的为了使单独编译的 CC语言程序和汇编程序语言程序和汇编程序

之间能够相互调用之间能够相互调用 ,,必须为子程序之间的调用规必须为子程序之间的调用规

定一定的规则定一定的规则 .ATPCS.ATPCS就是就是 ARMARM 程序和程序和 THUMTHUM

BB 程序中子程序调用的基本规则。程序中子程序调用的基本规则。

Page 123: 项目二、    掌握开发嵌入式系统的必备知识

一一 .ATPCS.ATPCS 概述概述

ATPCSATPCS规定了一些子程序之间调用的基本规则。这规定了一些子程序之间调用的基本规则。这

些调用规则包括些调用规则包括 ::

支持数据栈限制检查的支持数据栈限制检查的 ATPCS. ATPCS.

支持只读段位置无关的支持只读段位置无关的 ATPCS. ATPCS.

支持可读写段位置无关的支持可读写段位置无关的 ATPCS.ATPCS.

支持支持 ARMARM 程序和程序和 THUMBTHUMB 程序混合使用的程序混合使用的 ATPCS. ATPCS.

处理浮点运算的处理浮点运算的 ATPCSATPCS 。。

Page 124: 项目二、    掌握开发嵌入式系统的必备知识

二二 . . 基本基本 ATPCS...ATPCS...

基本基本 ATPCSATPCS规定了在子程序调用时的一些规定了在子程序调用时的一些

基本规则基本规则 ,, 包括以下三个方面的内容包括以下三个方面的内容 : :

各寄存器的使用规则及其相应的名字各寄存器的使用规则及其相应的名字 ; ;

数据栈的使用规则数据栈的使用规则 ; ;

参数传递的规则参数传递的规则 . .

Page 125: 项目二、    掌握开发嵌入式系统的必备知识

三三 . . 几种特定的几种特定的 ATPCS...ATPCS...

支持数据栈限制检查的支持数据栈限制检查的 ATPCS.ATPCS.

支持只读段位置无关的支持只读段位置无关的 ATPCS...ATPCS...

支持可读写段位置无关的支持可读写段位置无关的 ATPCS...ATPCS...

支持支持 ARMARM 程序和程序和 THUMBTHUMB 程序混合使用的程序混合使用的 ATPATP

CS...CS...

Page 126: 项目二、    掌握开发嵌入式系统的必备知识

(2) C(2) C 和汇编混合编程实例和汇编混合编程实例

在需要在需要 CC 和汇编混合编程时,若汇编代码和汇编混合编程时,若汇编代码

较简单,则可使用直接内嵌汇编的方法混合编程,较简单,则可使用直接内嵌汇编的方法混合编程,

否则,可以将汇编文件以文件的形式加入到项目否则,可以将汇编文件以文件的形式加入到项目

中,通过中,通过 ATPCSATPCS规定与规定与 CC 程序相互调用及访问。程序相互调用及访问。

Page 127: 项目二、    掌握开发嵌入式系统的必备知识

内嵌汇编内嵌汇编

内嵌的汇编指令包括大部分内嵌的汇编指令包括大部分 ARMARM 指指

令和令和 ThumbThumb 指令,但不能直接使用指令,但不能直接使用 CC语语

言的变量定义,数据交换必须通过言的变量定义,数据交换必须通过 ATPCSATPCS

进行。内嵌汇编在形式上表现为独立的函进行。内嵌汇编在形式上表现为独立的函

数体。数体。

Page 128: 项目二、    掌握开发嵌入式系统的必备知识

11 、内嵌汇编指令的语法格式、内嵌汇编指令的语法格式

-asm-asm

{{汇编语句汇编语句 11

汇编语句汇编语句 22

…………

}}

Page 129: 项目二、    掌握开发嵌入式系统的必备知识

22 、内嵌汇编指令的特点、内嵌汇编指令的特点

操作数:可以是寄存器、常量或操作数:可以是寄存器、常量或 CC语言表达式语言表达式

物理存储器:不能直接对物理存储器:不能直接对 PCPC 寄存器赋值;程序寄存器赋值;程序

的跳转只能通过的跳转只能通过 BB 和和 BLBL 指令实现。在程序中尽指令实现。在程序中尽

量不要使用量不要使用 R0-R3R0-R3 ;; R12-R14R12-R14 。。

常量:可以不用“常量:可以不用“ #”#”标识常量标识常量

标号:标号: CC 程序中的标号可被内嵌的汇编语句使用程序中的标号可被内嵌的汇编语句使用

(只有(只有 BB 指令才能使用)指令才能使用)

Page 130: 项目二、    掌握开发嵌入式系统的必备知识

内存单元的分配:都是通过内存单元的分配:都是通过 CC 程序完成的,分配的内存单程序完成的,分配的内存单

元通过变量供内嵌的汇编器使用。元通过变量供内嵌的汇编器使用。

SWISWI 和和 BLBL 指令的使用:除了的正常的操作数外,还必须指令的使用:除了的正常的操作数外,还必须

增加三个可选的寄存器列表:增加三个可选的寄存器列表: 11 )第一个寄存器列表中寄)第一个寄存器列表中寄

存器用于存放输入的操作数存器用于存放输入的操作数 22 )第二个寄存器列表中寄存)第二个寄存器列表中寄存

器用于存放返回的结果器用于存放返回的结果 33 )第三个寄存器列表中寄存器供)第三个寄存器列表中寄存器供

被调用的子程序作为工作寄存器,这些寄存器的内容可能被调用的子程序作为工作寄存器,这些寄存器的内容可能

被调用的子程序破坏。被调用的子程序破坏。

内嵌汇编器不支持内嵌汇编器不支持 LDR\ADR\ADRL\BX\BLXLDR\ADR\ADRL\BX\BLX 指令指令

Page 131: 项目二、    掌握开发嵌入式系统的必备知识

33 、内嵌汇编的注意事项、内嵌汇编的注意事项

必须小心使用寄存器必须小心使用寄存器 R0-R3R0-R3 、、 LRLR 和和 PCPC 。。

不要使用寄存器寻址变量不要使用寄存器寻址变量

Page 132: 项目二、    掌握开发嵌入式系统的必备知识

从汇编程序中访问从汇编程序中访问 CC 程序变量程序变量

在在 CC 程序中声明的全局变量可以被汇编程序通过地程序中声明的全局变量可以被汇编程序通过地

址间接访问。访问方法为:址间接访问。访问方法为:

11 )在汇编程序中用)在汇编程序中用 importimport伪指令声明该全局变量伪指令声明该全局变量

22 )使用)使用 ldrldr 指令读取该全局变量的内存地址指令读取该全局变量的内存地址

33 )根据该数据的类型,使用相应的)根据该数据的类型,使用相应的 ldrldr 指令读取该指令读取该

全局变量的值;使用相应的全局变量的值;使用相应的 strstr 指令修改该全局变量指令修改该全局变量

的值的值

Page 133: 项目二、    掌握开发嵌入式系统的必备知识

CC 程序调用汇编程序程序调用汇编程序

在汇编程序中使用在汇编程序中使用 exportexport 声明本程序声明本程序

可以被其他程序调用,在可以被其他程序调用,在 CC 程序中使用程序中使用 extext

ernern 声明该汇编程序。如:声明该汇编程序。如:

Page 134: 项目二、    掌握开发嵌入式系统的必备知识

汇编调用汇编调用 CC 程序程序

汇编程序的书写要遵守汇编程序的书写要遵守 ATPCSATPCS ,保,保

证程序调用是的参数的正确传递。在汇编证程序调用是的参数的正确传递。在汇编

程序中使用程序中使用 importimport 声明将要调用声明将要调用 CC 程序。程序。