ARM体系结构与编程_第1页
ARM体系结构与编程_第2页
ARM体系结构与编程_第3页
ARM体系结构与编程_第4页
ARM体系结构与编程_第5页
已阅读5页,还剩198页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM体系结构与编程,2020/5/24,内容,ARM概述和分类,ARM指令集和汇编程序设计,ARM体系结构和存储系统,ARM中断和异常处理,第一章ARM概述和分类,2020/5/24,内容,ARM简介,ARM的分类,ARM的命名规则,基于ARM的嵌入式系统概述,2020/5/24,ARM介绍,什么是ARM?,其实,人人都用ARM!,什么是ARM,ARM是一个公司的名字ARM代表一项技术,即AdvancedRISCMachineARM是一个内核,而不是我们看到的具体的芯片,ARM发展的历程,第一片ARM处理器是1983年10月到1985年4月间在位于英国剑桥的AcornComputer公司开发1990年,为广泛推广ARM技术而成立了独立的公司AdvanceRISCMachine(ARM)主要设计ARM系列RISC处理器内核授权ARM内核给生产和销售半导体的合作伙伴ARM公司不生产芯片IP(IntelligenceProperty)另外也提供基于ARM架构的开发设计技术软件工具,评估板,调试工具,应用软件,总线架构,外围设备单元,等等20世纪90年代,ARM快速进入世界市场。,ARMOfficesWorldwide,800+雇员全球,EnglandCambridge,Maidenhead,Sheffield,BlackburnGermanyMunichFranceParis,SophiaAntipolisKoreaSeoul,USSeattle,LosGatos,WalnutCreek,Austin,Boston,SanDiegoChinaTaiwanandShanghaiJapanShin-Yokohama(Tokyo),ARMPartnershipModel,2020/5/24,ARM的应用,2020/5/24,ARM分类,基于指令集体系结构(构架ISA)的分类ARMV1体系是最初版本,只有26位的寻址空间,没有乘法指令,最终没有商业化ARMV2体系与V1体系同为26位寻址空间,具有乘法和加法指令,支持协处理器ARMV3体系的寻址范围扩展到32位,具有乘法和加法指令,支持协处理器ARMV4体系增加了半字存储操作,对调试的支持以及支持嵌入的ICEARMV5体系增加了DSP指令支持和对Java指令的支持ARMV6体系增加了媒体指令,ARMv6指令集合中加入了超过60条SIMD单指令多数据指令ARMV7体系定义了三种独立的内核型A(应用领域),R(实时领域),M(控制领域),2020/5/24,ARM系列处理器,基于处理器内核的分类ARM7系列ARM9系列ARM9E系列ARM10E系列SecurCore系列StrongARM/Xscale(Intel)ARM11,2020/5/24,ARM命名举例,2020/5/24,ARM体系的变种,1)Thumb指令集(T变种)Thumb指令集是把32位的ARM指令集的一个子集重新编码后而形成的一个特殊的16位的指令集2)长乘指令(M变种)长乘指令是一种生成64位相乘结果的乘法指令(此指令为ARM指令),M变种增加了两条长乘指令3)增强型DSP指令(E变种)E变种的ARM体系增加了一些增强处理器对典型的DSP算法处理能力的附加指令。4)Java加速器Jazelle(J变种)ARM的Jazelle技术是Java语言和先进的32位RISC芯片完美结合的产物。5)ARM媒体功能扩展(SIMD变种),2020/5/24,ARM的命名规则,ARM的命名分成两类:基于ARMArchitecture的版本命名规则;基于ARMArchitecture版本的处理器系列命名规则。举个例子,s3c2410采用ARMv4T架构版本,ARM920T处理器系列,其中处理器核为ARM9TDMI。,2020/5/24,基于ARMArchitecture的版本命名,规则:|ARMv|n|variants|x(variants)|分成四个组成部分:ARMv-固定字符,即ARMVersionn-指令集版本号。迄今为之,ARM架构版本发布了7个系列,所以n=1:7。其中最新的版本是第7版variants-变种。x(variants)-排除x后指定的变种常见的变种有:T-Thumb指令集M-长乘法指令E-增强型DSP指令J-Java加速器JazelleSIMD-ARM媒体功能扩展例如,ARMv5TxM表示ARM指令集版本为5,支持T变种,不支持M变种,2020/5/24,基于ARMArchitecture版本的处理器系列命名,采用上述的架构,形成一系列的处理器。有时候还要区分处理器核和处理器系列。不过,在这里其实不用区分太细,毕竟这是功能的小部分的变化,核心是相同的。规则:ARMxyzTDMIEJF-Sx-处理器系列y-存储管理/保护单元z-cacheT-支持Thumb指令集D-支持片上调试M-支持快速乘法器I-支持EmbeddedICE,支持嵌入式跟踪调试E-支持增强型DSP指令J-支持JazelleF-具备向量浮点单元VFP-S-可综合版本,2020/5/24,基于ARM的嵌入式系统概述,(1)RISC设计思想与CISC相比,有以下几个方面不同:a:设计重点不同,RISC重点在于通过软件的灵活降低硬件执行指令的复杂度,即使得编译器更高的复杂性b:指令集,RISC减少了指令种类,操作也简单,基本是一个周期执行一条指令,每一条指令长度是固定,而CISC指令长度不固定,执行也需要多个周期c:寄存器,RISC拥有更多寄存器,都可以存放数据或地址,而CISC都是用于特定目的的专用寄存器d:load-store结构,即处理器只处理寄存器中的数据,独立的load-store指令完成数据在寄存器和外部存储器之间的传送,即数据处理与存储器访问分开,而CISC能够直接处理存取器中的数据注:ARM指令集属于RISC指令集,但与单纯的RISC有以下几方面不同,2020/5/24,基于ARM的嵌入式系统概述,ARM指令集属于RISC指令集,但与单纯的RISC有以下几方面不同:a:大部分ARM指令是单周期完成的,但也有不是的,如多寄存器的load-store指令的执行周期是不确定的,具体由被传送的寄存器个数决定。b:内嵌桶型移位寄存器c:Thumb16位指令集d:条件执行e:增强指令,如添加了强大的数字信号处理器(DSP)指令,以支持1616位乘法操作及饱和操作,2020/5/24,基于ARM的嵌入式系统概述,(2)高速缓存(cache)1、为什么采用高速缓存微处理器的时钟频率比内存速度提高快得多,高速缓存可以提高内存的平均性能。2、高速缓存的工作原理高速缓存是一种小型、快速的存储器,它保存部分主存内容的拷贝。,CPU,高速缓存控制器,CACHE,主存,数据,数据,地址,2020/5/24,基于ARM的嵌入式系统概述,(3)嵌入式处理器分类,微处理器(MicroProcessorUnit,MPU)微控制器(MicroControllerUnit,MCU)嵌入式DSP(DigitalSignalProcessor,DSP)片上系统(SystemOnChip),嵌入式微处理器,嵌入式微处理器的基础是通用计算机中的CPU。在应用中,将微处理器装配在专门设计的电路板上,只保留和嵌入式应用有关的母板功能,这样可以大幅度减小系统体积和功耗。为满嵌入式应用的特殊要求,嵌入式微处理器虽然在功能上和标准微处理器基本是一样的,但在工作温度、抗电磁干扰、可靠性等方面都做了各种增强。,目前主要的嵌入式处理器类型有Am186/88、386EX、SC-400、PowerPC、68000、MIPS、ARM/StrongARM系列等,嵌入式微处理器,嵌入式微控制器,嵌入式微控制器又称单片机,顾名思义,就是将整个计算机系统集成到一块芯片中。嵌入式微控制器一般以某一种微处理器内核为核心,芯片内部集成ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A、FlashRAM、EEPROM等各种必要功能和外设。为适应不同的应用需求,一般一个系列的单片机具有多种衍生产品,每种衍生产品的处理器内核都是一样的,不同的是存储器和外设的配置及封装。这样可以使单片机最大限度地和应用需求相匹配,功能不多不少,从而减少功耗和成本。和嵌入式微处理器相比,微控制器的最大特点是单片化,体积大大减小,从而使功耗和成本下降、可靠性提高。微控制器是目前嵌入式系统工业的主流。微控制器的片上外设资源一般比较丰富,适合于控制,因此称微控制器。,嵌入式微控制器,嵌入式微控制器目前的品种和数量最多,比较有代表性的通用系列包括8051、P51XA、MCS-251、MCS-96/196/296、C166/167、MC68HC05/11/12/16、68300等。另外还有许多半通用系列如:支持USB接口的MCU8XC930/931、C540、C541;支持I2C、CAN-Bus、LCD及众多专用MCU和兼容系列。目前MCU占嵌入式系统约70的市场份额。,嵌入式DSP处理器,DSP处理器对系统结构和指令进行了特殊设计,使其适合于执行DSP算法,编译效率较高,指令执行速度也较高。在数字滤波、FFT、谱分析等方面DSP算法正在大量进入嵌入式领域,DSP应用正从在通用单片机中以普通指令实现DSP功能,过渡到采用嵌入式DSP处理器。嵌入式DSP处理器有两个发展来源,一是DSP处理器经过单片化、EMC改造、增加片上外设成为嵌入式DSP处理器,TI的TMS320C2000/C5000等属于此范畴;二是在通用单片机或SOC中增加DSP协处理器,例如Intel的MCS-296和Infineon(Siemens)的TriCore。推动嵌入式DSP处理器发展的另一个因素是嵌入式系统的智能化,例如各种带有智能逻辑的消费类产品,生物信息识别终端,带有加解密算法的键盘,ADSL接入、实时语音压解系统,虚拟现实显示等。这类智能化算法一般都是运算量较大,特别是向量运算、指针线性寻址等较多,而这些正是DSP处理器的长处所在。,嵌入式DSP处理器,有代表性的产品是TexasInstruments的TMS320系列和Motorola的DSP56000系列。TMS320系列处理器包括用于控制的C2000系列,移动通信的C5000系列,以及性能更高的C6000和C8000系列。Motorola公司的DSP56000已经发展成为DSP56000,DSP56100,DSP56200和DSP56300等几个不同系列的处理器。PHILIPS公司也推出了基于可重置嵌入式DSP结构低成本、低功耗技术上制造的DSP处理器,特点是具备双Harvard结构和双乘/累加器单元,应用目标是大批量消费类电子产品。,随着EDI的推广和VLSI设计的普及化,及半导体工艺的迅速发展,在一个硅片上实现一个更为复杂的系统的时代已来临,这就是SystemOnChip(SOC)。各种通用处理器内核将作为SOC设计公司的标准库,和许多其它嵌入式系统外设一样,成为VLSI设计中一种标准的器件,用标准的VHDL等语言描述,存储在器件库中。用户只需定义出其整个应用系统,仿真通过后就可以将设计图交给半导体工厂制作样品。这样除个别无法集成的器件以外,整个嵌入式系统大部分均可集成到一块或几块芯片中去,应用系统电路板将变得很简洁,对于减小体积和功耗、提高可靠性非常有利。它结合了许多功能区块,将功能做在一个芯片上,ARMRISC、MIPSRISC、DSP或是其他的微处理器核心,加上通信的接口单元,例如通用串行端口(USB)、TCP/IP通信单元、GPRS通信接口、GSM通信接口、IEEE1394、蓝牙模块接口等等,这些单元以往都是依照各单元的功能做成一个个独立的处理芯片。,嵌入式片上系统(SoC),2020/5/24,基于ARM的嵌入式系统概述,(4)嵌入式系统硬件,总线,(4)嵌入式系统硬件微处理器(CPU)是嵌入式系统硬件平台的核心构件,但不是全部。按照冯诺依曼体系结构思想,计算机的硬件是由CPU、存储器和I/O设备三部分组成的。总线是把CPU与存储器、I/O设备相连接的信息通道,但总线并不仅仅指的是一束信号线,而应包含相应的通信协议。按照使用场合的不同,总线分成芯片级总线(CPU总线)、板卡级总线(内总线)和系统级总线(外总线)。,总线和总线桥,2020/5/24,基于ARM的嵌入式系统概述,(4)嵌入式系统硬件AMBA总线是一个多总线系统。规范定义了三种可以组合使用的不同类型的总线:AHB(AdvancedHigh-performanceBus)、ASB(AdvancedSystemBus)和APB(AdvancedPeripheralBus)。AHB:CPU核、存储器控制器、中断控制器、LCD控制器、DMA和USB主机模块等(可以包括多个主模块)APB:WATCHDOG、IIS、IIC、PWM、ADC、UART、GPIO、RTC等(只有一个主模块)ASB:连接高性能系统模块,在某些需高速且不必使用AHB总线的场合使用,2020/5/24,基于ARM的嵌入式系统概述,(5)嵌入式存储器大多数嵌入式产品的存储器结构是分层的,即多种类型的存储器在决定存储器层次、宽度、类型等特性时,需综合考虑产品的价格、性能、功耗等因素,存储器系统,寄存器,高速缓存SRAM,主存储器DRAM,本地存储器Flash、ROM、磁盘,网络存储器Flash、ROM、磁盘,时钟周期,0,110,50100,20000000,分层结构,存储器种类,RAM:随机存取存储器SRAM:静态随机存储器(高速存储器或cache)不需刷新电路即能保存内部存储数据。DRAM:动态随机存储器,一般使用电容存储,需经常刷新1)SRAM比DRAM快2)SRAM比DRAM耗电多3)DRAM存储密度比SRAM高得多4)DRAM需要周期性刷新SDRAM:同步动态随机存储器,是DRAM中的一种,因与处理器总线同步,故能突发式地输出到总线ROM:只读存储器,闪速存储器(FLASH),PROM:可编程ROMEPROM:可擦除、可编程ROMEEPROM:电可擦除、可编程ROMFLASH:闪存相对传统的EPROM芯片,这种芯片可以用电气的方法快速地擦写由于快擦写存储器不需要存储电容器,故其集成度更高,制造成本低于DRAM它使用方便,既具有SRAM读写的灵活性和较快的访问速度,又具有ROM在断电后可不丢失信息的特点,所以快擦写存储器技术发展十分迅速FLASH的架构大致上可分为具程序执行能力的NOR架构以及储存数据的NAND架构,NOR技术和NAND技术,NORFlash市场目前由Intel和AMD公司主导,其主要功能是程序的储存,如PC中的BIOSNOR的特点是芯片内执行(XIP,eXecuteInPlace),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在14MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。NANDFlash相对上属于封闭的市场,专利权掌握在少数厂商手中,Toshiba和Samsung公司为主,其主要功能是数据的储存,如小型存储卡、随身电子盘等都是NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理需要特殊的系统接口。,2020/5/24,基于ARM的嵌入式系统概述,(6)初始化启动代码(1)初始化硬件配置(2)诊断(3)引导初始化硬件配置包括:设置堆栈指针、硬件工作时钟、存储器映射等等,I/O寄存器,快速SRAM,大块DRAM,启动ROM,启动之前,I/O寄存器,快速SRAM,大块DRAM,启动ROM,启动之后,2020/5/24,基于ARM的嵌入式系统概述,(6)初始化启动代码诊断硬件是否能正常工作,不能工作的是否隔离,即识别和隔离故障。引导过程包括装载一个映像文件并将控制权交给它,装载可以包括拷贝整个程序(代码和数据),也可以只拷贝易变(volatile)变量的数据到RAM中,启动后,通过更改PC指向映像文件的起始地址,从而交出控制权,ARM的特点,RISC指令集Load/Store体系结构固定的32位指令大多数指令单周期完成Thumb/DSP/jazeller功能扩展低功耗,2020/5/24,小结,什么是ARMARM的特点ARM的分类ARM的命名规则嵌入式硬件体系结构嵌入式存储器存储器映射,第二章ARM体系结构和存储系统,2020/5/24,内容,流水线(pipeline),存储,模式(model),寄存器,2020/5/24,存储,地址空间,ARM结构使用单个平面的232个8位字节地址空间。字节地址按照无符号数排列,从0到2321。地址空间可以看作是包含230个32位字,或231个16位半字。32位地址线/数据线,支持如下数据类型:字节(byte)8bits半字(Halfword)16bits,半字必须对齐2字节边界字(Word)32bits,字必须对齐4字节边界,2020/5/24,存储,ARM处理器可以将存储器中的字以下列格式存储:大端格式(Big-endian):字数据的高字节存储在低地址中,而低字节存储在高地址中小端格式(Little-endian):与小端对齐相反,字数据的高字节存储在高地址中,低字节存储在低地址中,2020/5/24,ARM结构通常希望所有的存储器访问都合理的对齐。具体来说就是字访问的地址通常是字对齐的,而半字访问使用的地址是半字对齐的。不按这种方式对齐的存储器访问称为非对齐的存储器访问。非对齐的取指不可预知结果ARM状态忽略低2位;Thumb状态忽略最低位(忽略由存储器实现)非对齐的数据访问执行结果不可预测忽略字单元地址的低2位;忽略半字单元地址的最低位(忽略可能由处理器或存储器完成),存储,非对齐的存储器访问,指令流水线,为增加处理器指令流的速度,ARM7系列使用3级流水线.允许多个操作同时处理,比逐条指令执行要快。PC指向正被取指的指令,而非正在执行的指令,Fetch,Decode,Execute,从存储器中读取指令,解码指令,寄存器读(从寄存器Bank)移位及ALU操作寄存器写(到寄存器Bank),PCPC,PC-4PC-2,PC-8PC-4,ARMThumb,2020/5/24,处理器状态,处理器状态,ARM处理器包含32位ARM指令集和16位Thumb指令集。因此ARM处理器有两种操作态:ARM状态:32位,这种状态下执行的是字方式的ARM指令;Thumb状态:16位,这种状态下执行半字方式的Thumb指令。,注意:两个状态之间的切换并不影响处理器模式或寄存器内容。,2020/5/24,处理器模式,简介,ARM体系结构支持7种处理器模式,分别为:用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式,如下表所示。这样的好处是可以更好的支持操作系统并提高工作效率。特权模式:除用户模式外的6种模式异常模式:除系统模式外的特权模式,2020/5/24,处理器模式,2020/5/24,内部寄存器,简介,在ARM处理器内部有37个用户可见的寄存器:30个通用寄存器6个状态寄存器1个专用于记录当前状态5个专用于记录模式切换前的状态1个程序计数器PC在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同。,2020/5/24,ARM状态各模式下可以访问的寄存器,2020/5/24,内部寄存器,r0r12:通用寄存器。当C和汇编互相调用时,r0r3用来传递函数参数,可记为a0a3r13:用于各种模式下的堆栈寄存器(sp)r14:用来保存程序返回地址的链接寄存器(lr)r15:程序计数器(pc)r8_FIQr12_FIQ:允许快速中断处理r8_Userr12_User:除了FIQ模式外各模式公用除了User和System模式外,各种模式都有自己独立的r13和r14,2020/5/24,内部寄存器,R14寄存器与子程序调用,MOVPC,LR,R14(地址A),1.程序A执行过程中调用程序B;,操作流程,2.程序跳转至标号Label,执行程序B。同时硬件将“BLLabel”指令的下一条指令所在地址存入R14;,3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;,2020/5/24,内部寄存器,正常操作时,从R15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)。由于ARM指令总是以字为单位,所以R15寄存器的最低两位总是为0。,2020/5/24,程序状态寄存器,简介,ARM内核包含1个CPSR和5个供异常处理程序使用的SPSR。CPSR反映了当前处理器的状态,其包含:4个条件代码标志(负(N)、零(Z)、进位(C)和溢出(V));2个中断禁止位,分别控制一种类型的中断;5个对当前处理器模式进行编码的位;1个用于指示当前执行指令(ARM还是Thumb)的位。,2020/5/24,程序状态寄存器,简介,条件代码标志,保留,控制位,溢出标志,进位或借位扩展,零,负或小于,IRQ禁止,FIQ禁止,状态位,模式位,N,Z,C,V,I,T,F,CPSR寄存器的格式,CPSR模式位设置表,2020/5/24,程序状态寄存器,简介,每个异常模式还带有一个程序状态保存寄存器(SPSR),它用于保存在异常事件发生之前的CPSR。CPSR和SPSR通过特殊指令进行访问。注意:如果通过程序修改CPSR寄存器中的模式位进入异常模式,那么硬件将不会把CPSR保存至SPSR中。,2020/5/24,小结,ARM处理器存储格式指令流水线ARM处理器状态ARM处理器模式SPLRPCCPSRSPSR,第三章ARM指令系统,2020/5/24,内容,ARM指令集,ARM汇编程序设计,ARM处理器寻址,2020/5/24,ARM处理器寻址方式,寻址方式分类,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.块拷贝寻址;9.相对寻址。,2020/5/24,操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0,ARM处理器寻址方式,寻址方式分类寄存器寻址,MOVR1,R2,0 xAA,2020/5/24,立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1;R0减1,结果放入R0,并且影响标志位MOVR0,#0 xFF000;将立即数0 xFF000装入R0寄存器,ARM处理器寻址方式,寻址方式分类立即寻址,MOVR0,#0 xFF00,0 xFF00,从代码中获得数据,2020/5/24,寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,;即是R0=R28ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相;“与”操作,结果放入R1,ARM处理器寻址方式,寻址方式分类寄存器移位寻址,MOVR0,R2,LSL#3,0 x08,0 x08,逻辑左移3位,2020/5/24,指令集介绍,ARM指令集第2个操作数,2020/5/24,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,R2;将R2指向的存储单元的数据读出;保存在R1中SWPR1,R1,R2;将寄存器R1的值和R2指定的存储;单元的内容交换,ARM处理器寻址方式,寻址方式分类寄存器间接寻址,LDRR0,R2,0 xAA,2020/5/24,基址寻址就是将基址寄存器的内容与指令中给出的偏移量(R3,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,简单的ARM程序,;文件名:test.s;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试AREAExample1,CODE,READONLY;声明代码段Example1ENTRY;标识程序入口CODE32;声明32位ARM指令STARTMOVR0,#0;设置参数MOVR1,#10LOOPBLADD_SUB;调用子程序ADD_SUBBLOOP;跳转到LOOPADD_SUBADDSR0,R0,R1;R0=R0+R1MOVPC,LR;子程序返回END;文件结束,2020/5/24,指令集介绍,ARM指令集ARM数据处理指令,数据处理指令大致可分为3类:数据传送指令;算术逻辑运算指令;比较指令。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据传送或算术逻辑运算指令均可选择使用S后缀,以使指令影响CPSR中的标志。,2020/5/24,ARM数据处理指令数据传送,注:当后缀S时,这些指令根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。,2020/5/24,ARM数据处理指令算术运算,注:这些指令影响N,Z,C和V标志位。,2020/5/24,ARM数据处理指令逻辑运算指令,注:当后缀S时,这些指令根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。,2020/5/24,ARM数据处理指令比较指令,注:这些指令影响N,Z,C和V标志位。如:CMNR0,1;测试R0的值是否为1的补码,若是z置位,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,ARM指令的基本格式如下:,指令集介绍,ARM指令集条件码,S,使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。,2020/5/24,指令条件码表,2020/5/24,指令集介绍,ARM指令集条件码,C代码:if(ab)a+;elseb+;,对应的汇编代码:CMPR0,R1;R0(a)与R1(b)比较ADDHIR0,R0,#1;若R0R1,则R0=R0+1ADDLSR1,R1,#1;若R0R1,则R1=R1+1,示例:,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,指令集介绍,ARM指令集乘法指令,ARM具有三种乘法指令,分别为:3232位乘法指令;3232位乘加指令;3232位结果为64位的乘/乘加指令。,2020/5/24,ARM指令乘法指令,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,指令集介绍,ARM指令集分支指令,在ARM中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器赋值实现跳转。分支指令有以下三种:分支指令B;带链接的分支指令BL;带状态切换的分支指令BX。,2020/5/24,ARM指令分支指令,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,指令集介绍,ARM指令集存储器访问指令,ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。存储器访问指令分为:单寄存器操作指令和多寄存器操作指令。,2020/5/24,ARM存储器访问指令单寄存器加载,2020/5/24,ARM存储器访问指令单寄存器存储,2020/5/24,LDR和STR字和无符号字节加载/存储指令LDR指令用于从内存中读取单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:,ARM存储器访问指令单寄存器存储,LDRcondTRd,;将指定地址上的字数据读入RdSTRcondTRd,;将Rd中的字数据存入指定地址LDRcondBTRd,;将指定地址上的字节数据读入RdSTRcondBTRd,;将Rd中的字节数据存入指定地址,2020/5/24,ARM存储器访问指令单寄存器存储,ARM指令集提供了几种存储器寻址的不同方式,这些方式是以下几种变址模式的组合:,注:”!”表示要把计算出的地址回写到基址寄存器,2020/5/24,LDR和STR半字和有符号字节加载/存储指令这类LDR/STR指令可加载有符号半字或字节,可加载/存储无符号半字。偏移量格式、寻址方式与加载/存储字和无符号字节指令相同。,ARM存储器访问指令单寄存器存储,LDRcondSBRd,;将指定地址上的有符号字节读入RdLDRcondSHRd,;将指定地址上的有符号半字读入RdLDRcondHRd,;将指定地址上的半字数据读入RdSTRcondHRd,;将Rd中的半字数据存入指定地址,注意:半字数据加载,寄存器高两个字节置零;字节数据加载,寄存器高三个字节置零,2020/5/24,LDR和STR指令应用示例:1.加载/存储字和无符号字节指令LDRR2,R5;将R5指向地址的字数据存入R2STRR1,R0,#0 x04;将R1的数据存储到R0+0 x04地址LDRBR3,R2,#-1;将R2指向地址的字节数据存入R3,R2R21STRBR0,R3,-R8,ASR2;R0-R3-R8/4,存储R0的最低有效字节2.加载/存储半字和有符号字节指令LDRSBR1,R0,R3;将R0+R3地址上的字节数据存入R1,;高24位用符号扩展LDRHR6,R2,#2;将R2指向地址的半字数据存入R6,高16位用0扩展;读出后,R2=R2+2STRHR1,R0,#2!;将R1的半字数据保存到R0+2地址,;只修改低2字节数据,然后R0=R0+2,ARM存储器访问指令单寄存器存储,2020/5/24,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。,2020/5/24,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令格式如下:LDMcondRn!,reglistSTMcondRn!,reglistcond:指令执行的条件;模式:控制地址的增长方式,一共有8种模式;!:表示在操作结束后,将最后的地址写回Rn中;reglist:表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如R1,R2,R6-R9,寄存器由小到大排列;:可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能:1)若op是LDM且寄存器列表包含R15时,那么除了正常的多寄存器传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异常模式下使用。2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。,2020/5/24,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。,进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储。进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。,2020/5/24,ARM存储器访问指令多寄存器存取,;使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6.LDMIBR0!,R5-R6,;使用堆栈指令进行堆栈操作STMEDR13!,R5-R6.LDMEDR13!,R5-R6,两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。,2020/5/24,ARM存储器访问指令寄存器和存储器交换指令,SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。使用SWP可实现信号量操作。指令格式如下:SWPcondBRd,Rm,Rn其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd用于保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rm与Rd相同,则为寄存器与存储器内容进行互换;Rn为要进行数据交换的存储器地址。注:Rn不能与Rd和Rm相同。,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,指令集介绍,ARM指令集杂项指令,ARM指令集中有三条指令作为杂项指令,在实际应用中这三条指令非常重要。它们如下所示:,2020/5/24,ARM杂项指令软中断指令,SWI指令用于产生SWI异常,使得CPU模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。不影响条件码标志。该指令主要用于用户程序调用操作系统的系统服务,操作系统在SWI异常处理程序中进行相应的系统服务。,SWIcondimmed_24,SWI指令格式,2020/5/24,ARM杂项指令软中断指令,根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法,指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。MOVR0,#34;设置子功能号为34SWI12;调用12号软中断指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其它的通用寄存器传递。MOVR0,#12;调用12号软中断MOVR1,#34;设置子功能号为34SWI0,2020/5/24,ARM杂项指令软中断指令,本示例只有一级软中断,含有二级中断见异常处理,CMPR0,#MaxSWILDRLSPC,PC,R0,LSL#2BSWIOutOfRangeSwitableDCDdo_SWI_0;该服务对应的SWI指令中立即数为0DCDdo_SWI_1;该服务对应的SWI指令中立即数为1.do_SWI_0;服务程序do_SWI_0的代码.LDMFDSP!,R0-R3,R12,PC;从do_SWI_0异常中断返回do_SWI_1;服务程序do_SWI_0的代码,2020/5/24,(1),(2),(3),(4),ARM杂项指令状态寄存器写指令,应用示例1:;子程序:使能IRQ中断ENABLE_IRQMRSR0,CPSRBICR0,R0,#0 x80MSRCPSR_c,R0MOVPC,LR,应用示例2:;子程序:禁止IRQ中断DISABLE_IRQMRSR0,CPSRORRR0,R0,#0 x80MSRCPSR_c,R0MOVPC,LR,1.将CPSR寄存器内容读出到R0;,2.修改对应于CPSR中的I控制位;,3.将修改后的值写回CPSR寄存器的对应控制域;,4.返回上一层函数;,2020/5/24,ARM指令小节目录,1.指令格式2.数据处理指令3.条件码4.乘法指令5.ARM分支指令6.存储器访问指令7.杂项指令8.伪指令,2020/5/24,指令集介绍,ARM伪指令,ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的一条或多条ARM指令所代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。,2020/5/24,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,ADRcondregister,expr,ADR伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-255255;当地址值是字对齐时,其取指范围为-10201020;,2020/5/24,ARM伪指令小范围的地址读取,.ADRR0,Delay.DelayMOVR0,r14.,应用示例(源程序):,.0 x20ADDr0,pc,#0 x3c.0 x64MOVr0,r14.,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,ADR伪指令被汇编成一条指令,2020/5/24,ARM伪指令小范围的地址读取,2020/5/24,ARM伪指令中等范围的地址读取,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,ADRLcondregister,expr,ADRL伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K64K;当地址值是字对齐时,其取指范围为-256K256K;,2020/5/24,ARM伪指令中等范围的地址读取,.ADRLR0,Delay.DelayMOVR0,r14.,应用示例(源程序):,.0X20ADDr0,pc,#0X400X24ADDr0,r0,#0XFF00.0XFF68MOVr0,r14.,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,ADRL伪指令被汇编成两条指令,2020/5/24,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,LDRcondregister,=expr|label_expr,LDR伪指令格式,指令执行的条件码,加载的目标寄存器,基于PC的地址表达式或外部表达式,注意:1.从指令位置到文字池的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。,2020/5/24,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。,应用示例(加载常量):,LDRR2,=0 xFF0;MOVR2,#0 xFF0LDRR0,=0 xFF000000;MOVR0,#0 xFF000000LDRR1,=0 xFFFFFFFE;MVNR1,#0 x1,2020/5/24,ARM伪指令空操作伪指令,NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。NOP可用于延时操作。,NOP,NOP伪指令格式,应用示例(延时子程序):,movR1,#0 x1234DelayNOP;空操作NOPNOPSUBSR1,R1,#1;循环次数减一BNEDelay;如果循环没有结束,跳转Delay继续MOVPC,LR;子程序返回,第四章ARM汇编语言程序设计,2020/5/24,内容,汇编语言程序格式,C、汇编混合编程,伪操作ARM程序与Thumb程序混合使用,2020/5/24,ARM汇编程序格式:ARM汇编语言以段(section)为单位组织源文件,段是相对独立的、具有特定名称的、不可分割的指令或数据序列,段又可以分为代码段和数据段。代码段:存放执行代码数据段:存放代码运行时需要用到的数据一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段使用伪操作AREA定义一个段,AREA伪操作表示了一个段的开始,同时定义了这个段的名称及相关属性。ENTRY伪操作标识了程序执行的第一条指令。一个ARM程序中可以有多个ENTRY,至少要有一个。END伪操作告诉汇编编译器源文件结束。,ARM汇编语言程序格式,2020/5/24,ARM汇编程序中每一行的通用格式为:标号指令|伪操作|伪指令;注解symbolinstruction|directive|pseudo-instruction;comment在ARM汇编语言源程序中,除了标号和注释外,指令、伪指令和伪操作都必须有前导空格,而不能顶格书写。如果每一行的代码太长,可以使用字符“”将其分行书写,并允许有空行。指令、伪操作、伪指令助记符和寄存器名既可以用大写字母,也可以用小写字母,但不能混用。注释从“;”开始,到该行结束为止。,ARM汇编语言程序格式,2020/5/24,ARM汇编程序设计,2020/5/24,常量十进制,如:123,1,0十六进制,如:0 x123,0 xab,0 x7bn_XXX,n表示n进制,从29:XXX是具体的数字符串:由一对双引号及双引

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论