[经济学]第2章 ARM体系结构.ppt_第1页
[经济学]第2章 ARM体系结构.ppt_第2页
[经济学]第2章 ARM体系结构.ppt_第3页
[经济学]第2章 ARM体系结构.ppt_第4页
[经济学]第2章 ARM体系结构.ppt_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

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

文档简介

,提纲,1,3,2,4,5,ARM技术的应用领域及特点,ARM 处理器的寄存器组织,ARM处理器的工作模式,ARM微处理器系列,6,7,第二章 ARM处理器 2.1 ARM处理器简介,ARM 异常处理,ARM处理器的工作状态,ARM处理器的存储器格式,ARMAdvanced RISC Machines,ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。,1、ARM技术的应用领域及特点,1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。,ARM 公司的模式,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。,1、 ARM技术的应用领域及特点,基于ARM技术的微处理器应用约占据了32位RISC微处 理器75以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。,我国的中兴集成电路、大唐电讯、中芯国际和上海华虹,以及国外的一些公司如德州仪器、意法半导体、Philips、Intel、Samsung等都推出了自己设计的基于ARM核的处理器。,ARM微处理器的应用领域,工业控制领域:作为32的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展,ARM微控制器的低功耗、高性价比,向传统的8位/16位微控制器提出了挑战。,1、 ARM技术的应用领域及特点,到目前为止,ARM微处理器及技术的应用已经广泛深入到国民经济的各个领域,ARM微处理器的应用领域,1、 ARM技术的应用领域及特点,网络应用:随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上行了优化,并获得广泛支持,也对DSP的应用领域提出了挑战。,消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。,成像和安全产品:现在流行的数码相机和打印机中绝大部分采用ARM技术。手机中的32位SIM智能卡也采用了ARM技术。,全球80%的GSM/3G手机、99%的CDMA手机以及绝大多数PDA产品均采用ARM体系的嵌入式处理器,ARM微处理器的特点低功耗、低成本、高性能,采用RISC指令集,1、 ARM技术的应用领域及特点,低功耗、低成本、高性能,使用大量的寄存器,ARM/THUMB指令支持,三/五级流水线,ARM微处理器的特点采用RISC体系结构,1、 ARM技术的应用领域及特点,采用RISC架构的ARM处理器一般具有如下特点:,固定长度的指令格式,指令归整、简单、基 本寻址方式有23种;,使用单周期指令,便于流水线操作执行;,大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问存储器,以提高指令的执行效率。,ARM微处理器的特点大量使用寄存器,1、 ARM技术的应用领域及特点,ARM 处理器共有37个寄存器,被分为若干个组,这些寄存器包括:,31个通用寄存器,包括程序计数器(PC 指针),均为32位的寄存器;,6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位。,ARM微处理器的特点高效的指令系统,1、 ARM技术的应用领域及特点,ARM微处理器支持两种指令集:ARM指令集和Thumb指令集。,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省3040以上的存储空间,同时具备32位代码的所有优点。,ARM微处理器的特点其他技术,1、 ARM技术的应用领域及特点,除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗:,所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。,可用加载/存储指令批量传输数据,以提高数据的传输效率。,可在一条数据处理指令中同时完成逻辑处理和移位处理。,在循环处理中使用地址的自动增减来提高运行效率。,ARM微处理器系列,2、ARM微处理器系列,ARM7系列,ARM9系列,ARM9E系列,ARM10E系列,ARM11系列,Intel的Xscale,ARM微处理器的工作状态,3、ARM微处理器的工作状态,从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:,ARM状态,此时处理器执行32位的字对齐的ARM指令;,Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。,ARM与THUMB,THUMB指令是ARM指令的子集,3、 ARM微处理器的工作状态,可以相互调用,只要遵循一定的调用规则,Thumb指令与ARM指令的时间效率和空间效率关系为:,存储空间约为ARM代码的6070,指令数比ARM代码多约3040,存储器为32位时ARM代码比Thumb代码快约40,存储器为16位时Thumb比ARM代码快约4050,使用Thumb代码,存储器的功耗会降低约30,处理器模式,4、 ARM微处理器的工作模式,特权模式,4、 ARM微处理器的工作模式,除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。,4、 ARM微处理器的工作模式,这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。 系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。,17,异常模式,这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。,4、 ARM微处理器的工作模式,ARM微处理器的存储器格式,ARM体系结构所支持的最大寻址空间为4GB(232字节),5、ARM微处理器的存储器格式,ARM体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。,ARM体系结构可以用两种方法存储字数据,称之为大端格式和小端格式,ARM体系结构的存储器格式大端格式,5、 ARM微处理器的存储器格式,在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,ARM体系结构的存储器格式小端格式,5、 ARM微处理器的存储器格式,与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节,21,一个基于ARM内核的芯片可以只支持大端模式或小端模式,也可以两者都支持。通常,小端模式是ARM处理器的默认形式。 在ARM指令集中不包含任何直接选择大小端的指令,但是一个同时支持大小端模式的ARM芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。,注意:如果实际的存储器格式与芯片的存储器格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果。,5、 ARM微处理器的存储器格式,指令长度及数据类型,ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。,5、 ARM微处理器的存储器格式,ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型,其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0) 基于ARM内核的芯片具有许多的外设,这些外设访问的标准方法是使用存储器映射的I/O,为外设的每个寄存器都分配一个地址。通常,从这些地址装载数据用于读入,向这些地址保存数据用于输出。有些地址的装载和保存用于外设的控制功能,而不是输入或输出功能。,寄存器组织,ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。 这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14R0、程序计数器PC、一个或两个状态寄存器都是可访问的。,6、ARM微处理器的寄存器格式,ARM状态下的寄存器组织,通用寄存器:通用寄存器包括R0R15,可以分为三类:,未分组寄存器R0R7,分组寄存器R8R14,程序计数器PC(R15),6、 ARM微处理器的寄存器格式,ARM状态下的寄存器组织,6、 ARM微处理器的寄存器格式,26,ARM状态各模式下的寄存器,所有的37个寄存器,分成两大类: 31个通用32位寄存器; 6个状态寄存器。,27,ARM状态各模式下可以访问的寄存器,28,一般的通用寄存器,在汇编语言中寄存器R0R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。,29,一般的通用寄存器,其中R0R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。,30,一般的通用寄存器,寄存器R8R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器,31,一般的通用寄存器,寄存器R8R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。,32,一般的通用寄存器,寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。,33,堆栈指针寄存器R13(SP),寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中存在使用R13的指令。,34,链接寄存器R14(LR),R14为链接寄存器(LR),在结构上有两个特殊功能: 在每种模式下,模式自身的R14版本用于保存子程序返回地址; 当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。,35,R14(LR)寄存器与子程序调用,MOV PC,LR,R14(地址A),1.程序A执行过程中调用程序B;,操作流程,2.程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14(LR);,3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;,36,程序计数器R15(PC),寄存器R15为程序计数器(PC),它指向正在取指的地址。可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果R15使用的方式超出了这些限制,那么结果将是不可预测的。,37,程序状态寄存器CPSR,寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。,38,条件代码标志,保留,控制位,溢出标志 oVerflow,进位或借位扩展 Carry,零 Zero,负或小于 Negative,IRQ禁止 Interrupt,FIQ禁止 Fast,状态位 Thumb,模式位 Mode,N,Z,C,V,I,T,F,CPSR寄存器的格式,6、 ARM微处理器的寄存器格式,程序状态寄存器的控制位,状态寄存器的低8位(I、F、T和M4:0)称为控制位,发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。,6、 ARM微处理器的寄存器格式,中断禁止位I、F: I=1 禁止IRQ中断; F=1 禁止FIQ中断。,T标志位:该位反映处理器的运行状态 ARM体系结构v5及以上的版本的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态。 ARM体系结构v5及以上的版本的非T系列处理器,当该位为1时,执行下一条指令以引起为定义的指令异常;当该位为0时,表示运行于ARM状态。,运行模式位M4:0是模式位,决定处理器的运行模式,处理器运行模式及可以访问的寄存器,6、 ARM微处理器的寄存器格式,Thumb状态下的寄存器与ARM状态下的寄存器关系图,6、 ARM微处理器的寄存器格式,异常(Exceptions),当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。,7、ARM异常处理,ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断的概念并不完全等同。,ARM体系结构所支持的异常类型,7、ARM异常处理,45,图示进入异常过程,1. 程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断;,用户程序运行时发生IRQ中断,硬件完成以下动作:,置位I位(禁止IRQ中断) 清零T位(进入ARM状态) 设置MOD位,切换处理器模式至IRQ模式,将下一条指令的地址存入IRQ模式的LR寄存器,将CPSR寄存器内容存入IRQ模式的SPSR寄存器,将跳转地址存入PC,实现跳转,BackAddr,JumpAddr,“?”表示对该位不关心,46,在异常处理结束后,异常处理程序完成以下动作:,图示退出异常过程,将SPSR寄存器的值复制回CPSR寄存器;,将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。,BackAddr,JumpAddr,return,BackAddr-4,“?”表示对该位不关心,异常向量表(Exception Vectors),7、 ARM异常处理,异常优先级(Exception Priorities),7、 ARM异常处理,应用程序中的异常处理,当系统运行时,异常可能会随时发生,为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序,当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。 我们需要处理所有的异常,尽管我们可以简单的在某些异常处理程序处放置死循环。,7、 ARM异常处理,50,提纲,1,3,2,ARM 微处理器指令的分类,ARM 微处理器指令的寻址方式,2.2 ARM指令分类及寻址方式,ARM 微处理器指令的条件域,51,ARM微处理器的指令系统,ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM微处理器的指令集可以分为六大类 : 跳转指令 数据处理指令 程序状态寄存器(PSR)处理指令 加载/存储指令 协处理器指令和异常产生指令,ARM微处理器指令的分类,52,ARM微处理器指令表-1,ARM微处理器指令的分类,53,ARM微处理器指令表-2,ARM微处理器指令的分类,54,ARM微处理器指令表-3,ARM微处理器指令的分类,55,ARM微处理器指令表-4,ARM微处理器指令的分类,56,ARM微处理器指令表-5,ARM微处理器指令的分类,57,指令的条件域,当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。,ARM微处理器指令的条件域,58,指令的条件域表-1,ARM微处理器指令的条件域,59,指令的条件域表-2,ARM微处理器指令的条件域,60,ARM指令的寻址方式,ARM指令系统支持如下几种常见的寻址方式: 立即寻址 寄存器寻址 寄存器间接寻址 基址变址寻址 多寄存器寻址 相对寻址 堆栈寻址,ARM微处理器指令的寻址方式,61,立即寻址,立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令: ADD R0,R0,1 /*R0R01*/ ADD R0,R0,0x3f /*R0R00x3f*/ 在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在“”后加上“0x”。,ARM微处理器指令的寻址方式,MOV R0,#0xFF00,0xFF00,从代码中获得数据,62,寄存器寻址,寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令: ADD R0,R1,R2 /*R0R1R2*/ 该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。,ARM微处理器指令的寻址方式,MOV R1,R2,0xAA,63,寄存器间接寻址,寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: ADD R0,R1,R2 /*R0R1R2*/ LDR R0,R1 /*R0R1*/ STR R0,R1 /*R1R0*/ 在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中; 第二条指令将以R1的值为地址的存储器中的数据传送到R0中。 第三条指令将R0的值传送到以R1的值为地址的存储器中。,ARM微处理器指令的寻址方式,LDR R0,R2,0xAA,64,基址变址寻址,基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示: LDR R0,R1,4 ;R0R14 LDR R0,R1,4! ;R0R14、R1R14 LDR R0,R1 ,4 ;R0R1、R1R14 LDR R0,R1,R2 ;R0R1R2 在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。 在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。 在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。 在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。,ARM微处理器指令的寻址方式,LDR R2,R3,#0x0C,0xAA,将R3+0x0C作为地址装载数据,65,多寄存器寻址,采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令: LDMIA R0,R1,R2,R3,R4 ;R1R0 ;R2R04 ;R3R08 ;R4R012 该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1R4。,ARM微处理器指令的寻址方式,LDR R1!,R2-R4,R6,0x40000010,66,相对寻址,与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式: BL NEXT ;跳转到子程序NEXT处执行 NEXT MOV PC,LR ;从子程序返回,ARM微处理器指令的寻址方式,67,堆栈寻址,堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。,ARM微处理器指令的寻址方式,0x12345678,0x12345678,68,当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。,0x12345678,69,堆栈寻址,ARM微处理器指令的寻址方式,所以可以组合出四种类型的堆栈方式: 满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等; 空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。,70,2.3 ARM指令集,1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.ARM分支指令 7.杂项指令,71,1、指令格式,ARM是三地址指令格式,指令的基本格式如下:, S ,其中号内的项是必须的,号内的项是可选的。各项的说明如下:,opcode:指令助记符; cond:执行条件; S:是否影响CPSR寄存器的值; Rd:目标寄存器; Rn:第1个操作数的寄存器; operand2:第2个操作数;,例:,72,灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式: #immed常数表达式; AND R1,R2,#0x0F Rm寄存器方式; SUB R1,R1,R2 Rm , shift寄存器移位方式;,73,桶形移位器,74,桶形移位器操作,75,76,Rm,shift寄存器移位方式 例如: ADD R1,R1,R1,LSL #3 ;R1=R1+R1R3,77,2、条件码,ARM指令的基本格式如下:, S ,使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。 所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行 功能。如果指令不标明条件代码,将默认为无条件(AL)执行。,78,79,C代码: If(a b) a+; Else b+;,对应的汇编代码: CMP R0,R1 ;R0(a)与R1(b)比较 ADDHI R0,R0,#1 ;若R0R1,则R0=R0+1 ADDLS R1,R1,#1 ;若R01,则R1=R1+1,示例:,80,3、存储器访问指令,(1)LDR和STR字和无符号字节加载/存储指令 LDR指令用于从内存中读取单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:,LDRcond Rd, ;将指定地址上的字数据读入Rd STRcond Rd, ;将Rd中的字数据存入指定地址 LDRcondB Rd, ;将指定地址上的字节数据读入Rd STRcondB Rd, ;将Rd中的字节数据存入指定地址,81,(2)LDR和STR半字和有符号字节加载/存储指令 这类LDR/STR指令可加载有符号半字或字节,可加载/存储无符号半字。,LDRcondSB Rd, ;将指定地址上的有符号字节读入Rd LDRcondSH Rd, ;将指定地址上的有符号半字读入Rd LDRcondH Rd, ;将指定地址上的半字数据读入Rd STRcondH Rd, ;将Rd中的半字数据存入指定地址,82,LDR和STR指令应用示例: 1.加载/存储字和无符号字节指令 LDR R2,R5 ;将R5指向地址的字数据存入R2 STR R1,R0,#0x04 ;将R1的数据存储到R0+0x04地址 2.加载/存储半字和有符号字节指令 LDRSB R1,R0,R3 ;将R0+R3地址上的字节数据存入R1, ;高24位用符号扩展 LDRH R6,R2,#2 ;将R2指向地址的半字数据存入R6,高16位用0扩展 ;读出后,R2=R2+2,83,4.数据处理指令,84,注:当后缀S时,这些指令根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。,85,MOV指令将立即数或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。指令格式如下: MOVcondS Rd,operand2 MOV指令举例如下: MOV R11,#0xF000000B ;R1= 0xF000000B MOV R0,R1 ;R0=R1 MOVS R3,R1,LSL #2 ;R3=R12,并影响标志位 MOV PC,LR ;PC=LR,子程序返回,86,MVN指令举例如下: MVN R1,#0xFF ;R1=0xFFFFFF00 MVN R1,R2 ;将R2按位取反,结果存到R1,87,加法运算指令ADD指令将operand2的值与Rn的值相加,结果保存到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 应用示例: ADDS R1,R1,#1020 ;R1=R1+1020,并影响标志位 ADD R1,R1,R2,LSL #2 ;R1=R1+R22,88,减法运算指令SUB指令用寄存器Rn减去operand2,结果保存到Rd中。指令格式如下: SUBcondS Rd,Rn,operand2 应用示例: SUBS R0,R0,#240 ;R0=R0-240 ,并影响标志位 SUBS R2,R1,R2 ;R2=R1-R2 ,并影响标志位,89,逆向减法运算指令RSB指令将operand2的值减去Rn,结果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 应用示例: RSB R3,R1,#0xFF00 ;R3=0xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1=(R22)-R2=R23 影响标志位,90,带进位加法指令ADC将operand2的值与Rn的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。指令格式如下: ADCcondS Rd,Rn,operand2 应用示例(使用ADC实现64位加法,结果存于R1(高32位)、R0中): ADDS R0,R0,R2 ;R0等于低32位相加,并影响标志位 ADC R1,R1,R3 ;R1等于高32位相加,并加上低位进位,91,带进位减法指令SBC用寄存器Rn减去operand2,再减去CPSR中的C条件标志位的非(即若C标志清零,则结果减去1),结果保存到Rd中。指令格式如下: SBCcondS Rd,Rn,operand2 应用示例(使用SBC实现64位减法,结果存于R1、R0中): SUBS R0,R0,R2 ; 低32位相减,并影响标志位 SBC R1,R1,R3 ;高32位相减,并减去低位借位,92,带进位逆向减法指令RSC指令用寄存器operand2减去Rn,再减去CPSR中的C条件标志位,结果保存到Rd中。指令格式如下: RSCcondS Rd,Rn,operand2 应用示例(使用RSC指令实现求64位数值的负数 ): RSBS R2,R0,#0 ;R2=-R0 RSC R3,R1,#0 ;R3=-R1- !Carry,93,逻辑与操作指令AND指令将operand2的值与寄存器Rn的值按位作逻辑“与”操作,结果保存到Rd中。指令格式如下: ANDcondS Rd,Rn,operand2 应用示例: ANDS R0,R0,#0x01 ;R0=R0R2=R1&R3,94,95,逻辑异或操作指令EOR指令将operand2的值与寄存器Rn的值按位作逻辑“异或”操作,结果保存到Rd中。指令格式如下: EORcondS Rd,Rn, operand2 应用示例: EOR R1,R1,#0x0F ;将R1的低4位取反 EOR R2,R1,R0 ;R2=R1R0 EORS R0,R5,#0x01 ; 将R5和0x01进行逻辑异或, ;结果保存到R0,并影响标志位,96,位清除指令BIC指令将寄存器Rn的值与operand2的值的反码按位作逻辑“与”操作,结果保存到Rd中。指令格式如下: BICcondS Rd,Rn, operand2 应用示例: BIC R1,R1,#0x0F ;将R1的低4位清零,其它位不变 BIC R1,R2,R3 ;将R3的反码和R2相逻辑“与”, ;结果保存到R1中,97,比较指令CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位(N/Z/C/V),以便后面的指令根据相应的条件标志来判断是否执行。 CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。指令格式如下: CMPcond Rn, operand2 应用示例: CMP R1,#10 ; R1与10比较,设置相关标志位 CMPGT R1,R2 ; R1与R2比较,设置相关标志位 ;若R110, 则执行本指令,98,负数比较指令CMN指令使用寄存器Rn的值加上operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: CMNcond Rn, operand2 应用示例: CMN R0,#1 ; R0+1,判断R0是否为1的补码 ;如果是,则设置Z标志位,99,位测试指令TST指令将寄存器Rn的值与operand2的值按位作逻辑“与”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: TSTcond Rn, operand2 应用示例: TST R0,#0x01 ; 判断R0的最低位是否为0 TST R1,#0x0F ; 判断R1的低4位是否为0,100,相等测试指令TEQ指令将寄存器Rn的值与operand2的值按位作逻辑“异或”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: TEQcond Rn, operand2 应用示例: TEQ R0,R1 ; 比较R0与R1是否相等 (不影响V位和C位),101,简单的ARM程序,;文件名:TEST1.S ;功能:实现两个寄存器相加 ;说明:使用ARMulate软件仿真调试 AREA Example1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 START MOV R0,#0 ;设置参数 MOV R1,#10 LOOP BL ADD_SUB ;调用子程序ADD_SUB B LOOP ;跳转到LOOP ADD_SUB ADDS R0,R0,R1 ;R0 = R0 + R1 MOV PC,LR ;子程序返回 END ;文件结束,使用“;”进行注释,标号顶格写,实际代码段,声明文件结束,102,简单的ARM程序,;文件名:TEST1.S ;功能:实现两个寄存器相加 ;说明:使用ARMulate软件仿真调试 AREA Example1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 START MOV R0,#0 ;设置参数 MOV R1,#10 LOOP BL ADD_SUB ;调用子程序ADD_SUB B LOOP ;跳转到LOOP ADD_SUB ADDS R0,R0,R1 ;R0 = R0 + R1 MOV PC,LR ;子程序返回 END ;文件结束,103,5、乘法指令,具有三种乘法指令,分别为: 3232位乘法指令; 32 32位乘加指令; 32 32位结果为64位的乘/乘加指令。,104,105,32位乘法指令MUL指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中。 Rd,Rm,Rs不能为R15。只影响CPSR中的N位和Z位,不影响V,C不确定。指令格式如下: MULcondS Rd,Rm,Rs 应用示例: MUL R1,R2,R3 ;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7,影响CPSR中的N位和Z位,106,32位乘加指令MLA指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的低32位保存到Rd中。 Rd,Rm,Rs,Rn不能为R15。只影响CPSR中的N位和Z位,不影响V,C不确定。指令格式如下: MLAcondS Rd,Rm,Rs,Rn 应用示例: MLA R1,R2,R3,R0 ; R1=R2R3+R0,107,64位无符号乘法指令UMULL指令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能为R15。 RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位,标志C和V不确定。指令格式如下: UMULLcondS RdLo,RdHi,Rm,Rs 应用示例: UMULL R0,R1,R5,R8 ; (R1、R0)=R5R8,108,64位无符号乘加指令UMLAL指令将Rm和Rs中的值作无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能为R15。 RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位,标志C和V不确定。指令格式如下: UMLALcondS RdLo,RdHi,Rm,Rs 应用示例: UMLAL R0,R1,R5,R8 ;(R1、R0)=R5R8+(R1、R0),109,64位有符号乘法指令SMULL指令将Rm和Rs中的值作有符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能为R15。 RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位,标志C和V不确定。指令格式如下: SMULLcondS RdLo,RdHi,Rm,Rs 应用示例: SMULL R2,R3,R7,R6 ; (R3、R2)=R7R6,110,64位有符号乘加指令SMLAL指令将Rm和Rs中的值作有符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能为R15。 RdLo/Hi,Rm必须是不同的寄存器。只影响CPSR中的N位和Z位,标志C和V不确定。指令格式如下: SMLALcondS RdLo,RdHi,Rm,Rs 应用示例: SMLAL R2,R3,R7,R6 ; (R3、R2)=R7R6+(R3、R2),111,1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.ARM分支指令 7. 杂项指令,112,6、分支指令,在ARM中有两种方式可以实现程序的跳转。 分支指令有以下两种: 分支指令B; 带链接的分支指令BL;,113,114,分支指令B指令,该指令跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。指令格式如下: Bcond Label 应用示例: B WAITA ; 跳转到WAITA标号处 B 0x1234 ; 跳转到绝对地址0x1234处,115,带链接的分支指令BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR) 连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的32M字节地址内。指令格式如下: BLcond Label,Addr1,Addr2,1.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC),2. 程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行,116,1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.ARM分支指令 7. 杂项指令,117,7、杂项指令,ARM指令集中有三条指令作为杂项指令,在实际应用中这三条指令非常重要。它们如下所示:,118,软中断指令,SWI指令用于产生SWI异常,使得CPU模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。不影响条件码标志。 该指令主要用于用户程序调用操作系统的系统服务,操作系统在SWI异常处理程序中进行相应的系统服务。,SWIcond immed_24,SWI指令格式,SWI指令编码,指令执行的条件码,指令传递的参数(24位立即数,其值为02241)。,119,根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法, 指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。 MOV R0,#34 ;设置子功能号为34 SWI 12 ;调用12号软中断 指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其它的通用寄存器传递。 MOV R0,#12 ;调用12号软中断 MOV R1,#34 ;设置子功能号为34 SWI 0,120,状态寄存器读指令,在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。,MRScond Rd,psr,MRS指令格式,应用示例: MRS R1,CPSR ; 将CPSR状态寄存器读取,保存到R1中 MRS R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中,121,状态寄存器写指令,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。,MSRcond psr_fields,#immed_8r,MSR指令格式1,MSRcond psr_fields,Rm,MSR指令格式2,指令执行的条件码,CPSR或SPSR,指定传送的区域,可以为以下字母(必须小写)的一个或者组合: c 控制域屏蔽字节(psr70) x 扩展域屏蔽字节(psr158) s 状态域屏蔽字节(psr2316) f 标志域屏蔽字节(psr3124),保存要传送到状态寄存器指定域数据的源寄存器,要传送到状态寄存器指定域的立即数,122,(1),(2),(3),(4),在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。,应用示例1: ;子程序:使能IRQ中断 ENABLE_IRQ MRS R0, CPSR BIC R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR,应用示例2: ;子程序:禁能IRQ中断 DISABLE_IRQ MRS R0, CPSR ORR R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR,1.将CPSR寄存器内容读出到R0;,2.修改对应于CPSR中的I控制位;,3.将修改后的值写回 CPSR寄存器的对应控制域;,4.返回上一层函数;,123,2.4 ARM汇编程序设计,由于高级编程语言隐藏了CPU执行指令的许多细节,因此在只关心系统所具有功能的系统中,采用高级语言编写程序更为合适。但是,CPU执行指令的细节差异会反应在系统的非功能特性上,例如系统程序的规模和运行速度。因此,掌握汇编语言程序设计对于嵌入式系统的设计者来说是非常必要的。,124,ARM汇编程序中每一行的通用格式为: 标号 指令|指示符|伪指令 ;注解。 在ARM汇编语言源程序中,除了标号和注释外,指令、伪指令和指示符都必须有前导空格,而不能顶格书写。如果每一行的代码太长,可以使用字符“”将其分行书写,并允许有空行。指令助记符、指示符和寄存器名既可以用大写字母,也可以用小写字母,但不能混用。注释从“;”开始,到该行结束为止。 标号代表一个地址,段内标号的地址值在汇编时确定,段外标号的地址值在链接时确定。,125,AREA Word, CODE, READONLY ; name this block of code num EQU 20 ; Set number of words to be copied ENTRY ; mark the first instruction to call start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy wordcopy LDR r3, r0, #4 ; a word from the

温馨提示

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

评论

0/150

提交评论